diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7e3649a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.env b/.env new file mode 100644 index 0000000..3dc5b7a --- /dev/null +++ b/.env @@ -0,0 +1,6 @@ +# 平台本地运行端口号 +REACT_APP_ENV = dev +API_SERVER = 127.0.0.1:8888 +SERVER_HOST = http://localhost:8888/ +FILE_SERVER_HOST = http://192.168.10.28:8088 +WEBRTC_SERVER_HOST = http://192.168.10.96:9005 diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..3dc5b7a --- /dev/null +++ b/.env.development @@ -0,0 +1,6 @@ +# 平台本地运行端口号 +REACT_APP_ENV = dev +API_SERVER = 127.0.0.1:8888 +SERVER_HOST = http://localhost:8888/ +FILE_SERVER_HOST = http://192.168.10.28:8088 +WEBRTC_SERVER_HOST = http://192.168.10.96:9005 diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..76f4130 --- /dev/null +++ b/.env.production @@ -0,0 +1,5 @@ +REACT_APP_ENV = prod +API_SERVER = 127.0.0.1:8888 +SERVER_HOST = / +FILE_SERVER_HOST = http://192.168.10.96 +WEBRTC_SERVER_HOST = http://192.168.10.96:9005 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..8336e93 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +/lambda/ +/scripts +/config +.history +public +dist +.umi +mock \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..8ffdff8 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + extends: [require.resolve('@umijs/lint/dist/config/eslint')], + globals: { + page: true, + REACT_APP_ENV: true, + SERVER_HOST: true, + }, +}; diff --git a/.gitignore b/.gitignore index a19f004..e0376b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,47 @@ -# ---> Vue -# gitignore template for Vue.js projects -# -# Recommended template: Node.gitignore - # TODO: where does this rule come from? docs/_book # TODO: where does this rule come from? test/ +# dependencies +**/node_modules +# roadhog-api-doc ignore +/src/utils/request-temp.js +_roadhog-api-doc + +# production +/dist +/taskDoc +/src/pages/Demo + +# misc +.DS_Store +npm-debug.log* +yarn-error.log + +/coverage +.idea +yarn.lock +package-lock.json +*bak +.vscode + + +# visual studio code +.history +*.log +functions/* +.temp/** + +# umi +.umi +.umi-production +.umi-test + +# screenshot +screenshot +.firebase +.eslintcache + +build diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..7999ccd --- /dev/null +++ b/.prettierignore @@ -0,0 +1,22 @@ +**/*.svg +.umi +.umi-production +/dist +.dockerignore +.DS_Store +.eslintignore +*.png +*.toml +docker +.editorconfig +Dockerfile* +.gitignore +.prettierignore +LICENSE +.eslintcache +*.lock +yarn-error.log +.history +CNAME +/build +/public diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..3447a1a --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,21 @@ +module.exports = { + singleQuote: true, + trailingComma: 'all', + printWidth: 100, + proseWrap: 'never', + endOfLine: 'lf', + overrides: [ + { + files: '.prettierrc', + options: { + parser: 'json', + }, + }, + { + files: 'document.ejs', + options: { + parser: 'html', + }, + }, + ], +}; diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e91e355 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM circleci/node:latest-browsers + +WORKDIR /usr/src/app + +RUN npm config set registry https://registry.npmmirror.com + +USER root +COPY package.json ./ +RUN yarn +COPY ./ ./ +RUN npm run test:all + +CMD ["npm", "run", "build"] diff --git a/config/config.ts b/config/config.ts new file mode 100644 index 0000000..3fb1056 --- /dev/null +++ b/config/config.ts @@ -0,0 +1,187 @@ +// https://umijs.org/config/ +import { defineConfig } from '@umijs/max'; +import { join } from 'path'; +import defaultSettings from './defaultSettings'; +import proxy from './proxy'; +import routes from './routes'; + +const { REACT_APP_ENV, + API_SERVER, + SERVER_HOST, + FILE_SERVER_HOST, + WEBRTC_SERVER_HOST +} = process.env; +console.log(REACT_APP_ENV) +export default defineConfig({ + /** + * @name 开启 hash 模式 + * @description 让 build 之后的产物包含 hash 后缀。通常用于增量发布和避免浏览器加载缓存。 + * @doc https://umijs.org/docs/api/config#hash + */ + hash: true, + define: { + API_SERVER: API_SERVER, + SERVER_HOST: SERVER_HOST, + FILE_SERVER_HOST: FILE_SERVER_HOST, + WEBRTC_SERVER_HOST: WEBRTC_SERVER_HOST, + }, + /** + * @name 兼容性设置 + * @description 设置 ie11 不一定完美兼容,需要检查自己使用的所有依赖 + * @doc https://umijs.org/docs/api/config#targets + */ + // targets: { + // ie: 11, + // }, + /** + * @name 路由的配置,不在路由中引入的文件不会编译 + * @description 只支持 path,components,routes,redirect,wrappers,title 的配置 + * @doc https://umijs.org/docs/guides/routes + */ + // umi routes: https://umijs.org/docs/routing + routes, + /** + * @name 主题的配置 + * @description 虽然叫主题,但是其实只是 less 的变量设置 + * @doc antd的主题设置 https://ant.design/docs/react/customize-theme-cn + * @doc umi 的theme 配置 https://umijs.org/docs/api/config#theme + */ + theme: { + // 如果不想要 configProvide 动态设置主题需要把这个设置为 default + // 只有设置为 variable, 才能使用 configProvide 动态设置主色调 + 'root-entry-name': 'variable', + + }, + /** + * @name moment 的国际化配置 + * @description 如果对国际化没有要求,打开之后能减少js的包大小 + * @doc https://umijs.org/docs/api/config#ignoremomentlocale + */ + ignoreMomentLocale: true, + /** + * @name 代理配置 + * @description 可以让你的本地服务器代理到你的服务器上,这样你就可以访问服务器的数据了 + * @see 要注意以下 代理只能在本地开发时使用,build 之后就无法使用了。 + * @doc 代理介绍 https://umijs.org/docs/guides/proxy + * @doc 代理配置 https://umijs.org/docs/api/config#proxy + */ + proxy: proxy[REACT_APP_ENV as keyof typeof proxy], + /** + * @name 快速热更新配置 + * @description 一个不错的热更新组件,更新时可以保留 state + */ + fastRefresh: true, + //============== 以下都是max的插件配置 =============== + /** + * @name 数据流插件 + * @@doc https://umijs.org/docs/max/data-flow + */ + model: {}, + /** + * 一个全局的初始数据流,可以用它在插件之间共享数据 + * @description 可以用来存放一些全局的数据,比如用户信息,或者一些全局的状态,全局初始状态在整个 Umi 项目的最开始创建。 + * @doc https://umijs.org/docs/max/data-flow#%E5%85%A8%E5%B1%80%E5%88%9D%E5%A7%8B%E7%8A%B6%E6%80%81 + */ + initialState: {}, + /** + * @name layout 插件 + * @doc https://umijs.org/docs/max/layout-menu + */ + title: 'Ant Design Pro', + layout: { + locale: true, + ...defaultSettings, + }, + /** + * @name moment2dayjs 插件 + * @description 将项目中的 moment 替换为 dayjs + * @doc https://umijs.org/docs/max/moment2dayjs + */ + moment2dayjs: { + preset: 'antd', + plugins: ['duration'], + }, + /** + * @name 国际化插件 + * @doc https://umijs.org/docs/max/i18n + */ + locale: { + // default zh-CN + default: 'zh-CN', + antd: true, + // default true, when it is true, will use `navigator.language` overwrite default + baseNavigator: true, + }, + /** + * @name antd 插件 + * @description 内置了 babel import 插件 + * @doc https://umijs.org/docs/max/antd#antd + */ + antd: {}, + /** + * @name 网络请求配置 + * @description 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。 + * @doc https://umijs.org/docs/max/request + */ + request: {}, + /** + * @name 权限插件 + * @description 基于 initialState 的权限插件,必须先打开 initialState + * @doc https://umijs.org/docs/max/access + */ + access: {}, + + /** + * @name <head> 中额外的 script + * @description 配置 <head> 中额外的 script + */ + headScripts: [ + // 解决首次加载时白屏的问题 + { src: '/scripts/loading.js', async: true }, + ], + //================ pro 插件配置 ================= + presets: ['umi-presets-pro'], + /** + * @name openAPI 插件的配置 + * @description 基于 openapi 的规范生成serve 和mock,能减少很多样板代码 + * @doc https://pro.ant.design/zh-cn/docs/openapi/ + */ + openAPI: [ + // { + // requestLibPath: "import { request } from '@umijs/max'", + // // 或者使用在线的版本 + // // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json" + // schemaPath: join(__dirname, 'oneapi.json'), + // mock: false, + // }, + // { + // requestLibPath: "import { request } from '@umijs/max'", + // schemaPath: 'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json', + // projectName: 'swagger', + // }, + // { + // requestLibPath: "import { request } from '@umijs/max'", + // // 或者使用在线的版本 + // // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json" + // // schemaPath: join(__dirname, 'oneapi.json'), + // schemaPath: 'http://localhost:8888/api/v1/swagger/doc.json', + // mock: false, + // apiPrefix: "'/api/v1'", + // projectName: 'device1', + // }, + // { + // requestLibPath: "import { request } from '@umijs/max'", + // // 或者使用在线的版本 + // // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json" + // // schemaPath: join(__dirname, 'oneapi.json'), + // schemaPath: 'http://127.0.0.1:9000/swagger.json', + // mock: false, + // apiPrefix: "'/api/v1'", + // projectName: 'staff', + // }, + ], + mfsu: { + strategy: 'normal', + }, + requestRecord: {}, +}); diff --git a/config/defaultDrawer.ts b/config/defaultDrawer.ts new file mode 100644 index 0000000..e37bef3 --- /dev/null +++ b/config/defaultDrawer.ts @@ -0,0 +1 @@ +// 待启用 抽屉全局配置 \ No newline at end of file diff --git a/config/defaultForm.ts b/config/defaultForm.ts new file mode 100644 index 0000000..38a51b8 --- /dev/null +++ b/config/defaultForm.ts @@ -0,0 +1,60 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-13 14:19:57 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-22 13:15:04 + * @FilePath: \general-ai-platform-web\config\defaultForm.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE2 + */ + +import { StepsFormProps } from "@ant-design/pro-components"; +import { ReactNode } from "react"; + + +// 通用表单配置 +export const proFormCommonOptions: Record<string,any> = { +} + +const formBoxMargin = 2 * 24 +const formItemGap = 16 +// Small 560 +export const proFormSmallModelWidth: number = 560; +export const proFormSmallItemStyleProps: Record<string, any> = { + width: proFormSmallModelWidth - formBoxMargin, // 一列 + // column2Width: (proFormSmallModelWidth - 2 * formBoxMargin)/2 , // 两列 +}; + +// normal 804 +export const proFormModelWidth: number = 804; +export const proFormItemStyleProps: Record<string, any> = { + width: proFormModelWidth - formBoxMargin, // 一列 + column2Width: (proFormModelWidth - formBoxMargin - formItemGap)/2 , // 两列 +}; + +// max 968 +export const proFormMaxModelWidth: number = 968; +export const proFormMaxItemStyleProps: Record<string, any> = { + width: proFormMaxModelWidth - formBoxMargin, + column2Width: (proFormMaxModelWidth - formBoxMargin - formItemGap)/2 , // 两列 +}; + + +/**表单具体单项配置 */ + + +// proFormList 新增一项按钮配置 +export const proFormListCreatorButtonProps : { + creatorButtonText?: ReactNode; + position?: 'top' | 'bottom'; +} = { + position: 'bottom', + creatorButtonText: '添加参数字段', // 设置新增一项数据的文案 +} + + +// 分步表单统一配置 +export const proFormStepsFormProps: StepsFormProps = { + stepsProps: { + labelPlacement: 'vertical', + } +} \ No newline at end of file diff --git a/config/defaultIcon.ts b/config/defaultIcon.ts new file mode 100644 index 0000000..02d8cb3 --- /dev/null +++ b/config/defaultIcon.ts @@ -0,0 +1,32 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-28 14:13:05 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-28 17:48:37 + * @FilePath: \general-ai-platform-web\config\defaultIcon.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%A + */ + +import { proFormItemStyleProps } from './defaultForm'; + +// 分步表单统一配置 +export const proIconSelectWrapStyle: React.CSSProperties = { + position: 'relative', + width: 290, + background: 'red', + left: 0, +}; + +export const proIconSelectStyle: React.CSSProperties = { + position: 'absolute', + left: '0', + padding: 16, + top: '5%', + width: '94%', + height: 500, + zIndex: 9, + boxShadow: '0px 4px 12px 0px rgba(0, 0, 0, 0.30)', + background: '#fff', + borderRadius: 4, + overflowY: 'scroll', +}; diff --git a/config/defaultSettings.ts b/config/defaultSettings.ts new file mode 100644 index 0000000..b9f611f --- /dev/null +++ b/config/defaultSettings.ts @@ -0,0 +1,35 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-22 10:02:59 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-05 11:09:13 + * @FilePath: \react-adpro-fabric\config\defaultSettings.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { ProLayoutProps } from '@ant-design/pro-components'; + +/** + * @name + */ +const Settings: ProLayoutProps & { + pwa?: boolean; + logo?: string; +} = { + navTheme: 'light', + // 拂晓蓝 + colorPrimary: '#155BD4', + layout: 'mix', + contentWidth: 'Fluid', + fixedHeader: false, + fixSiderbar: true, + colorWeak: false, + title: 'fabric智能AI系统', + pwa: true, + logo: '/my_logo.svg', + iconfontUrl: '', + token: { + // 参见ts声明,demo 见文档,通过token 修改样式 + //https://procomponents.ant.design/components/layout#%E9%80%9A%E8%BF%87-token-%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F + }, +}; +export default Settings; diff --git a/config/defaultTable.ts b/config/defaultTable.ts new file mode 100644 index 0000000..596c2e8 --- /dev/null +++ b/config/defaultTable.ts @@ -0,0 +1,46 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-13 11:32:26 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-21 13:36:39 + * @FilePath: \general-ai-platform-web\config\defaultTable.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { ProColumns } from "@ant-design/pro-components"; +import { PaginationProps } from "antd"; +// 通用列表配置 +export const proTableCommonOptions: Record<string,any> = { + scrollX: 'max-content', // 保证左右侧列的固定,并能保证没列标题不换行 + scrollY: 500, // 保证列表高度固定 + commscrollX: 1300, + commscrollY: 500, // 保证列表高度固定 + searchLabelWidth: 'auto', // 整体对齐,label根据实际字数自适应 +} + +// 操作栏位配置 +export const proTableActionColumnOptions: Record<string,any> = { + dataIndex: 'option', + valueType: 'option', + align: 'center', + fixed: 'right', +} + +// 分页器配置 +export const proTablePaginationOptions: PaginationProps = { + showSizeChanger: true, + // showQuickJumper: true, + showTotal: (total) => `共${total}条`, +} + + + + +// 默认索引列配置 +// export const proTableIndexColumnOptions : ProColumns = { +// title: '序号', +// dataIndex: 'index', +// valueType: 'index', // 增加该属性以添加边框 +// fixed: 'left', // 将该列固定在左侧 +// width: 70, +// align:'center' +// } \ No newline at end of file diff --git a/config/demoRoutes.ts b/config/demoRoutes.ts new file mode 100644 index 0000000..ea7187b --- /dev/null +++ b/config/demoRoutes.ts @@ -0,0 +1,22 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-23 16:05:23 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-23 16:11:53 + * @FilePath: \react-adpro-fabric\config\demoRoutes.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +export const demoRoutes = [ + { + path: '/fabric', + name: 'fabric', + routes: [ + { + name: 'fabricOfReactCavas1', + path: '/fabric/fabricOfReact/cavas1', + component: 'Demo/FabricOfReact/Cavas1', + access: 'canReadMenu', + }, + ] + } +] \ No newline at end of file diff --git a/config/oneapi.json b/config/oneapi.json new file mode 100644 index 0000000..2a14f69 --- /dev/null +++ b/config/oneapi.json @@ -0,0 +1,593 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "Ant Design Pro", + "version": "1.0.0" + }, + "servers": [ + { + "url": "http://localhost:8080/" + }, + { + "url": "https://localhost:8080/" + } + ], + "paths": { + "/api/currentUser": { + "get": { + "tags": ["api"], + "description": "获取当前的用户", + "operationId": "currentUser", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CurrentUser" + } + } + } + }, + "401": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "x-swagger-router-controller": "api" + }, + "/api/login/captcha": { + "post": { + "description": "发送验证码", + "operationId": "getFakeCaptcha", + "tags": ["login"], + "parameters": [ + { + "name": "phone", + "in": "query", + "description": "手机号", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FakeCaptcha" + } + } + } + } + } + } + }, + "/api/login/outLogin": { + "post": { + "description": "登录接口", + "operationId": "outLogin", + "tags": ["login"], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "401": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "x-swagger-router-controller": "api" + }, + "/api/login/account": { + "post": { + "tags": ["login"], + "description": "登录接口", + "operationId": "login", + "requestBody": { + "description": "登录系统", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginParams" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginResult" + } + } + } + }, + "401": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "x-codegen-request-body-name": "body" + }, + "x-swagger-router-controller": "api" + }, + "/api/notices": { + "summary": "getNotices", + "description": "NoticeIconItem", + "get": { + "tags": ["api"], + "operationId": "getNotices", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoticeIconList" + } + } + } + } + } + } + }, + "/api/rule": { + "get": { + "tags": ["rule"], + "description": "获取规则列表", + "operationId": "rule", + "parameters": [ + { + "name": "current", + "in": "query", + "description": "当前的页码", + "schema": { + "type": "number" + } + }, + { + "name": "pageSize", + "in": "query", + "description": "页面的容量", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleList" + } + } + } + }, + "401": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": ["rule"], + "description": "新建规则", + "operationId": "addRule", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleListItem" + } + } + } + }, + "401": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": ["rule"], + "description": "新建规则", + "operationId": "updateRule", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleListItem" + } + } + } + }, + "401": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": ["rule"], + "description": "删除规则", + "operationId": "removeRule", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "401": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "x-swagger-router-controller": "api" + }, + "/swagger": { + "x-swagger-pipe": "swagger_raw" + } + }, + "components": { + "schemas": { + "CurrentUser": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "userid": { + "type": "string" + }, + "email": { + "type": "string" + }, + "signature": { + "type": "string" + }, + "title": { + "type": "string" + }, + "group": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "label": { + "type": "string" + } + } + } + }, + "notifyCount": { + "type": "integer", + "format": "int32" + }, + "unreadCount": { + "type": "integer", + "format": "int32" + }, + "country": { + "type": "string" + }, + "access": { + "type": "string" + }, + "geographic": { + "type": "object", + "properties": { + "province": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "key": { + "type": "string" + } + } + }, + "city": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "key": { + "type": "string" + } + } + } + } + }, + "address": { + "type": "string" + }, + "phone": { + "type": "string" + } + } + }, + "LoginResult": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "type": { + "type": "string" + }, + "currentAuthority": { + "type": "string" + } + } + }, + "PageParams": { + "type": "object", + "properties": { + "current": { + "type": "number" + }, + "pageSize": { + "type": "number" + } + } + }, + "RuleListItem": { + "type": "object", + "properties": { + "key": { + "type": "integer", + "format": "int32" + }, + "disabled": { + "type": "boolean" + }, + "href": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "name": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "desc": { + "type": "string" + }, + "callNo": { + "type": "integer", + "format": "int32" + }, + "status": { + "type": "integer", + "format": "int32" + }, + "updatedAt": { + "type": "string", + "format": "datetime" + }, + "createdAt": { + "type": "string", + "format": "datetime" + }, + "progress": { + "type": "integer", + "format": "int32" + } + } + }, + "RuleList": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RuleListItem" + } + }, + "total": { + "type": "integer", + "description": "列表的内容总数", + "format": "int32" + }, + "success": { + "type": "boolean" + } + } + }, + "FakeCaptcha": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "status": { + "type": "string" + } + } + }, + "LoginParams": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "autoLogin": { + "type": "boolean" + }, + "type": { + "type": "string" + } + } + }, + "ErrorResponse": { + "required": ["errorCode"], + "type": "object", + "properties": { + "errorCode": { + "type": "string", + "description": "业务约定的错误码" + }, + "errorMessage": { + "type": "string", + "description": "业务上的错误信息" + }, + "success": { + "type": "boolean", + "description": "业务上的请求是否成功" + } + } + }, + "NoticeIconList": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NoticeIconItem" + } + }, + "total": { + "type": "integer", + "description": "列表的内容总数", + "format": "int32" + }, + "success": { + "type": "boolean" + } + } + }, + "NoticeIconItemType": { + "title": "NoticeIconItemType", + "description": "已读未读列表的枚举", + "type": "string", + "properties": {}, + "enum": ["notification", "message", "event"] + }, + "NoticeIconItem": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "extra": { + "type": "string", + "format": "any" + }, + "key": { "type": "string" }, + "read": { + "type": "boolean" + }, + "avatar": { + "type": "string" + }, + "title": { + "type": "string" + }, + "status": { + "type": "string" + }, + "datetime": { + "type": "string", + "format": "date" + }, + "description": { + "type": "string" + }, + "type": { + "extensions": { + "x-is-enum": true + }, + "$ref": "#/components/schemas/NoticeIconItemType" + } + } + } + } + } +} diff --git a/config/proxy.ts b/config/proxy.ts new file mode 100644 index 0000000..d8784aa --- /dev/null +++ b/config/proxy.ts @@ -0,0 +1,64 @@ +/** + * @name 代理的配置 + * @see 在生产环境 代理是无法生效的,所以这里没有生产环境的配置 + * ------------------------------- + * The agent cannot take effect in the production environment + * so there is no configuration of the production environment + * For details, please see + * https://pro.ant.design/docs/deploy + * + * @doc https://umijs.org/docs/guides/proxy + */ +export default { + // 如果需要自定义本地开发服务器 请取消注释按需调整 + // dev: { + // // localhost:8000/api/** -> https://preview.pro.ant.design/api/** + // '/api/': { + // // 要代理的地址 + // target: 'https://preview.pro.ant.design', + // // 配置了这个可以从 http 代理到 https + // // 依赖 origin 的功能可能需要这个,比如 cookie + // changeOrigin: true, + // }, + // }, + dev: { + // localhost:8000/api/** -> https://preview.pro.ant.design/api/** + '/api/v1/': { + // 要代理的地址 + target: 'http://192.168.10.96:8888/', + // target: 'https://www.baidu.com', + // 配置了这个可以从 http 代理到 https + // 依赖 origin 的功能可能需要这个,比如 cookie + changeOrigin: true, + secure: false, + }, + // '/video_save_path/': { + // // 要代理的地址 + // target: 'http://192.168.10.96/', + // // target: 'https://www.baidu.com', + // // 配置了这个可以从 http 代理到 https + // // 依赖 origin 的功能可能需要这个,比如 cookie + // changeOrigin: true, + // secure: false, + // }, + }, + /** + * @name 详细的代理配置 + * @doc https://github.com/chimurai/http-proxy-middleware + */ + test: { + // localhost:8000/api/** -> https://preview.pro.ant.design/api/** + '/api/': { + target: 'https://proapi.azurewebsites.net', + changeOrigin: true, + pathRewrite: { '^': '' }, + }, + }, + pre: { + '/api/': { + target: 'your pre url', + changeOrigin: true, + pathRewrite: { '^': '' }, + }, + }, +}; diff --git a/config/routes.ts b/config/routes.ts new file mode 100644 index 0000000..1896675 --- /dev/null +++ b/config/routes.ts @@ -0,0 +1,37 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-22 10:02:59 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-20 14:40:04 + * @FilePath: \react-adpro-fabric\config\routes.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ + +/** + * @name umi 的路由配置 + * @description 只支持 path,components,routes,redirect,wrappers,name,icon 的配置 + * @param path path 只支持两种占位符配置,第一种是动态参数 :id 的形式,第二种是 * 通配符,通配符只能出现路由字符串的最后。 + * @param components 配置 location 和 path 匹配后用于渲染的 React 组件路径。可以是绝对路径,也可以是相对路径,如果是相对路径,会从 src/pages 开始找起。 + * @param routes 配置子路由,通常在需要为多个路径增加 layout 组件时使用。 + * @param redirect 配置路由跳转 + * @param wrappers 配置路由组件的包装组件,通过包装组件可以为当前的路由组件组合进更多的功能。 比如,可以用于路由级别的权限校验 + * @param name 配置路由的标题,默认读取国际化文件 menu.ts 中 menu.xxxx 的值,如配置 name 为 login,则读取 menu.ts 中 menu.login 的取值作为标题 + * @param icon 配置路由的图标,取值参考 https://ant.design/components/icon-cn, 注意去除风格后缀和大小写,如想要配置图标为 <StepBackwardOutlined /> 则取值应为 stepBackward 或 StepBackward,如想要配置图标为 <UserOutlined /> 则取值应为 user 或者 User + * @doc https://umijs.org/docs/guides/routes + */ +export default [ + { + path: '/showInfo', + layout: false, + component: './404', + }, + { + path: '/', + redirect: '/showInfo', + }, + { + path: '*', + layout: false, + component: './404', + }, +]; diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000..525d4c6 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,31 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-22 10:02:59 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-28 16:45:16 + * @FilePath: \react-adpro-fabric\jest.config.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { configUmiAlias, createConfig } from '@umijs/max/test'; + +export default async () => { + const config = await configUmiAlias({ + ...createConfig({ + target: 'browser', + }), + }); + console.log(JSON.stringify(config)); + + return { + ...config, + testEnvironmentOptions: { + ...(config?.testEnvironmentOptions || {}), + url: 'http://localhost:8080', + }, + setupFiles: [...(config.setupFiles || []), './tests/setupTests.jsx'], + globals: { + ...config.globals, + localStorage: null, + }, + }; +}; diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..197bee5 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/mock/StaffEmployee.mock.ts b/mock/StaffEmployee.mock.ts new file mode 100644 index 0000000..f4ec50f --- /dev/null +++ b/mock/StaffEmployee.mock.ts @@ -0,0 +1,23 @@ +// @ts-ignore +import { Request, Response } from 'express'; + +export default { + 'POST /employee/createEmployee': (req: Request, res: Response) => { + res.status(200).send({}); + }, + 'DELETE /employee/deleteEmployee': (req: Request, res: Response) => { + res.status(200).send({}); + }, + 'DELETE /employee/deleteEmployeeByIds': (req: Request, res: Response) => { + res.status(200).send({}); + }, + 'POST /employee/getEmployeeById': (req: Request, res: Response) => { + res.status(200).send({}); + }, + 'POST /employee/getEmployeeList': (req: Request, res: Response) => { + res.status(200).send({}); + }, + 'PUT /employee/updateEmployee': (req: Request, res: Response) => { + res.status(200).send({}); + }, +}; diff --git a/mock/dist/fabricModels.js b/mock/dist/fabricModels.js new file mode 100644 index 0000000..68549bc --- /dev/null +++ b/mock/dist/fabricModels.js @@ -0,0 +1,382 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var currJson1 = { + version: '5.3.0', + objects: [ + { + type: 'image', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 2.7348, + top: 0, + width: 1200, + height: 900, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + cropX: 0, + cropY: 0, + selectable: false, + hasControls: true, + src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAIAAAA+D1+tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0xMS0yOVQxNjowNjozNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjMWE2ZTE4MC1iMTc1LTQ2NGMtYjBlZS0zYjgxYTcwNjY4MTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4YjQzZmIyYy1hYmVmLWYzNGItODVlZC1k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oizn60n1OZ3O5cuXnzp16vXXX588efKcOXO459vFixc3btw4YMCAFStWiJuo6jcYDIFAID8//4EHHvjwww937drF/YR5AyI5hwDEL2FGQyIJciYS7EmBUwAQgSAEIFbwer293QTQ59Bm3lOE+EBygCwoKHjsscco08zBgwdTU1PHjRv3y1/+kuYzIBFCsz+rPCr5LsS99HovROW6yTUhdRnpwNesWZOamjphwgQWQmUxjcsor5ObQ81m82233fbpp5+uWbNm2bJlUogEqqSZRddTlSyUZXnw4MFf+9rXPvroo9dee+2uu+5ijH322WelpaXz5s2jCSq41BQFOVVFNV+6dGnv3r3Hjh1TqUEA+ji9/kYCIBaAIASgRwnjNka2mg6NQeJLBjoJH4ZQ2s6Mp7SGApIgYYzl5+e/9NJL//Vf/zV58uTnn39eVIMqX1Mm3Jm9622ldfJkgsuooplej+x47777bmNj47333muxWPh50K1K6zIq2kgVRbFYLHPmzFm/fv2mTZtuuukmHk+oKizWo42cpGLp6ekrV67cvn37n//855aWlmHDht1///1ms5m1ika+U1XWGc6FCxfghgCA1DqVC/2bYHY/AKIDMYQA9DRSW/j6TsYQdmkbQfwR3c0Qam4uMaCOMeb1er/88suZM2du3Ljx8ccfv3btWlVVFWuNjuMSS3tXM01mzp5Ed7/iSuoaKkIKlnfffbe2tnbZsmUOh4Np3EpF6FRrH1uVX6jVal2+fPm1a9fee+891nrGdKvS3QVrmw9j0KBBFRUVhw4d6tevH6lBJgRqai2E4pGaTCaLxSLWDAAAADBYCAHoMXTDqMS+KZ9zrPP1AxAhuiYjlUYqLS194403JkyYsHTpUirwxRdf/Pa3vx06dOjXv/51KkOztGtj5KgqlVmsOw9IH1WTxMkDg8Egzf/OGHvzzTcbGhpuv/12mp6B6+FQIYhhhJwozCRJuv3221evXr1u3brFixdrNaHf7xclHP8rXgWXy/XKK6/4fL7/+3//L2Ns8+bN/9//9//dddddhYWFBoOBTjI57jK9uToURamtreX+on6/n2y8AAAAAAQhAD1Hu9nMeqwlABBcGol2MC5CmpqatmzZUldXt2rVqmHDhjHGAoGAwWCYOHFifn7+tm3bnnrqqRkzZkycONFoNIoKRAylUykT0SW1d+95ahupQb/fv27dusrKyhUrVnA1yIupMuUQ2nw5TOPnya2jSUlJN91007vvvvvFF19MnDiRWyYpZFElLMXTSMuff/75zp07Bw8efP3119NP8+bNS05O/uCDDwoKChYsWEDTrFFqH63TKdHY2Ch6CGt3BwBQgacD9BEgCAHoUUQTiqqvTNOFmc1mSjmo22MzGo0ej0e7HoDo4IJQ1D+kBsvKyg4cONDY2Dh//vzc3FxehjRhbm7uHXfc8dFHH33yySdXrlyZP38+eTBqY+q00zywjs8r3YXwPCt0pNQGmkLjzjvvzMzMZBq3T7HN/ABJ0YXRtFz00o6KiooWL168YcMGWZZp2kZuniX7Kt+Qp3hljLW0tOzYsWP//v0TJ0688cYbecyhwWCYOnVqdnb2xx9//N57782ePTs9PZ1MhbqtkmXZ4XAEg8GGhgaGKSgAAAAIQBAC0JuIvUDy4HK73bohRrTQ3Nys3RCAqBF9FEX3yD179mzdunXWrFmLFy/mJUnYcMlhNBpvueWWQYMG/e1vfzt+/PgDDzyQlZXFbV+s1dKoaNKxaNf0FnTIa9euvXbt2sqVK8k2SHJLJau0ElFqnRderJAX4/ZPnu5FkqQBAwbMnTv3k08+8fl8U6ZMoTk8mDB7IWs7xUVDQ8Pq1atramruueee/v37MyGekBxEi4uLv/GNb6xdu/bll1++4447BgwYwFvIM82Iu6CV4mwZDL4JIEHRHdDpKAn8dMTISxjECBCEAPQoKiOD2MukJBZ+vz8jI6O6upoKFBQUXL16lSwJVqvVZrPV1tay1uT4CfytAp0h8i+9qNxoTW1t7fr169PT0x999FGbzaYqpnVHHDJkyH//939v3rz5f/7nf2bNmrV06VIeVcjrFFPXqPKddGunRHcvor3d5/Nt2bLl6tWry5Yt040bDONaqfWGFX8Sz5XSOq2FLMvDhw9XFGXLli0+n2/mzJlUgIu3YDBoNBpp+c0339y7d+/ixYtnzZol1sPPKt/77bfffuHChbVr16akpKxatcpms2ndcQOBwPnz5/mFgIUQ9CnC3PDQRQAwZBkFIBaQJMntdrtcrgsXLiiKUlVVpSjK559/HggEysrKfD5feXl5VVWVy+Wqqan5+OOPGWPknocvGdDSobuiqamJtWqMmpqaXbt27dixY+zYsTfddJNKDfKaudThkzcwxm688cZHHnmkoqLiL3/5y6lTpxhjZP7yer2BQICWRVWpTUbaHejuqLm5ma/Ztm3bJ598cscdd2RnZ/Mj0lWPWn2o6w0r5nRRrQ8GgzSyM2LEiOuvv37//v2lpaX0a0tLC10Ik8kkSdLVq1dfffXVmpqau+66i9SguCPxoLjBsKio6K677srKynr77bfF8y+SlpZmt9tpGbOeAsDB+AgAsBAC0KOoYgj5eortGThwIGs1F5jN5paWlqSkJMaY3++nwELGWGpqKmvt7cWO6x2IHTp0V+Tn59NCS0tLaWlpS0vLmDFjioqKaKXf7xd1hVbkcPdRmjw9Ozv7lVdeWb169bJly0aMGMEYs9lsNpstlPzolbvX4XDQ7AuXL18+dOjQsmXLcnJyWOgJ6FX6UJTHRqMxjCFRdSGMRmMgEKBTOmrUKKvV+sorr+Tm5mZmZvbr148UKWOsoqJizZo1kiTdddddaWlpjDGPx2M2myUhT4+4I0mSqM6cnJyFCxdu27Zt+/btLpdrzJgx4lE4nc6SkpKamprz58+rLgfeISDx6Cr3GdUj3yV1AhCDQBAC0Atou+yU6OLUqVOZmZmyLLtcroMHDzqdzqSkJI/Hs2fPnmHDhlFij+PHj0+YMIFv1QutB7FNh+4K0kKXLl3atm3b2LFjScUFg0HKa0K3pWglE7ODin99Pp8kSSkpKd/5znf27t37l7/8ZcKECQ888ABrtWaz1tQp7TavS3py4l54m8khMysriyZR/PTTT8eNGzd58mSy3YmWN/GvtnlKa25S1mpboLDDUMeitJ14w+v1mkymkpKSfv367d27d9asWQMHDuzXrx9jbP369bt27Zo/f/7cuXMZYz6fj2bFIFdPVatEC63P51MUxWw2z549e+TIka+++uqFCxduueUWrucbGhrKysqamppIDYpzTsDzHIBQJHC0LfoPQASCEIAehdsTuKlQDOJyuVxUwO/3u91uXtjj8fCEhI2Njb3WepBA0I23YcOGhx9+ODk5ecGCBRRExxiTZTnUfJihlJJoSJwyZcqUKVM++OCD7du3T506ddCgQUOHDmWM8VnRw9Pl3RTeZjooj8fzu9/9bvDgwcuXLyddRAb5DtXGGCPrPTlhhj+0UEf0yCOPkJvu9u3bZ8yYEQgEqqurv//973NrYXRTBWZkZHzrW986fvz4lStXKBUNb4YqrJGvT7CeLgDdgfi9xiMDEgwIQgB6Dt1c9vwnv9/Po7bMZjPvYcuybDAYeAc96pnrARChu3HdunV/+tOf7r33XkmSGhoaqqqq3G43TSpIVimfzyfLMp+ngYxdUmvKSrE2RVFo24yMjMzMzAEDBvz7v//7Bx98wBh7/vnn77zzzsOHD9OdzGfnI7T/alsbSlPpdsuosDj/OxkJjUZjfn7+f/zHfxw4cOBvf/vb17/+davVev78eXLIjGR3hN1ub2xsPH369N///vdDhw7Z7XaPx9PU1ETnTbcxqmff4/GYTKbU1FRZlv/whz98+OGHTz755Ny5c3/xi1/4fL5Tp05dvnxZkiSDwWA2m3nWU9b6+PPcrdQxpckzZFkmO2FycrLNZrNareXl5YWFhbwZgUCAJ5XRPV70cQFQwd0i+L+qBQASAwhCAHoI3X6h+CtpQvr2BAIB8hZjrfkkeC9ZTNhIoBsHOB3qptBdV15eXl9fX15eTlmLWGvMKjmOksYgLUH3J01awGUha1V0fr/fZDKRi2NqampJScmFCxdoR3/+85+Tk5MPHTrEWtOriP6WrK0I1L2fQ2V9CDU+QmF14tkgs2d6evqgQYMyMjImTpxI+UVbWlrsdjs5UmoTsei2xGw2k5fpuHHjjEbjv/71L/pXnGNDlKOsbWpQcjcNBALBYHD+/PmzZ8/+8MMPGWOffPLJL3/5y48++ujChQvkwkrnk7VmHyXtRzVzEchDGXmqUoPBkJmZmZOTo7JbihNphBHSAAARPBegLwBBCEBPE6q/q8piz+cKIzXIdWAChzSAzhPGCq2C1OCoUaN+97vf1dbWZmZmpqSkdGFL1q9f/93vfrekpOTAgQPf//73ZVletWpVF9afMMydO7eoqMhut1N+0a985StdUu3Zs2f9fv/Ro0cpLpTcYi0Wi8vlEuNCAUhIuirjWpiJZwBIJCAIAehRtF8UMSZBNJjwf3kuR/qJpxvVrQ2ACKH76oEHHpAkyWw2l5aWZmVlDRo0iH4Vs5iI5fmyWBVPNErrjx07tnfv3rS0tK9//esGg+HatWt1dXXp6el+vz9M5hXdmrsE3jVU2cd4TF0UDdAmXI2uYYwxWZaTkpKWLl3KGPvggw9ee+21GTNmUKJXfhXa9ZilBX56P/zwQ6fTOWHCBB4bGQgErly5wt8eGFcCfY3o5pbARxb0ERCMBEBMwC2Eoj7kKQoDgQA6baA7qKurY4xZrdaUlJQvv/xyx44d1dXVjDGeRVOVe1MrTsSsm263+/3333/ttdcCgcDUqVNJnxw4cODcuXNh2iAJdMcximE/BDleatdH3gCpLdE1jJw8vV7vhx9+ePHiRcbY1KlT7Xb7Cy+88MEHH/Czqnr2ldb5D3kYIbWHzvbVq1dXr1598eLF4uJiVaYc0SHW4/HoHkt0BwJAjICbGYDogIUQgJiAQoB4z498RLXikGEKXdClVFZWMsaMRuPw4cPz8vK2b9/+6quvzp49e9y4cRSQFggEuHbSpqakaECSIhcuXHjxxRcVRfnmN7/Jpzf0+/2BQIAScooarHdRhMkzpLZJIyLZlumFBEfurMuh88Y9ORlj6enpS5YsGTZs2N///veKiop7772XVJx4FcRd0CXghsE9e/Zs2rRp7ty5NJ29SGZm5ogRI6qrq8+cOeN2u8VQZDjFgYShy2/mBB6KxcMORCAIAYgVRNUnepCqksqIk49F0QcFiU1Hbwma2IDyWKakpCxcuNDlcr333ntffPHFzTffnJ+fT/ktyZalkiJkwmKMBYPB55577uLFi3feeeeECRNISfp8PsqJYrVaRU/R3rppw4jACMWhaJHTWu34VuHlpfbwA4GAxWKhNV6v12w2Dx069Gc/+9mbb775wx/+cOXKlWRr5fJbVRud25qamtWrV8uy/Mgjj9CsFXT+ecmqqqpTp041Nja63W4Wep6MBO7+AhAFEiamB30DCEIAehMxBIgrPak1p7/YxeSbiBZC3QKgz9J590XGmM1mu+222/bt27dt27bCwsJJkyaRXBFjXEkc0r6OHj26efNmi8Xy9a9/ffDgwUwIKWR6E3bFSKdKFIEd2jDMsxaJpVG3gNI6yQcJP0mSrFbrnXfeWVRUtH///oqKipkzZ2ZkZEhCglaCTvJnn3125syZoqKiadOmZWRkhGqJy+WiZKpMiDYM1SQAAIEHBPQFIAgB6AXEnBYqq6C4zCWiaDzUBV8s0BlUt6Ldbp8zZ86pU6c++OCDq1ev3nTTTU6nk0LvRN9Fn8+3devWTz/9tLi4+L777qOINZovQZwNQpz+jnVd9r/oEHcdarmj9bCOT1StFclihaT6bDbb7Nmz+/fv/69//evs2bP33XdfRkYGnxOSFJ3f79+8efOePXtuvPHGmTNn8sq1QwOSJJHjLmlCDCGBxKZ33zMAxB0QhADECqJfqEoEqsILe6d9oM9A1sLBgwcPHjx406ZNTzzxxJw5c2644QapdYY9xtjx48f//Oc/5+Tk/OAHP0hPT2etKTF55pJQ9rd23SnbLRYdKr9QvgvVyjAtD9XgUEa/UM1Q7ZoJD7Uo5EgWFhcX/+QnP9m4ceNvfvObJUuWzJ49mxv3ysvL//nPf2ZmZj722GMOh4NvEmq/PJWOoiiRzLgIAGDCcwqFCRIYfBIA6AV0e8najBHaNSyCKbwBiK7jwlUKz2Mky/KCBQuGDx/+8ccf/+///u8DDzyQmprKGHvjjTcOHjy4bNmy66+/nrZVWmdQaLfz1K6tW4yP7Vp03URVyypZqFsJaysFtXWGdysNUy0TYonFq3DzzTfn5eV99NFH5eXld999N2Ns//79mzZtmjFjxpw5c2hDPksN0zOPBIPBurq6pqYmqjxUUhkAgIj4dCTYkwJ9C0QgCAHoZXjXTRUcKP4byiqIFzroWlRShG7OwsLCZcuWnTx58oMPPvD5fMFgMC0t7cEHHywuLuab8Owm7faZwtvTOmokjKSLpk3E0u4m4XfXrtaNxIM0TBlePzmIksF2zJgxAwYM2LRp04svvtjc3JyRkXHvvff279+ftUYgtxtB6vf7dR0N8BoBIBQd9QYHIE6BIAQgJtBaRbibKHX14CkKegCuDSRJogQnlKzS6XROmjRp+/btP/jBD5xOZ3V1Nfkcer1eg8GgmtNPzOfZ0f1G3eDOl4/QU7RdG2OEDWvX8kA1GAyGQCDg9/uNRqPT6bzpppu+//3vHzp06E9/+pOoBsUkMbpIkpSent7U1EQzT+J9AkCEYMQE9AUwMT0AsYLofibGAqlSC6InB7oJVc5bshDS1AVVVVUvv/zygAEDrly5Qu6j+/fvZ4yZzWZuGBQD4XrpCDpF5M1WQiAW6OjuVIqOew2Q2DMajYFA4K9//euLL7743HPPffHFF9euXfvjH/94+fJlku7izKW6GAwGu92umqoeAAAAYLAQAhA7qESg+FOc9rBBfKEKYyO7n8/n27lz59GjRwcOHHjjjTcajcbc3FxFUT788MMdO3YsWbKkqKiINvT7/axzU19ER+Tqi7tnazeJIjGMbvl2QxAjgeoPBAI8X+uRI0d27Nhhs9lWrlxJUwjedNNNn3766fr164cPHz5r1iwqxnPAan0KrFZrUlKSx+Ohf30+X7uHCUBc0yUvogR+OtCvACIQhAD0AtrEG9owQtWymIBUWw8AIpF/6UOlQiGDVVNT0/bt20+ePDl16tRp06ax1gSkkydPTk9PX7169RtvvHHbbbeNGDFCkiSahp4JaWl6rMMRfkehdJooDkM5bXYowaCu2lSdYfHMiCVJTosN5o64+/bt27RpU1FR0V133WU0GskY63Q6Fy9e/Pnnn2/durWpqen666+32+1kKtRtrcvlamxsdLlc9K9oKkS/ECQAqke7qz6OoXIRA5BgQBAC0AtE2ANr1zu0h7vdIPbp6P2gGmiQhIkljhw58v777xcWFn73u9+lMn6/n1xJLRbLoEGDfvKTn2zfvv2ZZ54ZPnz4Qw89ZDKZ+ESFursQd0SEstepiCQrjEpl6SbbVPXn+K+iaVRc1m4SCVLb+S1Um+vqT25W1WboefXVVw8cOPDVr3511KhRrPVkyrJMynzSpElDhgx57bXXnnvuufvuuy8rK4sSvWrbHAgEKMso/SteI/RxQQLQ7vhOdGAEFvQRIAgBiG+gBoFIR+8HshSJ9ijGWHV19ccff+z3+++7775+/frRSlIpJCS4cJo1a9aMGTPeeOON//zP/5w3b97NN9/MJ0xvN+1KFG1W2k65HqH61QpFsUJtVaK2jM4Dtt3UMqHy7tCFoJO8ZcuWDRs2zJw584knnlAVYMJgkNPpfPjhhw8cOPCvf/2ruLj41ltvpXw/2splWeaRiqGuCLq8IE7RfcA7D76woI8AQQhAHIPeG9Al8k6M1+tljHE16HK5ysrKDh48mJaWNnHiRJpxXnSb5EqJuzUaDIY77rgjOTn58OHD9fX1c+bMyc3NpSQovKS4xwjj90JtoiuiqGEq2yDTm3gwlD+naCoU/3btIyaFmOdQURSK7qMDaWho2L1796FDh+bOnXvTTTfxMqojpXwztHL8+PF2u33Xrl3vv//++PHjCwsLybmUH6Asy2azmS63du9deIwA9CJaB4QurDDBgNYFIhCEAMQE2q+OmGNGtb5HWgT6BKL4qays/OKLL8rLy6dMmTJmzBgqoDvBHd+K7kaLxbJw4cIJEya89NJLx48fX758+YgRI8gYRX6k4TtV0XW5dC1sosDTtRhorWGi3FUZ7lQOpR0lzHGpGh8MBlNSUhhjBoPB6/W+9tprFRUVDz30UG5uLmsNLyS7n1gtP7E0NcjQoUOHDh26bt26d999d8mSJYWFhWLLg8Ggz+fjkYrhbbYAxDvdIeTwpIAEBoIQgF5G9xvToQ8PvlKA09FukMPhYIx5PJ5Dhw6dOHFi+PDhN998M/3k8/lEexQL4W+ptM5VmJeX99Of/vSLL7549tlns7KyHnzwQXI3lSSJ5zLRrScKuOFR5fOp8vbU9czUBhbq1tB5woQ+8sZLkkSm1MzMTMbYpk2bPv7442nTpj300EOSJPn9fp44lLxwdeuUJIlMf2azefHixefPn3/zzTeHDx8+f/58LiMZYy6Xi2cZxbgSSGy66SkGIFGBIAQgVgjVRQvzQcK3Cqjo6C2Rk5PDGPP5fKmpqatWrRL1A81AGAniVhMnThwzZsyhQ4e2b9++dOlSs9k8Y8YMUjvRtVAXlepjmgRL4r8q509dK6JKQHatMhT3q/VENZvNo0eP9nq9iqJcvnz5kUceGThwIP1kNBrFcxshAwYMePDBB0tLS+vq6sQz7/V6dV1GAQAA9HEgCAGIA0K5j6JXB3SJRMnQzfPjH//4nnvuocEI0h48lahogqN/6T4UrVtUlTjbhNFodDgc6enpp06d+vWvf11eXt7Q0MAD4bob0UIoHmaox0crIFUysvtaKLJ58+avfvWrM2fO/O///u+srKz6+vpr1675/X6LxcLHichBlGcH5cZbyuxqMBh4PGFaWposy7m5uRUVFVlZWbx8Wlqa0WhsbGxkeHUA0HES7KnBgDIQgSAEAIC+CGkJr9f7X//1X48//nhTU9PGjRtJh7BWR9BAIBAMBr1eL02STkKRVkqSRAWMRiOPM/T5fMFg0Gw2FxUVjRs37gc/+MGVK1cYY3/961+770BEayELO+0EP3BtJCELHUMYHWH6jtr6X331VcbYzp07jUbja6+9dvz48UAg4PV6LRYL5YZhQuIfSkMqSRL/SyrRbDYHAgG/32+32zMyMoqLi5OSkqh+g8GQlpaWl5dXU1Pjcrn8fn+CdW0B4HTJ86utTVshHiKQSEAQAgBAX4SnhLn++utNJtOQIUPGjx/f1NTU0tJisVjI6BQIBEj+0SY80SUpQB7exlrnmfB4PLIsZ2ZmJiUlHTx4cOrUqe+8887w4cOTk5O7sOWiogtjABTLqw481L+6tsEO5S2MrvBvf/vbq1evDhgwoLq6+qGHHgq/VYRcuHDB4/E8+eST//Zv/xYIBKqqqkwmU1NTEwl+q9Wq22YA4hStM3aXo3q6YWEDiQQEIQAA9F1WrVq1atWq8+fPnzt3btq0aUlJSdys1Bk+++yzffv2/exnP1u7du1TTz116dKl/Px8+qnzeeFFP0+m0YS6CWNC7ShMDCHfUKs/I2we05gfQ21it9t///vfS5L07rvvfvDBBzNnznQ6ne3uKAz79u1jjI0ePfrRRx/97ne/S7tubm7m2X0ok02oZgMQp3ToUY26cgASD7m3GwAAaAfkAwTdAXVubrjhBsaY0+l0u91Hjhxxu930qxhJyGHCDIQiNKUB33Dnzp1bt24dNmzY+PHjaU11dbW4X05XHYtuqzihdiS2IVTeUXEXqsZrUbVHW61ueZ/Pd/LkSfKtnTp16qlTp/74xz9++eWX9CslGg22B59PwuVyrV27dteuXampqWQG5EeRlJRkt9tpWXyrwNYBEo+uuqW7430FQAwCCyEAAPRdDh48yBhLT0+fPXv2tm3bSktLx44dO2zYMEowQ06h4WsIBoOyLFNK0vLy8qeeekqSpEcffZRMgsFgsKKiwmaziZv0sI9iu7tTCT9dn1Kp7cSGusu6vqa0YZg2GAwGq9VaXV2dl5eXm5v7b//2b/v27Xv11VdPnTp15513ihdCVT/P8SNJEhU7derUu+++O2bMmO9+97uqvRiNRovF4vV6jUaj3+9v97ICENeEGQkCAGiBIAQAgL6LmMRy1qxZFy5cOHny5Jdffjljxoz+/fsbDAYqwIWHKIHoL01AX19f/84775w6dWrOnDnz5s2zWCxUbaAVvsdYjliT2uZQ5Qer0oQs9MTuoggMtQtep1gbKTSa0XHy5Mn9+/d/++23f/3rXy9btmzYsGGUQVTXOZY2bGxsXLduXV1d3cKFC4cNG8YY8/v94pQVfr+/rKyMGxJFC6HWiTeWrxEAunTTrdt5F3cA4gIIQgDiGHyfQCcxm82MMT5vwcCBA7Ozs/fs2bNjx46BAwdOmTKFm5JECUFWQdaqRk6ePLlr166ampqFCxdOmzaNylCdsiwbjUYSjSIxdetqO5Gi16hoG2zXThgeUctxd1aaT4JOkSzLdG5zc3OXLVv28ccff/DBB42NjaNHj7ZarSpLo9I6C0VZWdmOHTtkWb711luLi4tDNcZgMHBByBfaPRUAxAU9cOsm2NMRUy9h0OtAEAIAQN+Fd3H41BFJSUnz5s07c+bMW2+9dfXq1QULFlAoGpc93HpGaz799NO33357ypQpP/jBD3hVSttELDE+yh7G1VMKOxeFalnRzIIoLmvlHFd0ijDBoCzLZCfMycm5++67v/jii7///e8TJ0689957DQaDJElkbqVlxthnn322bt2666677tZbb6UaaI4Q1UElJSWVlJTU1dVdunSJZgfRPYoE6/KCPkV3vFuktmmlAEhUIAgBiGPQewO6dLT7wvUD6QRZlgcNGvSjH/1o+/btv/71rxcsWHDdddeRIcvj8ZhMJjJnXb169bnnnrPZbL/4xS/S0tL45tzqxdr6XnYfuoIzahWqsuOFUoahNtRGJHKP03Z3SvWbTCYS1QaDYeLEiRMnTvznP//5q1/9auHChRMnTuTm1pqamtdffz0YDH7/+9+nCehJ1VMBVR7RlpaWxsbGpqYmSv+jtdmqjh2AuKZrVZw2RxQACQYEIQAAAMYEl0je+5k1a1Z+fv5nn3322muvXXfddf379ydrodvt3rFjx6lTp2bPnj1+/HhSg1q/StbqAxlqj90xoqFbZ4f8OZngKRrmL9PrJqoMifTX6/WePXu2ubmZJpGvqqqqrKy0WCwGg2Hx4sVML+aQNiS3W8bY3XffvX379k8//fTatWu33HILY+zo0aMfffTRwIED58yZQ3NUqPxXVZ1Xs9lss9k8Hk+75wEAwNG19icG0LdABIIQAADA/0OVWGXgwIEOh2PDhg27du265ZZbnE6noigHDhw4cuTI1KlTKWJQURRKXKmbu1LVi4rZTlUoi6LKX1Q8ObwMT/jJowEDgYDP5/N4PJcvXz558mRZWVlLSwtFVHq9Xpr+4Zlnnhk7dmxRUZHNZlNleeEGW5/PZzQaZVmeM2fOwIEDP/roo40bNwYCgcrKylmzZk2YMIE20XUTFfH7/aKnqHilYvaKABBThHcQACCugSAEAADQBm5lIp2Tk5Pz1a9+9cyZM6+//vqhQ4cyMzOnTJnCJzYQp53QrcpsNsfXULRu2hiVJhQ9PHk0ID/Ma9eubdu2bd++fdeuXTMYDGPGjJk9e3ZeXp7P55NluV+/flTsxIkTLS0tTDPXKK+cBw0Gg0GTydS/f/+777773nvv3b9//z//+U9Sg6TGKX+P9kB4k/x+f1VVVXNzM/1LyYQAAJEDNQgSGAhCAADou4Saj06VWIUxlpGRUVZW9tFHH40ePXru3LlUTKVkdKPsVMlUOKqMnSyC/lYYYRndtuG30rUNqnxiSQqSVfDKlStr164tLS212WyjR4++4447Bg8e7HQ6eQIYvpXX6zWbzZQ4lDHm8/m0zaOfgsEgJYBljG3cuPH06dO///3vrVbrjh07Xnvttfnz52dkZJhMJtHRN9Th0BT2tCxGGMaXXAegJ8HTAfoIEIQAAABCQorxwIED165du+eee77+9a97vV6a52D48OEZGRlMyCUj2s1oc9JL4V1JQ6my6DLBdIhQKjFUKlHt5vRreXn5559/Xlpaarfbb7311n79+hUVFWVmZupWqwiTTJClLtQuePbRq1evbtmypaKiYtasWQMGDGCMTZ8+/cMPP3z99dfnzJkzcuRIXV9WsVpZlp1OpyRJtbW1MHQAAAAQgSAEAADQBnFGBMbY9u3bP/744+uuu27o0KG0xmAwvPPOO8ePH1++fHlKSgpljqGtVElNpFbE+rXpW3SXu/ko20E3mQTXXWS4Y4wFAoHdu3dv2LChsrJy3rx5d955pzgdvDgDh8reKK5RhS9ycx9dgosXL/7rX/+yWq3f+MY3kpOTqdr8/PyvfvWrmzZtWrt2bUtLy+TJk1UJgbS5fDweT6jpBwEAAPRlIAgBiGPgzQK6EFGWkBQ5ffr022+/PXDgwB//+McWi4UxRlPkDRw48Ac/+MHevXt//etfT548efny5VSemwp5PSoHS9W+QknBUDk8ex6VXysXvaQGt2/f/sc//nHQoEFLly6dOXMmbRIIBHhIIRfV2rjEUFDoJp8W4vXXX9+9e/eyZctmzZolNoBCNxcsWDBq1Kh//vOfn3322f3335+SkqIrBRljwWCwqqoKghAAAIAWCEIA4hiVwQH0cTp/P/AN3W73pk2b6urqbrnlltGjR/P6ZVmmhJayLE+ZMmXgwIEffPDBU089NW/evBEjRujKQkqSqd2F9l/tcu/aCVW+r6TE6FgqKirWr19fW1v72GOPjR071uFwMGEWR5V6ZO1dEW6PJZlHavDIkSMbN27Mzc392c9+lp6ezkuqKs/Pz//Od76zf//+V199dcyYMTRjJNM7dU6ns6Wlxe12s7YxhL1ujAWgO+iSz2ICPx3oNgARCEIA4hi80IFIFPeDGHgmJsncuXOnx+O54YYb+vfvz4SMo7wMSZfMzMw77rhjw4YNW7dubWxsHDlyZFJSEvcgJWuVymVU1zYoOpqqnE7FrTqJ1vAYplrV3sW2HT9+/IMPPmCMLVmyZMiQIVRGO/GG7i50r5EkSU1NTbQsy7LP5zt69OimTZv69eu3ePFichNVFCUQCHC1KcsyrTEajQ6HY9asWUaj8ejRoy6Xa9q0acnJyaq4TZvNlpub29DQcPnyZZrNIvLzBgAAILGBIAQgjkngwUvQGSJXhhTwxh0UXS7X8ePHd+zYMXPmTD7HHYk6XoZDt5/D4Vi+fPmFCxdWr169d+9eclyUZZkLJJIuUR+LKr4ufAEVkjCVvKqkbrW6hbkTJkmsLVu2rFmzZtq0affddx8TtCIPHeSVqHxlw7jO8jyiVMmaNWs+//zzr371qyNHjmRCKldSg7wSfm7JwDh9+vQJEyasXr36X//614oVK9LS0sQduVwut9vt8XioNjHQUbdhAAAA+g4QhADEMbGTgQPEAlFYCBsbG/nygQMHzp49m5aW9sgjj9C8gqJ9L9Q9RqbCoqKiH/3oRzt37nziiScmTpy4ZMkSkhwul0t3kj0WNp0M36lugTAHrk1Lo5tyU4QnYhG3EmtWhDkGX3zxxcuXL3/rW9/iUo07kWor0bZZ9S/3FJVlOT8/nzH22WefvfvuuyNGjHj88cdTU1MZY16vl+9dpdzEE0sTV1gslgceeODzzz9/8cUXp02bRmGHHI/H4/V6aVl3Ynp4HIAEoGu/hhguAX0ECEIAEgH05EB0jBkzhjHmcrkuXLjg9XonTJhQXFzM2sa/hUdMuzJz5szs7OzS0tIPPvhg/Pjxubm5NpstPz8/VC6TUD0t3bwy2vaoNJhWUqrq1zqLqtxZtYfGbYM+n+/tt9/2+/133313SUkJa6uWWQgHUe0B6krEkpISh8NBnqK33377lClTeIEIZ5AX7beTJk3Kzc29ePFiVVWVOPWFKAg7amsFoG+idSXAYwISEghCAADouxw7dowxdunSpbq6ujFjxtjtdlofXinpQjJs8ODBJSUl77333ubNmxcsWJCVlRUMBp1Op1hMrD9UKlGV/FN1xXTtfqE0YfgD0Q0pFPUkGdPeeOONq1evfutb37LZbEyjBsV26toYdXdNkZaMsSNHjuTk5CxatOjRRx8lNeh2u4PBoN/vN5vNvIUUnMnbRsuKohiNRioTCAQMBoPZbC4oKDAYDOXl5XPnzuXNMJvNXq/X5XKFORsAgFBACoIEBoIQgFhHd1JvAr5eQKRD9wMV/tvf/nbXXXcVFRUNGzbMarX6/X6fz2cwGCiVKJcipD2YoJR46Jqozbxer8lkslgst9566759+/7whz/U1tYyxlauXMn0RJRuTB3XZrp2Qu3RhU9Lo2tpZBEM9otq8IUXXvB6vQ8++KDNZlMlmGnXL1R3DYcU+G9/+1vG2KuvvvrYY48999xzx48fd7lcNpvN5/PxCEyj0Uj1kI8uQSqR/2WM2Ww2g8GQmZlZUlLi8/lKS0tZqxq0WCw+n89oNPr9/lCNRJcXxDVdfhtHMqgEQAIAQQhAHIOvFBCJ4n5wu90jRozgsxrwPJliihQeZUf+k36/3+/32+12r9fr9XoVRXG5XIFAIDk5mTwSjUajwWCYOHFiS0vLmjVr0tPTk5KSeJ3cCTOSGMII4Zurem9hXEZZW/2sLUlyNxgMvvnmm1arddmyZdzOyYMGO/kASpLU0tLCGHv88cc/+uijWbNmVVVV3XfffQ6Hg0IHVaeCxxzyZVEzixNXBIPBCxcu+P3+JUuWvPvuu4qieDyec+fO8V2L8YdaSywAcU3X3sZ4KEBfAIIQAAD6Ijzxydtvv52bm3vy5Mmmpiav10uKwu12B1ohz0aldRJCn8/n8/ny8vIKCwszMzPr6uoyMjKMRmNFRUVqampNTc2lS5cKCgqmTJlis9kCgcArr7wyderUhQsXNjU18UkpdJskju5rQ3dUy6II5P+Kf0PZA8PbG7n9k/TVpk2bjhw58r3vfY80M29VqPDFDkE2VcbY2LFjf/GLX8iyvGbNmhMnTkyYMCHC0EHtUVCzL168WFNTM2LEiHfeeYf/ZLVaaRJCAAAAQASCEAAA+iLcLLZu3brU1NRz584ZDAay/pHpj+aN8Pl8gUCANJLH4zEYDBkZGX6//9VXX+VVZWRkWCyWy5cv2+122pwxlp6e7vV6aXq9RYsWUcmLFy/279+fNCeL2HtTpN08MSo9qQ0OVEnNMBVu3rx579699913H6lB0bYp1sCi1YTkyckY279///Tp0/Pz80ePHr127dqtW7cuX768oKCACVlGVUpY1exgMMh9Srdu3bpr166bb76Zwh2JtLS0MWPGVFdXnz17tqWlRZyYHoDEA36eAHQICEIA4oB2Z3JD5A9gUbk2TZ06dd26dbRMlkAKMAsGgzxukEfNmUymYDBosVj4viggrampqb6+njHm9XrT0tK8Xm99fb3Vaq2pqaGaDQaD3W5vbGz81a9+9Ze//EXl68jayjbR7sf3rl3PD1ll8eNoH4pQ22oh292+fftGjBgxePBgFtVkGGJLdNvJD02W5fr6+vz8/CFDhvzoRz/avHnzk08+uXTp0hkzZlBSGX4J+KtA9B1VFIWmCamqqnrrrbecTuf3v/99q9UqtqGurq68vLyuro6cVAFIbKAGAegQEIQAxAqhkse0m/cCAEJlFgsPSZSbbrqJtSoWugO1E9Cr8Pv9RqPxl7/85U9/+lPaUUFBwbVr1xobG/1+f3Z2dlpa2pEjRyorK6l8bm5uVlbW4cOHGWOimOQSS9dGF+ZAtPqKL2vPgEqzqVw9xVPBV9J5+OMf/zhw4MDly5czIR2O9omLRBPqSlnGmMlk4vMQ0hqfz2cymW688cacnJwtW7YcO3bslltuycvLk1rTinLjKvfjJcNgMBjcunXrkSNHxo4dO2XKFIvFQhlH+b4MBgMPEAUARE6H3qsAxCkQhAD0MrodSig90DOQVyHpkAg3cbvdSUlJw4YNow1Hjx5dUlLy7rvv0q9Op3PlypVvvfVWaWlpdXU1Y2zo0KHFxcWNjY3nz5+fOnUqr0eMfwuTYEZbUru5qs5Qnqi661WVk2Tas2dPY2MjebqKyVE7ZJDURbdPGQwGyXeUpJ0sy6NHj7bZbB988MHmzZtnz549YMAASZIMBoPKXkqSr7a2du/evefPn7/uuuvGjRvHBNujuAtFyEkTSiQDkDB0iX7THUJKDKBvgQgEIQAxgfbVHMpNVBzjxwsddJLm5mbGmMFg0CoEVY4WrtMoWejWrVsZY8nJyY899tizzz7L88RcvHjx4sWLHo9nzpw5W7ZsqaurO3XqVENDQ1lZGWNMldQkVPyeNkwuTEnd41LpvTDpakTbIO332LFjr7766s9+9jO73R7KjMk0sXxRPIwUnMmEh532Rfq8pKTk0Ucf3bFjx5NPPjl16lSaukOSJJoRhFt0Dx48+MYbb4wfP/7hhx/mDeOGRE4wGGxpaeH+oqL+x2sEgFDg6QB9BAhCAOKYBBuwBF1FZzoxujlLtJWPHDmSMRYIBGjGdsaY3W4nT8WPPvqopKREluXGxkaqkGan0DZM206t/tTVb7rmQe2BqJa19kMVJKL27t2bkpKSmZmpu1OlbXZTbSMjR9eBkyyBPIHNddddN3bs2NWrVz/11FOLFy8uKirijqBut3v9+vVVVVUPPfTQgAEDmDCZhO7ReTweyvfDEtruAQDR5RbCBANaF4ggnAAAAPoupElULprh+0BUOD8/nzFWUlJy9OjRsrKyjIyMVatWjR492mAwlJeX79y5c9++fVRPcXHx0KFDc3JyGGNiphOeK4UJ1jn+r67QUskYcVvtsliMW/kUITeMeETkUckYO3jwYF1d3YoVK8KcB5VRUXU44dE9mXxaefFfMvQxxpKTk++9997CwsL33nvvwIEDtOG1a9def/11r9e7aNEiUoP80LjxUNydLMspKSkpKSkIIwQAAKACFkIAYhd03UB3024KGULRRLp6vd709PT09PSLFy/Ksmw2m0+cOHHq1Cm3252Zmelyufx+PwmSlpaWhoYGbpviqOyQ2swr2p2qNlctqMqHsd1praCKotCpeOedd4qLi0ePHh0IBFQ6TWsn1O6uQ/BNRP9wXrMo6mw225IlS44ePbpz507y7z1y5EhRUdH111/Pt2IaYa/C5XK5XC4SmZ1sOQB9hPDPFAAJAwQhAL0A/7SoPjahFCDiBkE3Id5aYcxxfA2//YLBYE1NzZEjR+rq6oqLi2VZ3rlzJ2NMkqRhw4Z95zvf2bRpE81V+OWXXzqdTpqXoq6ujukpPVUwnqLJK6NtCWvrzCmaFsWV4ZUPL8yzs3g8HsrLonVe1T0bopDTllHtWlWVKDi1F4KX9Pl8kiQZjcYRI0YUFxc/8sgjpaWlzzzzDGXo4SGF4d8MwWDwypUruqcCPV2QkMBlFIDIgSAEoBcIFb+kcvHiy6G6pBCHoJNoxxpUwky1nv96+vRpxlhjY+OUKVP8fr/H4/nVr3518eLFN9988/Tp0y+//HJLS4vFYvF4PBMmTBg6dOiWLVuuXr1KM7yLewylA7sW7YGwtsMxtPz666/feOONY8eOZa35XVStDb8cvu+o/VWcVFD1K3dwVVrnGGSMnThx4ssvv/zWt75lNBrLy8t37949efJkyvEj+qPqBlhKktS/f//Gxsba2lrGmM/nU+0rTMsBiC9wSwPQUSAIAeg1VN1flfucaHkQe+1hTDoAEJHLKpITRLsWQnE95QvNzc3Nzc11OBy//e1vCwoKGGOPPfbYzTfffOHCBZfLJcuy3W4fM2bMwIEDyZvU4XCwtuYy3WXVUYTp3oUSP7pHoV0WS9bU1OzcufO+++4TS0ZiAIz6MeSPtmghVB0Irfd4PHv27Dlx4sTQoUPJMJienv7xxx9fuXJl7ty5aWlpkibdjor09PSioqKqqqrm5mae40fcEYtsTkUAYhncwwBEBwQhAL1GeKMfdycLE0mILx/oJOGD9ESrILfg0Sb9+/d3Op1DhgxZt27dP/7xj4KCgqamJpPJNHjw4EWLFu3atYuMUS0tLV9++eXZs2ePHTvW1NQUyveykw1WuZiGiR7UrYHWnD17trCwkCSrtlj4OttFd8NQAz008yGXi263+/XXX3e73XfeeWdGRgaVKS4u/sY3vrF+/fpXXnnl9ttv79+/vyRJPD5QK6Grq6tPnz7d2NhIwZyRaGYA4hHcwwBEAQQhADEB9fxCaT9ViBEAXYVoIdRqKhXiSovFkpWV5ff7GWP0V5Zli8XCGNuzZ8++ffumTp06YcKEnTt3pqWl5efnnzx5MhAIcLnFNAqT75ppTIKRKJZQZXStjlojZE1NzcmTJydNmiRWoj0hXTsEw49dluVAIEArA4GA3++3WCz00759+7Zs2TJt2rQ5c+ZQAVH1LVq0qKys7MMPP3Q6ncuXL6e3BK9KhdVq9fl8TU1NLPQ8hOhMg7gmjP82vqEAhAGCEIBeQOvcpU1QwcOKVLFb+KqB7iZM8hW+cOnSpTNnzuTm5v7yl7/Mzc1tbm4msffEE0989tlnZrN51KhRx44dY60KJxgMulwuyt0i6qtQeV+6XHqFWkkNqK6urqqqWrx4sW6xbpJJ4nz0PBSQ6+orV67s3bvX6/WuWLGiuLiYCe8NqXVSClmW+/fvv2zZss8+++ytt96aMGHCwIEDDQaD0jplhYjf79fVilr9DECcEt2jiq8qABCEAPQO2o6vLMvUQSR7oBg6SD/1TkNBQhPJtBO6IoEmo9+5c+eGDRvWrl07fPjwH/3oRzt27Fi9ejVj7NZbb62pqfniiy8YYyaTKRgMGo1Gk8mkqkqVGrSTbpntHoUoqFhbG2B5eXkwGBQn9BPTtHQf9FwbDAaSarxJV65c+fDDD30+3x133EGZeMRzxdqq2dTU1JtvvvmTTz7Ztm1bc3PzqFGj6FdSjOIZ0G0DLIQgYYhiRAP3PAAMghCAXkH70aLeJ++9iRZCVUSQrjLEJw2wqDpD2hnMVYjWbLF+slkxxvr37z9z5kzG2He+8x2Hw1FYWFhYWOj3+/fs2ePxeOx2u9VqNZvNVqvVZDKp9KfKNqj15OwqtOpOpa+uXr2amZnJ2jpkdvdjxZ9lMqKyVg/eXbt27dy586abbqIJMKjxqhQ7vIX81TF37tz6+vq1a9eePXv2tttuE52B+REZDAZZlrXGQ7FY9xwrAHEJngjQR4AgBCAmIKsgJZNgrRllxMSDorWQbwUdCEQ6L6i0d5SkSV9JC4MHD2aM9evXz263m0ym4uJig8EwZsyYvLy848ePnzx5kkRgS0vLiRMnnE5nWVmZ1+tV2cFUtkFxL4FAoLm5WWVUjCSFIM/IwhhraWlJTU01Go3hbY9er7e6unr48OFMyPwZYc7VjqLSwLSvlJSUoqIixtjFixe3bdtmNBq/8pWvZGVlMWGaQb6JyoecVgYCAYPBkJKS8sADD+zZs+ef//znddddV1JSIra/qqqqpaWFNiT9yX9CrxckGF11V4dP3gtAwgBBCEBMQN1Qs9nMu8gGg4GLQ55xVAW+Un0c3ckDOgRXaGFq0PXzdDqdjLGUlBQKIKysrExPT6+vr3c6ncnJyR6Px2KxWK1Wt9udnZ2dkZFx/vz5qqoqj8cj1qkyPNLN39TUVFRUNHTo0OLi4oqKCpPJxB8Ko9Ho9/vD2+640czj8WRnZ1+7ds1ms61du9Zut4tGeEmSSDpKknT06FGHw0GCUJSOPfB8cWF29erVtLS0PXv25OXlzZ49WwwpDOXSKZ437m0uSdK0adOSk5OvXbuWkpJCqpJITk5WFKWlpYV1m9wFIDbpZLLuhHxA0H8AIhCEAPQ0up8W3u2jsB+pFdbaS1ZZCLs12grEKVFYCPPz8xljpLLa3ZBuRZ/PZ7FYyO3w9OnTZrM5PT3dZDLZbLZLly6ZTKbs7Ozc3Fyz2exyuVwu1/Tp00eMGFFbW3vy5EkK0iMVpN0X1fzFF1/U1NTMnDlz9uzZp0+ftlqtok2Mj5LotpA0Hj1ELS0tJSUl77zzzssvv3zkyJHJkyf7fD4xuyZlXjEajZWVlZmZmeQyqlVf3ddtMhqNSUlJjDGHw/H0008XFxdPmDBh2rRp9CsZ/VSbhFfsPGhw5MiR9fX1Fy9efO+99+in9PT04cOHV1VVHT9+3Ofz4dUB+hq6OdtUPwHQZ4EgBKBH0fqx0KdIlmWVE5fRaOQ/iT5jyC4DupBBgwYxxrTRfWGgHJiHDx+m5bKysvnz59966621tbWjR4/+9NNPX3vttaSkpGHDhrlcrqtXr54+fTo5OfnKlStut5sEIdUQquY5c+bMmjXrd7/7XVccH1uyZMn69evHjx8fZr9ZWVlkN+P0zIBLdnY2WfCcTufevXvHjBkzYsSIqqoqn89HUYU8KSslDuXutWQCNRqNPp+PJ6OiN4bP57NarYwxk8k0fPjw5557jvbl8Xjq6+tra2t9Ph9rDZUUDxaARELX+123ZPhPKp4O0EeAIASgh9Adj1QN7YvZRPkydQd1P1r4VoGooZvwZz/72fvvvx+5GmStU9g98cQTjDGv15ucnFxfX//yyy9v3rw5GAwWFxfX1NScOHFi3759drs9JSUlPz/farUWFBQkJyf/6le/+tGPfmSz2XRrpqfg/vvv3759e1ccImOMeTye6urqpUuXvvfee5WVlSSiKDDP6/XKslxfX//2228vWbKEHLZZCDXYtc8at2G++uqrI0aMePDBBwcPHmy320+cOHH58uW6ujqz2Ww2m8mhl4aEfD5fXV1dXV1dRkYGOdaazWYShIwxmuPRYDB4vV7K5ZORkZGZmXny5EnGmNFobG5u9ng8pAaZXicYRhKQ2IS6w1XrQwVoAJDYQBAC0HOE+cwoikL9bDH5IffiEy2EHeq7AxAKutM2bNhAwas8ui8SeBSfz+erqKh45ZVX3G43/XT16lWKf2toaGhoaGCMvfLKK5IkNTc3y7K8f//+X/ziFxHuoqNHFIb3338/fIUrVqxgjAWDQf58qbK/dGFjKAeM0Wj89NNP33jjDVpZWVm5a9eu8Bvm5ubm5eUdO3bMbDb369evqamJpxL1+/11dXUWiyUtLU1RlKamJr/fn5aWlpSUZDKZSAfW19dzw6BoIdTGJUIcgnhH9cxS2IXocC7e5GJ+7zDhtRCKIIGBIASgRxFtg+K3h0s+6o9SRhkuCMXhfAhC0LVQ/pWObiIuczVId7Xo/MwYq6+vj7xmMXS2q/IEhpJ29GQ5HI7a2tqMjAzGmNfrNZvN2pJdC50xi8Vy7NgxxlhSUpLL5VIdr9Y+GQwGKysrBw8eTJGZWVlZ1dXVJpOJHEQNBkNTUxOZDQOBQENDg8FgaGlpaWlpmTBhgizLpaWlLS0tZBol/1LtOel8lloAYhYxhlD1VeWIY69hakgM8JgDEQhCAHoB/iKW2k4wyDNeGAwGs9lM2k+SJIvFwvupYlYMAGKKzneYoqghup3y2RfoYezXrx9jLJQva5eTkpLCGMvLyzt8+LDH4yHXUN3sqaIXq8VioRZyG6PRaOTvCpPJRDlySPWR4dftdtfU1BgMhsbGRpPJxHNpaC2EsA2CxEDSzJTDwgYKqmZy0o7FqIZxu7i5AMQGEIQA9CiqXhdfMBgMPp/P7/f7/X6j0UhD+2RpcblctbW13AijMr8wTCMGEosuz/4XSYUvvvji3XffTd6YvFNICzxzKZdSYugvf6JFrzOeCpgEmJg3mNJHGQyG0aNHb9q0ibXO/BHJwaampubk5DDGnE5nVlaW3++XZdlut1PAYVVVlSRJaWlpHo+HhGJWVlZTUxOfasJms0mS5Pf7STFq6xfTGkd6cgGIPbQ3sDg1CxNC9FXlVetZN8cSAxA7QBACEBPQeH9OTg4N8KelpRUWFlJKeqfTOWLEiNTUVCpZXFwsbogByz5IuxcdvZbIoZP5z3/+c9SoUbt27SLTWSAQUBSF/pIUFAUhd+8U7WziTICiIORrJEmi7FA+n6+kpKRDnrS0a0oYwxhzu91ut5scXD0ej8FgcLvdPp8vGAx6vV7yKTUajcFgkMSn2WwmIRrKJZWvxJ0DEhIxVQw9qqpZKMTCKsdyntq3x1oLQM8DQQhAjxLKO8vv91ssFkrKT56iU6dOpbgmSZImTpzIY3769+8vbosOXN+k3UAX3BgRQga6V199NT8/n88B2DMUFBSUl5dHUpKuaXV19ZkzZxhjHo/n0qVLNTU1sixbrVar1WoymVwuF2OsvLzc5/ORSjQajR6PJxgMklZUTa3Bwa0CEgndcQ1uridpp0roLZbUOpfiAQF9AQhCAGICu92enJz8pz/9acaMGdOmTdu/f/+rr746Y8aMu+6669ChQ++//77ZbF61alVubu5zzz33v//7v6optkEfQev9qBpc4H0XrWtxKMhypc2m0H3doC6pWRzg9/v9orGO78VoNKqm8RR/JaxWa1VVFZ+8oWeSNjU3NzscjpqaGsZYSkqKx+PRBi8R1H6y77lcroqKClpPmwSDQbfbLR47radjqa2tpZ+8Xq+hFavVWltbe+7cOcpHiqElkGCEcofmpnt6psQ7X/T3Vm3e5R7ssQMeeSACQQhAj6LtvlOfjHrkP/7xj8XCTz/99N13383/feyxx2iBBCEtJ9gnqq8RpvMRqkyYrzhPSxuqKl20eUHjEVmWVZpQURT+mIShqamJMeZ0OpleSonugFK/MMbuvPPOf/zjH7W1tZFvyy2K1GzyayXbICEeMg88ZowFAgGyhVLh7Oxs1pFbC4B4QddFggQhtxDSB1f8lRa4s7f2JwASGwhCAHqOUL58YjxSdnY27+pRtJIkTKBks9mqq6sZY3yeAHyuEonwV5OPXmttgyoRGAwG6+vrqdMffnfUN/roo4+GDh0aDAYpI6Xf76fbj4fPiVorTDiNqiOlSmUp1kP/sta8LHw6BFXDxPAeWYAKmEwmm8125cqVm266SSsIGWNLlix54YUXzp07RymaKJ+nx+Px+/3kRVlZWSnL8syZMx0OB2ud7oV1kdutthIeZEh2yGefffbWW289fPiw3W63Wq3cpMlhQpYLOmSaVUJRFKvV6nK5KAUOXS/GGOlMfvm8Xq8YA2k2m5uamtxu90033VRQUKBtW+cPGYBeR/ceNhqN3FNAtBbyf2k5TBgtImxBYgNBCEAPEaqjyfvB1J2tq6vzer2hKuE/ZWdnB4NBnkSeoSeX6Ggz0zI9MyCJK4PBMHjwYFqjlUliYUVRpkyZMnfuXFpDOiG+GDlyZKif3nnnHcZYVlZWJPXQA0XLqqe1o31Bpe2MgqLW5ZowEAjY7faVK1euXLky8pq7EMo3g5wZIMHQ/SaKqk/lRq6KJ9TNMqrrdg5AIgFBCEBPEyqNdXJycrvbUudeajupPdMYiEBcwK+aakGL+JNuD57LDNYaCDd16tS9e/eysIJQtKo1NDSQkarn+z1h7tswJ4S1OoWScU/rIcardblcZGxUbc7NBaL/WEcNZbqaXFzQLUBDOTxhaSRPbhTXJVQDeFwiXwNNCBIJ7cNCAbS0TH4H/F9usWdtX6ShqgIgIYEgBKBHCfN1of5ZmO47/Wqz2SgKKExPFMQpkaQ04MEwobalW2jFihV79+5NSUkJM70Bld+9ezdjzGazkVdVlx1Mj8B7ckajkYfPkdqhqDk+b7tqQy4pw2hgrQgPU0aLysVXrIoJ01SEryQMWjukuNyuutPuVKWKAYgv+G2vHdYRTX8kDsWnWxSHqtdgAj8Lcfe2B90KBCEAvUCoqPdItuVeo6pKEOEQp6gMSroFVJ0S7aWnBbI4+Xw+q9V66tQpxpjRaLRarVozFKkgq9XK5aJqjLyrjq5bEZvqcDi8Xi+fLdBkMvEJ33nKHK79xAVVheKC1oTLS0Z4inS31f2pa0P4VBdRVzqK+2WCjIyXqw8SmOhkmO7dSytpClDVGvpX5SCget/icQB9BAhCAGIFSgjR0c9P+IgyELNEYY1RSQuyBJL7kyhvyPeYlB6lIAoFpSb67ne/yyLQpTFCqKDZqqoqWqDuHfX2mpubnU6nxWJR1UB5WSQhXRPr4OMTeWGtNgtfSSSSLLxtMMy+QnV8pbZRjhEdGACxhDh8ox1eMZlMopuAyWTStRDKsgwLIeibQBACECvwqefDEyoEsbeI8HvZ6+2MHbQWofAnR3vFtXkOaNrxlpaW+vr6K1euWK3W2267zefzlZWV+Xy+AQMGVFRU7Nq1a+DAgb/97W9vu+02yrRJ+WwLCwvD7zGWoTOwZs2aX/ziF83NzWfOnCHDIFkFt23bNmrUqIaGBrPZnJqaam1FNIeqTqbKNqjaUYQGNFUloc6nSpKpNu8kuo3XNoBptCIeVdCLRH3zq2zdql9VLqNaD1Ja1r6Q8TiAPgIEIQCxQnSCsNfB97KjiFaaUD6KYZZpK3G0u7a29sKFC0ePHr18+XJdXZ3Vah05cuTtt99+7733hmqD1WpljGVkZIh7D9PUzhBhSFskhDJk3XHHHXfccQdj7MiRI2LS0d27d+/evdvn81VVVbnd7tTU1JSUlEmTJg0dOpRXyBijSS9Uikgl1bTOn+Fdy8K4gOr6AOuaNbTobqhdltpmHgplitT9N9beMAB0iFAWQjGHcKikMhRD2Ef8bvDtBiIQhADECqps16AvEEkAIROkoOjiWFFRsXnz5s8//9ztdpeUlIwZM+b666/Py8vj2waDQb/fHwgEfD6fxWJxuVy7d+8eMmTIoEGDPB4Pd1HWtqFrOwqRWEE7WhtHaZ1wz+PxpKSkHDx4MCcnJzMz0+fzmUym6dOnT58+nUoGg8Hy8vLDhw+vW7fu7NmzJpNp/PjxCxcuzMrK4t1BntJJZTDUNkAbk6lbhmnkJdOTXhGqQW1tocprjSShWghjCOgBelJW6e5LpQDFF6lqqgnxlcjwUIA+AwQhAL2GqgsYp4IwzJcen9JICKUK+LLKp/HEiROHDh0qKyvzeDxZWVmPPPJITk6O1Wq1WCxatWA2mxljNpuNMeZyuRobGylFrdFopO6RVjnEV1oROi0Wi4VsnlVVVaLFTCwmy3JhYWFhYeHcuXNbWlrKysquXLny+uuvBwKBvLy8CRMmDBo0iJ5BCjIUNaHKnzNCiau9dqFsv7x8R4+dtydC27LuyYlQiwIQNb1+d6n8Qo1Gozj3oOhwIeaYAaDvAEEIQK+h+urwDnqHKuldh5YwPeMwoVN9Ga0tSLePzksSsiz7fL76+vrDhw/v3bu3pqamf//+kydPHj16dGpqKt9EN75UFayomoBB19ExLi6c7l3ncrlI8ZIFQNcj12632+32zMzMMWPGHDp06MCBA6WlpRcvXhw7duzQoUPT0tKSkpIMBoNoLdTuLsIuYyjtJxLF2dbeReFlvK7shBkE9B1U6aOktvNw4v4HAIIQgF5At5sYnYWwF79kqhA4Xfmh+rUvI2otlQiU9GaZJ2dIPlz9+uuvb9q0KScnZ+nSpVOmTCHTH2OMEmaqkiLonnAyfIWf6DLeL1MgEND28/j5FC9BMBg0Go3jx48fP348Y+yLL75Ys2bNX/7ylwEDBnz7298eMGCAOC+oKMB4PbpaWrue6em3MMsREnmdYaQjbIMgluEjYp2sxGg0OhwOcpRgjJlMJofDQT4FjDG73e5wOBhjwWBQluWUlJRONhuAeASCEIBeIFSQQ7sb6vbyWVuF2TOEsg1q/R4jMZL0BXSPXTTX8FNEeTK5j9OuXbvefPPNoUOHPvHEE9nZ2VSe5CL5CoqD3xxdX1Caq121smsOr/cQD5MfoO4TwW9aMrrSOWSMGQyGiRMnTpw4kTH26aef/uEPfxg2bNi9997rdDplWeaaUKwkVGwhR1ugO051JNkvwkvHvvxIgp5HURS/3+/1en0+n2pwSnUrBoNBu93OVVwnGTJkCK/KYDCMGjXKbrfTvwUFBWPGjGGtn+AJEyZ01U4BiCMgCAHoBXQ7YRFaCEO5BUYY19TlqEKYdA0RqkCmHm5hjKOyLAWDwWAwaDKZGGMXL17cvHlzeXn53Llz586dSxMM8k3EpHmi8KbLQSPr2j5WTx1WD6E6QJXcVZXhpkL+sPCgQV7s+uuvz8jI2L9//zPPPDN+/PgFCxaQdOS+u5FosPCt1Y3u61A9YSrXot1FZw4BgKiRJMnv95tMJnq/RcKLL744YsQIst3x51f16tN+OmlYTZIkn8+XkpJy7dq1v/zlL2lpaUuWLHE4HEeOHFm3bl1BQcE999xjMpn+/Oc/r1+//uc//3n//v2fe+65kydPXr58mVeVwA8IBoOACAQhALFCdC6jqiipHvt6hbEwaA0RSl9NZij6GYY/alEeUG/p0KFD69evb25uvu+++4YPH85arYLa+0QRJhhgmrPNCQaDWgthgl0LcqDl/0oh5l3gK1XnjTqXo0ePHj169FtvvbV+/fqmpqZFixaRg66oscM/aKEs+bpKTPcS6NYf3ggZapMEu8QgrvF6veKk8D3MCy+8IP7717/+lS//8Ic/5MsnT54cMmSIONYJQMIDQQhArBDdh6d3HTJVgkdlgdGl571bewXRO1FXqvFTJ67ho92bN29+880377jjjgULFtCvfr9f1TsJ4woYKshNG5CTABdC12WUUIkufviiUBQ1Ib9esizfeeedN9544zPPPLNx48b/+Z//ycjIIPdRlUUi/EMXyenVVYZhqu3QJUuA6wsSBu4PzxizWCxms9nr9eqW5I+n9pUVBdpHTDtGSf4CSUlJ1dXVO3bsIEHI2n7jOtmMWANaF4hAEAIQK3Rm2gnxzd5N3612Q+CY3iGEGmTtU5+iUAerEoeMMVmW3W73k08+KcvyD3/4w0GDBjHGKFZQlR2U6fVUwisKRVFUBrQwbYtTtBZC1tahOszTIV4OssSmpqb+n//zf/bu3fv0009PmTLllltu4ZpQrLDd4Q9ebSTF2qULH/YEu/og9uF3rMfj8Xq9saayyKmep+xiiLYFfQYIQgB6ga416Kn0QPd9t7RdbdY2Lqtdx8g+i9I20lJcKd4MNTU177zzjizLq1atKigoCLWhrrBRrdQ1HmoFYax1yKJAZSHUdcvUPXW6p5FfFO6+O3PmTL/f/9FHH/l8vsWLF/OQQtZqWOhCC0YPkwBXH8QRse+BSU9EmLl8EokYvxagh4EgBKAX6NoXcfjIou7bUaiVuh6Mffzbo/UU5f9yF8TKysqXX345Kyvrscceo1/9fr8sy6pEJtrTG7mrodKaVzOS8jGO7n1O5rvwG4onTeXZy88GXRFyQDWbzXPmzCkpKVm9evXGjRtvvvlmqTX9D4tYE8bveQagrxHqfQtAAhO9ixoAoGuJOqmMKtBC6jb4HlV71zZJd1nV4CgONvZRHZoYCcPaTsJB+Hw+uu6HDh365S9/mZeX95WvfIUxRhMGGo1G1V0hCaZCVVUq1a17hkNdr3gk1PkP34ELX5UiWBQVRZFl2WQykfDLz89/+OGHDx8+/MMf/vD8+fO61wIAEAniswMAiAUgCAGIb1RqrWf2KO5aXBnKVKVa7uEG9yTaQwt1vLSGglVOnDjx3nvvrVixYtWqVax1fmRxtgO+Cf+X96jE+sPrJd2fFCEcLk4RD4cm7Wj3AonbSsLhq64Oa52agjJhJCUlPfzww2PHjv3oo48uX74stR0i0dYQqpEA9HHEID0AQCwAl1EA4hulbZrE3moDX5b0fERFw0sPty0WUCk6Jkg7SZKOHTv2j3/847bbbrvuuusYYz6fz2AwSBGkilGdTJU+YXpXQdG4jDLBjNkFh9obqI4xQvWl6GV8DVVMkiRKl+90Ou+55541a9a89NJLP/zhDy0WS6irwOL5lALQHfDBEW2KrJglgZ9iDFQBEQhCAGKF6D48sfBOD9OxFi0tPd+wXkSrTLRSgdxB165dO2DAAFKDlFCUT8EsFtaV/bpntUOnWlfAxy8qC2GYgwp/l2p1u8lk4n6kt956a11d3SuvvHLPPffYbDYeTMhCPMW6D0gCdzQBIEI9gEZjTHc+I3yHAJBIxPQzCQBoF60HYLfuTvV11BqXwgR3dWvDYhOtbZAjSZLf73/qqaeGDx9+++23M8YCgYAsy3zsXKWulRAz5jG9LouudZG17eioSrL4vEbaA2y3A6f7yEh6kzoqbdPA0nIgELDZbPfcc8+zzz773nvvLVu2jHxKZVnW9Q5Vuen22SES0McRR51i3EIovidDvUsBSDAgCAGIe0K5F3YHqq4tvpEc1SVQnShRbFCIIGPs2WefZYzddtttTEhZqU1zor2+KkNTKCGnVe/awqH8UWOfSKya4SVueMt2KO1Nl89qtT7yyCO///3v33jjjVWrVhkMBtKiuteLRXCxAEhgVB+LGBeEItF5pAMQd0AQAhD39GQXU9dCCEJpY5U4DAQC5BHKGNu8efPFixd/9atfmc1mmiwhVJpZRchNysLKmKiJx45OKJtedO5eWiOe6pxzY7jBYCB7oM1mW7Ro0erVq8eOHTt8+HCas54uolZmK8J8kgD0cUgQ6rrB9y709qivr9f9Fc8vSGAgCAFIHGLt49p3CGN2EwkEAiaTiTG2efPmnTt3PvbYY5SVhEsFRTNVPWs1K2nr1JoT221D+Ayc8UUoERuFCNQadcP464ozQ44bN85oNP71r3997LHHcnJyRAuhroYP1QAAEhjdd1eEG4ZyfhFHbUJVG36/ovWe+3vbbLbKyspQghCABAaCEIDEAeOXvUWodC8qt0OePvTDDz+cOHFiTk6Obm1iLhNeg1b/hJcTum6QTHOTiPW3c5CxR7s2Ul3HXd1iuieHabqkojj3+Xwmk2nUqFETJ078+9///vDDD6ekpPBgQq7z4z1KE4BOohV1EU66G+bZ6aZHqampiTE2a9Ys1geSP6HDAEQgCAGIexL+uxX7qLwWdQPJgsEgOUr9+c9/Hj9+/NKlS1lrEhSVMZBprH9d4ltFNSSSkVBLmKMLE9UZyjaou6yN8Fy1atX3vve9jRs3rly50mAwiDeAyk00Bn3kAOgZQo25hCqsKMqKFStef/11WtPc3MwY8/v9iqIEAoFgMBgIBHhcNHndk0++3++nWF/xLUoFaHO/3x8IBAKBAF/w+Xw+n0+SpDNnzjgcjgkTJqgajMcWJDwQhADEPfEYAJaoiNdCFexHavDMmTN79+596qmnLBYLT4mpEpCqNbxfojKIRXHRQ/lQJeotFOagdJ3HItmcKz2j0civyL333rtx48aDBw+OGzeOMeb3+8k3mIW2wSbkCQegS6CnjKtBxpjD4ejJBmjfxj25dwB6HghCAOIbfKhiEK1lj7oU5eXla9as+eY3v5mSksI0dkWmGY1W+Sh2U1PjOtlJ+JMT4anTyniVIOf/qtbwMpMmTTp16tTf//73cePGac2A2jZoVWL8XgIAOkq7dzsVqKyszMrKcrvdZrNZd8N2/bH56zfUVtqVciudGXoDIO6AIAQgVujkVwcfrdhB6yXIM4vW1NRMnz6dhfVBCuOv2MmGaXca77dN+PZH7p8WYTFdJ95AIGAwGG655ZaKior333//tttuM5vNum6o3XFNAYg7dB2wtZw+fTorK8toNIaKOeyZx0c7apMYHqR4+QARCEIAYoXE+MYAjmhWkiTp1KlTDQ0Ny5YtY21DBzskEjpzk1C1EaZzSCTCnzRdm4NqpcpaqOrOUtLR1NTUlStX/vjHPx43blx+fn544yQCkwBoF/K71npSdJRQT2K7/gWhaoCUAokHBCEAsUJ0PfUwHy0QC/BcMqtXrx4yZMjkyZNZ67yFkQsV7XKEHSNtXyqUu1QC3zyqkxCJAgxfm9ZOSFe5X79+ubm5paWl+fn5fGoKFkJGJvAJB6BL8Hg8TDP7SxfW365/QbeO0PU6eAUBEQhCAOIbvNN7jMiTgmhVuqIo586du/XWW1nr9PTaoDXWtusTvjHtXnfdGhLePNjuAYZKq6P6N5TZVuySiuGXJP8kSVq+fPkHH3yQl5c3evRoUomRXKl2RwcAiF+i/kj5fD7Vml55TPBsgr4ABCEAAEREGL+jUOV59ODRo0fz8vLy8/NZq3kw1ObtZhmJZJg88qH0+LUNRmhn08p43esVXVyf1gY4ceLE1157bd++faNHjw61d9364/QqABAJ0VnFA4FAJ2sAAEQIBCEAAERJqD6Kyojk9Xo3bNiwYMGC7OxspmdrCrV5FL+GgfLmqWxoUkcmB4spok4YE/60a69pJOsJMgmWlJTU1tYyxmhOwq46EADilzB2+DB4vd5QNfQ8iWcn7PVTCmKKBHcfAgCAbkL0GOQRYnxZXNPc3Lx///6pU6fKsizOnC4W48td8pHWrYTMlVqDpNjUBKCTx8JtfdrrqN2R7k9jxoxhjJ0/f16sk28ixhMC0DeJ8P7Xuoz2IlLC0dtnFMQWEIQAANBhRPmnXcnapvQ8evRov379dKfS4h/mLv9Ca1UHqUFtlF0i9QwkjQk0ukq03SZa5qJdtV7c9dSpU4uKijZs2MAiSKwPQB8kwodCHD4DAHQrEIQAxDfobvY8KkmgMhWytg5RZWVlpaWlixYtosJa9RWJGSoKdKvSWgjjl+44kFBnMvwFEhfIa3TYsGGlpaWqAvyuwPA86ONEeP+LLqMAgG4FMYQAxApR9xETposfXyiahJO0LK5kjB0+fPjatWv3338/05gQRfUoVttNDSYdojWgcc0TZsNualIYIjkP2hOoUrzRnUytWU/3YqkutDgKkJ+fb7PZTp06NXjwYN4k3YapbokoWgtAzKK9vcXHpF20SWVE8LwA0IVAEAIQK0Tdee3yloDwiL153r/R7eIzxqqrq9PT0202m24BriV0xWGXN1s7C0LM3j/RNUyWZVHxRn102g1DOX/qGortdvuQIUOOHTtWUFBAl163wujaBkC8oL3J6fHk4jD8V8/v94epCgDQhcBlFIBYgaYv7ygwD/YkqgHv8B0auqDV1dUOh4MJ2k8VN6g1LbJOeIpq3R05lGU0lM9qJ89MjNCZYwl/9liIrBJMcx0ZYxaLZdKkSYcPH25sbGRtRxAS6WwDEB0kC9t9EFQpuLq3TQD0bSAIAYgVIvngwc7Qu+iebX7hRJ8oorm5WZKkoqIiXiCUctMa7roEbZ26SWXi5S6KRPRGnVQm/NmLpGF8mTE2bNiwioqK6upq1vYOiaJyABIG0ngRZouBhRCAHgMuowDEE1rRiHHTHkZq6yIorlSEBCQkSz7//POMjIyRI0cyPbnYw0iSpHUZjSOUEEGbIlJvZ/XkDXA4HIFAoKqqSrdYqPYDkJAognd9h7bqthYBANoAQQhAfINuZe+i6uWQHuAXZd++fVOmTKH56EV6QA/oWh1DZZRpV2ixHu+cSW0daMVlsbWqkp2xEHYG1UmjRubm5l67do21zlAvilU8tqBPobrhI3xIRQshAKBbgSAEIL7BGGoPo7UKhurcBwKBysrKwsJCxlgwGOySZCdRtFNcYzAYVKGqKimoOiilbcxk97a4LSqxpxW3uluFyjKqK9i0e1Sp0E4e8pQpU8rKyi5dupSfn69qBiyEoC8Q6gUS4WdLG0OIpwaAbgIxhAAkCAhM6hlEv1BxjXbZ6/UGg8HU1FSm1wEK3yWKXOeLoXSqrVT/6kav8W1FBSgJWU97K+ZNt6mqZSojrjcYDCrhHXXjO3/Io0eP9ng8p06don9VQY/ai9VuhCQA8UUnXyCiIMQHDoBuBRZCAOKbCC0noGvhFp4ww94mk8lsNtOyrrbpEgdCcdt26zEajdobhoSH1ngVm1as8E2KsMGh4g+jbFMI7Ha73+9vaGgIta9ITnVsXgUAooNeehEmlWm3HtAZ8GIBIhCEAMQK0cU+4bvY86hi2FiIXCZGo9FkMoWvod1ddAat9lMZ0LQ6UKUPY+ru0nVnVRkJVTGEPexmphJvzc3NjDGadCRUSV2zZ6jlnrwcUo/MjQkSG62TQoc2b3faCdycAHQVEIQAxDe6X0RYFXoGlTJU/et2u8WYvd7qXvOevbYBKiOnriaMhRspciEUCAQ6ZDLtWlRnzGazmc3mdhNjRGLzVLmPhnGmDbU5/7fdwrxOfieEbz8AoQhj9+6qqgAAXQIEIQDxh9H4/57cLpEZnfQY1N2812m3VbpHGr6kbgFtVBgVOH36dFZWlsViYZqkMj2D2DCDwWA0Gq1WKxktReEkLoiasIdb2y68bfSveEWCwaAkSbIsm0ymQCDAGKM1vdJI3tT09HSLxXLq1KkFCxbQSlXOG9VWTGOXE5e1dmkR3fszlE9y+MJimRh5lgEAAHQrEIQAxAqRC4Z2bSAd7cah28dp93xqC4Ty67NYLJMmTaIwQlHD9xiqpiYlJY0dO5YyXvLgRkJRlEAgQLMUxngMoa6zJTfDTp8+vaCggK/vFXus+O+oUaMOHDjANCa+SLbVonWXVXmc6g7rMD0xGUdRoyDx6HwMIQCga4EgBCD+UKmLML5kUaMNbdKia0kL82/PoHV7U/3bhb1elQFHdbxXrlzZsmWLw+EoLi5uaGgQrVsdQhsUx4T5FehX1a6Tk5ONRmNDQ4Pf7yfDlCzLx44de+edd/Ly8h588MGamhq/319TUyPL8tixY7XheTGoENpVO4yxiooK+pc/I83NzSR0uc1QXGYaW6JYrEMRUGJhWZa9Xq/T6dywYQNNRRjJoWkfH91APq0XaKhGqs6Y9mrqVhs7VxwAAEDPAEEIQPyhEoRd24HTuoq1W7/Wi687GtZRtIegOrRQzY688vDHm5SUVF5e/s4774wcObKxsVEV3hYhXPXxnjotkw7kFfICwWAwKSlp8ODBK1asOHTokG6d3/3ud8V/Z8+evXXrVlmWdbV07PiOimGNqlYtXrx4/fr1tPyNb3yDFpYtW/b444+73W6Px8P9SLlLJ3c05X9ZWwOa3+8XHzQq1qFoxuzs7NWrV8+YMYNFNQkbEYlXc6hfO+T/HINXHCQY4vuqo9vituxyMPQDRCAIAUhw8B3teahvPWHChBdffJEx5vP5oo4h1DUAstaANP4vV0qBQEBRFJPJNGTIkEOHDqWnp9fX12ttSiT/TCaTx+PZtm0b08jjmL1txHbyRq5fvz4lJYWMgcFgMBgMBgKBNWvWKIrym9/85vLlyx6Ph7VGG+pqQv4rVUhlfD6f+G+HUBSlpqbmZz/72bRp07SHoGtL13XsZKFHLsIYMCPp6mkDF7XbwmAIOg/uIgBiHwhCAOIPipJyuVzc6NQZYxfoQkSxIUkSOStSQpfOVBjqsqqUA+20sbExLS3t4Ycffuutt+gmCVU5ySRtndy7NUZuJ22eFaaRQ1artb6+nlJ6yrJss9lcLtdXv/rVoUOHDho0SOV+ScJP5TuqqtBgMPh8vs6cAVmWjUYj1+26Zj1dqc/L6zqR8n+lCGII20WrKsVtY+QGAHGN9i6KIoYQtyIA3QoEIQDxx6VLlxhjTqeztxsCup0oukFpaWmMsb179zLBxtUuuvGWHd11LyLO7qAoCh34woULWScy+nRhKiDtydR15mRtdW94J9VQYYSh9q76q7IK8lGMiI4HgO4HuWcA6DEgCAGIFSL38mpoaHjttdccDselS5e8Xq/L5fL5fIFAwOv1ejwet9vt8/m8Xi/99fv9fr8/GAxSfhEeTMVCfG5VOTaoj0imSN6D5BuKC7SVGIulDbsK9YFv152S6lEFzoWHh9WJ3pW0wP81GAwq30ttS1Rt5gdF6B4UL9P5qSa0LRcXtPj9/pycnOzs7P/+7/9mjIUxD6oIE6EXI3DTpSiWeLN1b62qqqrMzEyfz8fTkPYwoTS2aiGMm267obCsrVFXVZJOUSAQ4L6ykiSJdksAep4In0cMTwDQY0AQAhBnUCfv7rvv7u2GgFgnOmkXyieT9Xj/LJS7LNc54kpR+vJNuE9sb6lc3VjByDfRXdY9Lbol6Zzoyj8aITIajSqDZIeaCkCH4MMWEZr+Qj0LoEuA3gYiEIQAxBlK6ywC3FymG2Gl2qSHW9iTu9Olb37qxBAyMgp1ppJeR9USrXQJ01+kf2nSRSb0ROOIUB6hkR8If0s899xzBoPBYDB8+eWXFovl8ccfdzqd4a00cXe6QBxht9sjKdbRPEkAgKiBIAQg/qA8ir3dCpCYxIKe1xI+uU4ojh07Nnz4cJPJ1D2N6l463wMmNZienl5bWyuu/93vfqcoCvlL8ywyqhjC2LwNQFzDhy9101mFJ1QiXABAlwBBCAAAINZRWcLDw/uOjz766He+851jx45lZGSYzeba2lqqh1LOUFQtzVGhtE5BoSiK1+u1WCzZ2dmlpaU7d+7s37//zTff7HK5rly5YrfbKZ5WOyLDlZXf7zeZTH6/X5bl2tpaq9WakZHR0NAgSRLFtYZpuSzLLpcrKSkpOTnZ6/U+/fTTc+fOvfPOOw8dOuTz+SjJTSAQ4JOR8IBSSmZrMBhaWlqSkpJsNpvJZDpy5EhVVVVtbW1ycrLRaCTJZzabKysrt2zZcsMNN4TKIgM1CLqVK1eusE7cZrg/uwToaiACQQgAAOD/ESOBZKFCB0OV13UZXbVqVUVFxX/+539u2rRp/vz5Z8+eNZlMPLUSt4lRwhWeD8nr9ebk5OTk5MyYMaO0tLS0tPSFF17IzMw8evSo0+l0u93aDC58W8rA5HA4AoHA/v37X3/99YEDBz7yyCN+v7+mpkabtpQkIpeXsiw3NjYOHDjQaDQuWLCgurr6rbfeevPNN6dNm+Z2u71eL01lwVrVIB2CLMvBYJAknyzLeXl5Z86c+fnPf75mzZonn3xyzZo1jY2Nqv0mJyeLJ03RTGihe1YBiA7V45ycnNzQ0BBdPbgnAegOIAgBiEt0Y6IUzcwBPduouCfMGYu7wdQuufqxdtRhMqnorr///vt9Pt+bb76ZkZHBGBs4cGCHdnfLLbfs3r07JyfHbrdbLJbx48d3aPP8/PzKysrhw4fn5uay1ulDI2fo0KF79+6dOXMmY6yoqKhD2xYWFubk5Dz88MOPPvroP//5T5qDZOjQoc3NzZcvXw4Gg+np6dqttDbYWLsBQGJAgrBD6k6boRcA0IVAEAIQf5Dvme76rtpF+O90An+SE0wThmozn5ZAnI2gRxsXFZFbCIlgMOhwOH7xi18cPXo0Nzc3Pz+fbIPamRt4DRRcxxh76623RowYcfr06bKysrVr186fP7+goIBOV7spaoLBoMFgCAQCGRkZFMFIHqRhtqK9BwIBk8lUUVGxZcuWe+655/HHHz958uTatWsXLFhgt9vJu5Wapx36IUujyWSqq6vbtWvXzTffPGDAAMZYWVkZFRs7duyJEyeqqqrcbrfb7eabqxRgHN0PIE6JIgYetyUA3QoEIQCxQuRjpdznrbdIYNsjed+Ja1SzDsYX7drQODy8LV4OMxLzQnV1db9+/UaPHu12u48dO5aXl0eZVEiwaQUzV4OHDh1qbGwcOXJkcnJyenp6U1PT4cOHbTZbRkYGxRCGbwCN1wSDQfLzZK1hfu0eDqnHrVu3lpeXr1q1auvWrU6ns1+/fq+++uoDDzxgNptp76qEq7wltPmbb76Zm5u7aNGi3bt3NzU1UbwWY+ytt97i97aYaCfM5BYAdCH8EdD6TuuivQlxW3YhUNdABIIQgPgjLS3thRdeyMvLO3z4MIU8Ub/T5/O5XC6/3+9yuZKTkysqKioqKlpaWni2DL/fbzAY+BRkPIBKuwvaxO/3s9ZeMqWyoPQbFCVVVFTU3Nx87do1ym4vRmEpimI0Gr1er7Z++je8hZNn+OjQQLKqTnFKd91Z3fkCZeMoKCh48cUXuW2HtZ3vbs6cOWPGjDlw4EBSUhKdBDo6fkLo0Hh53nGJLh+seCw8IaTqLykBnlCEVvr9/vT09P79+//pT39ijI0YMSI1NbWxsZGMS4FAwOv1KoridrtNJtOlS5doF9zuJBI73QXdXmAkXcOmpia32+3z+WbOnHn06NG33npr+fLl4mXlmlCs7dChQxs3bnzooYdkWT5+/LgkSQsXLnz33XffeOONb37zm6KkZHpnSbz0Xq83jE1StQld9C+++KK6unrFihWSJJ06dWrKlCmDBw9+7bXXdu/ePWfOHEpXQ1efV0hph6mTffz4ca/XO2fOHMZYc3Mzv8QOh8NsNtfV1dHuOprmMXZuBhBf6D6nzc3NkWyLuw6AHgOCEID44/Tp0xQCNH369PAlGxsbHQ4HiQHqB5PQUn1oRdESKp8El5TJyclXr17lvnCJxD333DN37lyTyaQywK5ateq1117rrVZFxz333DN58uSPPvooLy+vvr6eJARX442Njbm5uYcPH3700UfLy8sbGhrS0tJowxjshIXXUdpljtVqZYzV1tZmZGRMmDDh8OHDNBEFjYawtnc7qWu/379r166xY8empqa63e4vv/xy9OjRjLHrr7/+6aefLi0tHTVqFJ1Jrsr4rlVhTjzvqG7Lxfke+CYtLS3vvPPOihUrKGjw6tWrpBIfeuih119/PSUlZdy4cTxfqNh4UoO1tbVvv/32vffe63Q6GWNNTU0DBgwwGo1+vz8tLc1isTQ1NfEMq+2eXvHEwjIDOkN0bxXxrovB9xIAiQQEIQDxx7Vr19LT0xsaGmh6X9F1LRgM+nw+h8Px/PPPP/zwwykpKbNmzWppaWlqauLFSBXoikBeCS3wNPes1Wbo8/lSU1NPnTpVUVExadKkrVu32u32xsZGi8Wia/TrKIowJRqZOjtZYbupd6hMU1NT//79aXfcVsYbc/r0acbY1atXU1NTuXUxZnG73UlJSaSF7rvvvqqqKm4eJGNmIBCor68fNGjQF198wRj7+te/ztUgCz0feozQIWViMpn4OIgsy0uXLn3jjTeSkpL69++vElRK6xQOL730EmNswYIFjLH6+nqr1UoKKiUlZcWKFX/6059++9vfOhwOrV1RtUwFjEZjeO840VDZ0tLyj3/8Y8KECcOHD2eMeTyeYDDY0tLCGMvNzXU6nRs2bBg3bhzT6EmqxOv1bt++vaSkpLCwkDEWCATcbrfFYhkwYMDp06fLy8stFgsdC2vNMqo9CgC6FvEW5WORSUlJNTU17W6rcpTovkb2TWLzDQ96CwhCAOIJ+rg2NTUxxqxWq25fk/TM1q1bf/CDHzzxxBPd1JL6+vrU1NTz58+PGDHCZrNFGBPSLtRxp2Wz2UyKtwcgRUTCz2QykR+mJElms7mlpeXQoUOMMafTSSorxrHZbIwxs9n84Ycf3nTTTeELf/rpp06n0+PxWCwW1U8x3gOLJIaQ1C/Z/cxmc0pKitPpPHbsWP/+/bmTM/WK6KkpLy9vbGxcvHgxbe73+y0WC+82DR48eMiQIZs3b7711ltNJhO/V0WHT9bWDVUbeqoIOWl4Mdr2yJEjpaWlDz74IDXGbDaToKUNV65c+eabb7711lt33nmnKuCTym/ZsuX06dM/+MEP+PlxOByMsYsXL9IanpaGcs906EwCEB1R+3urEO3tuF0B6HIgCAGIP8hoEMYVjTFWVlb2zW9+kzFG/b92c1qEQZXPkKKVUlJSGGMXL14cMWKEbhtUFhim50EXyqHO5/MdPHgwLS3NarX6/f6oW66aB1zsstNP1CSj0eh2uwcMGPDUU08xxijOiiDPuiFDhjDBcsg0JhrV3zCHFgUdqooXbmxszMrKYiHiAznZ2dkul6t3cxRFR+SdQvHmX7Zs2TvvvLNz586ZM2eKQaqSJLnd7r/97W+LFi2iy830HrFvfetbv/71r2022/z587U3OVdWfH0Ye7LSOmkh6cOysrIdO3asWrVKzHZjMBhoc6/Xa7fbr7/++j//+c/XX399ZmamqOIkSaqqqjp//vz8+fNZ6xWXZTk5OfncuXO8WCAQ8Pv99G9SUlIUZxKALiHMGykUcF0GoFuBIAQgVog8+4gq/EkXq9X6k5/8ZOvWrZQxpQvaxxgTZrw4ePAgYyw7O5sJSk+0foRpfLsWiePHjz/zzDO33HKL2+32eDwqXdfRBvNlMc0MN8tQGb/fn5eX9+///u+///3vKZkHY2zgwIG1tbVTpkx5/vnnWasDrfYYQ3mlaiPEIkF3K60mVGls7V6am5vr6uq4h6F2L3T4p0+fbtfsGSOeRdFZFegwpdbkK0ajcdSoUZs2bZo2bRo9Fzwdy4EDB2w2G50xyrpEilFMlWQymaZPn15aWjplypTU1FT6SVSGqntbayEUxwuU1okiGGNr1qxJSUm57rrrWOusFWJttKOioqKlS5e+/vrrd999d1pamjjQ8/LLL0+fPn3UqFHivux2+8GDB2lbg8FgMpnMZjOlk1FFZ6GfDXoG7t7c2w0BALQBghCA+EPMW6iF1i9evPjRRx/t7q48TXTWrhtPeF2k/amurm7s2LErVqzo6va2z8MPP0wLjY2NFGfFCaVLQ1nwdBVCu/CqxAVtDapi2jLauB1dKMgtfFRkXKgF3Uby+CXRt3PYsGG1tbVvvvkmmePoaTp48ODu3bu/9rWvsdZwWdZ24ICsebIsL1iwoK6u7rnnnvuP//gPfkvoXqMwtkG+QGpw165dJpPp+uuvZ4zRXngxng6XbrMZM2Z88MEHu3fvvvXWW/lAz9GjR5OSkshWzxvPWi89HWBOTk5JSQljrLm5+fDhw19++eW8efPCnDoAuo/q6upO1hAjo1QAJAwQhADECpFbCLXDq1pN8p3vfOdrX/vatWvXxIQiok1MuztVDbyAOPUZQXMb9OvXj7u3ReEtGaaM2WxOTU3V3XX3oShKIBDweDxJSUllZWVlZWUzZsxoaGiwWCxcMoUx2bVrF42iPZHUoBWQBLkKq1qr1d6KonA3Qt16YlAtiFchfPPkVri4olMxderUnTt3UsZRmohl//79w4YNo+S9ornPZDLxXdAclbIsz5kz58SJExcvXiwsLKRHKdRIh9ZlVBsH5fF4Vq9e/e1vf3vgwIFMkJG0L/EAac23vvWtd99998svvxw7dixjrKysbMOGDV/5ylcoDlZsicvlmjx5clZWVmVlJc1GaLfbLRZLSkpKZmam9nwC0DNYLJbOTHzS7oMPIgEPPhCBIAQg/ghvL6KPpSRJdrudLHjd3Rjezw5ThnUkFo5yqDLGSHB2VVPbxWAwUEaWc+fOHT9+fMaMGZRPUtUXieQowlyjDm3YrsYOpeW4r2NHlaqqwhjsNHToltD2HemOXbp06bZt2/Lz851O57p169LS0m6++WamsbCphlFoITc3d+XKlS+++OKjjz6alZXFi2l3FOrmEe2W69atmzp16tChQ5neyecjEdwI2a9fv+Li4q1bt5IgPH78eF5eHgk8ih7klQQCAbvdThZCRVEaGxtpYkav15uRkRHd+QQgavjjwN/wkYO7FIBuBYIQgPhDtBDqmqoUDV3bALGrKprOVD3gUGJDVUAVVcUYo0gnnsWxZzSJ1BpmxhhLSkqiDI2s9QCVtqGPYpO0mq0zDQ7jfRp5edaaYLPdwmQ61h4OEYOdsPA3mLawoii6MbQlJSXl5eWfffbZDTfcUF9fv3jxYjIAqkQ10zOomkymoUOH5uTk7N69e/Hixbr+oqw1mU0oxU7Lmzdv3rt37+9+9zvt4YhThnK1SQ/FpEmTbDZbWVnZ8ePHHQ4H+ZpqXwUWi6W8vJzy+0uSlJaW5vF4qCOOIC7Qi2hzGgMAehcIQgDij3ZzQnKHt+5uCbdGsraRUWIztJu0W63H49E6FInBWqKHatQtVwk8sUKPx8N7zFo3S9a2893JlnQTossoR2vCIsSSWtffGJGFUTSGxLyYSlSUVZS08xvf+Mbp06fNZjMXYOIFVaXnpXEQKvC1r33t+eef/+STT+bOnasaCxDvK9WMLPyRkSSppqbm7NmzS5YsUW3CLeqU2IYJT7SiKIFAICMjY/bs2bfccktqauqzzz5Lc2CIxkzC7XbPmDGD79ftdpMLazAYJOdY1R4B6CZUb0gxyW10NQAAuhYIQgDiD5oLgQglunrSqhZ+ud1NtErSZDLx1BosAodJrTbTdbxU7UVsgGoXwWBQdZJ1ZWGEh9wr+P1+Pgs5R2tbI89S3QOJNZ2ge+HCb6K6cNryXq+3rKzMbDYzPZHPrXNihdxibLPZpk+fvnPnzvHjx1PIK89NygubTCbxRuKVUyUvv/zyyJEjKbMo09xC1AbRQK2q58iRI8XFxTQBjK4jAM1Pk5qaSjOpUAIhp9MZCATEeQi1uwagm6C79NixY73dEABAG8JllgMA9CSRJ5XRdjFV9GT3TpRzYq9U67Maif8qtdxisaSmplIaDF6b6CuobUP4fr92DXesDVUmkqn5VJtHfpjdga71T1tG9xqpLIS9dQjh4TeA9tqFgqbj4y6jKjteWVnZwIEDN2/evHPnTq/XS9F34o0kSZLBYFCNJoj32JQpU6ZMmfLCCy/Qr6pHmDbns5Xwv9SejRs3OhwOPs+E7vHyvfOd8hkpzp8//9xzzz388MMnTpygOrVPh91uZ63eoU6nMzs7W5KkpKSklJSUjqb0AKALoaGKdh/h8NmPAQBdCB42AOIJ6vOFEYSiLOnJJrHW/rrYaw+1RtVacSUtOJ3OrKysL7/8kgldc93jUtUpduhVe9eKHG3L+U/aADxVgVAmNdVOewB+RKo9hoohVJ1tfgm0ZWIN7YHongfdQxbL0JpgMPjJJ59MmjRp3rx558+fp3k1RaM0a/UXlTR2bFpJa6ZOnRoMBktLS5kmMorOrSonDf2trq7evHnzypUrHQ6HEsIALgmCkLec1OC+ffs++eSTW2+99a677iorK9uzZw9jjNKlijVkZ2evW7eOOt8pKSnBYNDtdtPuXC6X7ukCoAegJ0X3tgcA9AoQhADECpFbCMMYr3j/NY6+tSqRpihKUlLS0KFDjx49ygeSRTUohRCHWntdGEuX1qCn2lx1khU9WFudqVum+2DtOdNGYuSk2LN2i8UpFC+n+9OaNWsGDRqUn5/PGFu4cOGZM2dOnz5NP/FzQgJMlZNGEjxpFUUxGo1f//rXP/7447KyMtbWMEvGSe7zSfl7GGNNTU1bt25dtGgROZqytklEOVSV1JrrSGoNbgwGg+fOnaM5KiRJ6t+//4EDB3g9Yg0+n2/QoEGDBw9mjJWVlV2+fNlisZjNZq3LKAA9A92iQ4YM6e2GAADaAEEIQPwhWgh7WIR0lPAHojW/sFa5O2DAgHPnzpG3WyhLl3ZNV9mgeN+9a+vvWljYjKDaQ2B6ZlJFUVSasN2r1rtIbc19kRTmiWGUVn1VXl5eX18/bdo0xlggEEhJSSksLNy5cyfT2H51ndZUJz8zM7OgoGDHjh1MSAdKGI1GrieVVmvhJ598Ul1dPWfOHNY60ya/KOLVkdrKUb75mjVrnE4nbc4YGzZs2JgxYz799FOmEcDNzc0jR44cP348/RsIBPx+PwnCyIefAOhC6KnJyclhEXiEwmUUgB4DDxsAoBsJIxRDKUZamZGRoShKdXU1rRS74OKGWnnTJdpVCWFea1eEKL1kKmQa65AkSdpOvygmWasa1G4Y/hhjhEjaSYJKpSFramr2799/xx13iKa/qVOnFhQUkKziU/lJehZC1d7pJC9ZskSW5ffee48JmpD0JG2utMq5K1eu1NTUzJ07l7Wd85DpOfSazWZVn7i2traqqoo0Hp9qcvr06cePH79w4QJrq0jpV7qTnU5nRkZGS0tLMBg0m82URweAXoGmQmkXCEIAegxkGQUgVoi8I95uUpnYRxIMg6EESXp6enl5+aBBg8QeuaSZDJCLIrEzHQVK2ySTWpdR1UKYeqJuQ3ToakK/369tiXaNVjeKZWJQHIY6vdr1JMZohgm6uHQjnTlzxuFw0LwL3EBnNBqnTZv297//ffLkyXwKSl4J/1d13/J/jUbjlClTNm/e3NLSYrfb+XmjaR74MmPsnXfemTVrVklJCdOcXkUzFYo4ZYUkSV6vd/369YsWLSIDi2j2vPHGG8+fP5+RkZGUlMRroAOprKxkjAWDwYyMjLq6uitXriQlJYnTTvT8HQv6Jvz2vnjxIuvg60X3YwEA6Cow+gJA/BHjXfZIUEKY9ZgwKjxmzJjz5883NTVxoweV0doJxa551EY2lZqKd586XQuhFq2FUCTq89l98KNr987nSk8sfOrUKY/HM2/ePDp2HuPHGHM4HLNnz/7kk088Hg+JQFmWjUajykyhtL1b+EJxcfGsWbPWrFmjtN6isixzEx9Ju8OHD6elpQ0fPpwJs94rrVlqVJ6okiSZTCZqCYX8lZaWWiyWgoICpsm7W1JSYjAYPv/8cyZYOG02W0NDA1kOZ82adcMNNzDG/H6/tvEA9AxSa9owFsHtp7UQ9uarJ+HopksM4hQIQgDij3jXKirE3rAiGEmuv/76mpoamrFKO3O6yvWxk1841eZSjE3BF4ZQ0ijybDHaklIMQy2M5HIbDAYeL8c3PH78OCVZEVdKrZd71KhRHo+H0tuytllhwkObDxs2zOv1HjlyhFaSWyZ3zrx8+fKuXbuWLl1KGo8fjhQiCy5rO5nEyZMnz58/v3z5cqax6dG/kyZNYoxdvXqVr7dYLM3NzWQhLCsrq6+vJ9OoeBrbPTQAupxhw4ZFUgwuowD0GHAZBSD+0E531lst6TxhuqSZmZmSJO3Zs2fy5MmqY+S6UbW+q06Frkbqkpq7CW3zlLazC6qKKaGNzHF0pEpbO7OqJM0BGAgEuM/n4cOHR4wYwf0tpbZjEIqiyLI8d+7cL774oqKiIicnx2QyiRPN8wbo3rRUz5133rl169asrKycnBxJksSkMhcuXBgzZozVatVtrep+Vlp9XJOSkmjNmTNniouLKW2M7uW2Wq0TJkzYtm3bwoULpVYTpd1uT09Pb2lpKS0tdTqdeXl5p0+f9vl82lMatTiM8RsGdBVKW5fmyBHvEFomg3mH7hzcZgB0Kxh9ASD+SCQLodb4QwsUwpeTk1NfX89CCB5VP6MLewxaNdVlbjrdQ6hzG/4wpcjcSuMUg8FAIYI06Vlzc3NTU1NRUZGqGDfT0UJ6enpBQcHJkycZYxaLJSUlRZtURtUtFs9zSkpKXl4ez++SnJxM3p7Hjx8PBAKTJ09mIfylmabfTILQZrMxxvbv35+ZmcnzhYqFxa2cTuegQYP4/BlGo/HKlSs022FRUdHo0aODwWBlZWVdXZ32dEVlr+3Khw7EOOKTEvUdQi8cchmNcI8AgB4AghCAWCHyrrnKf7J7mtNzKBr/N6k13f+kSZNSUlJ27Nghdiz4sm7HustllbjTmEX3rGrvKNWRhrI1xQuhrhQtBAIBj8ejKIrFYrl8+XJZWdngwYPJNKG0hqSSKVhVVUlJSXJy8okTJ2pqapKSknTzzUoasyFfHjlypM1mKy0tbW5uzs3NDQQCbrf72rVrxcXF4t6ZJg5QVVsgEEhPT6+trW1pabl27drQoUNDXSZx/dChQysrK8lx1OfzFRUVjRo1KhAIFBYWFhcXh0qVBEBPQpN2tgtcRgHoMfCwARB/iB193puM376d1OqwxzvH/FgGDx48bNiwtWvXiuUVwZwiLnetrAplIezGExEtUbdNkiQ+dUFcoCt9Q2E0Gu12u8lkampqqqqqysvLy8zMZEI2F0mSaIpCUUMqimIymcaOHWs0GisrKyVJIhdT+okLSE5QgOSWzWYbOXJkMBisra212WyBQKCysnL8+PH5+flMEOG0X37hxNpowkCDwZCfn3/16lWPxzNz5kyn06koCtk8+dkQG09tk2V59OjRgUCgvr4+OTnZZrMpiuJ2uxsaGmpra5OSkrKzs6klrHXiis6p8lh8IkD30e79QDeV3+93u90ul8vtdrvdbo/H4/F4vF4vuSvT6EaHHmcAQLeCGEIA4g/d72icflwVTRwghyYMGDx48F//+le32221WpVW0aha6IFWxfLpjbxt2uGDMBaqGERp1f+R6JDU1FTGmCzLLpdrzJgxfH2Yuea5d6gkSYMGDbpy5Yrf76d6xBkgtBuqkGV5zJgxPp9v//79Y8eOpbhB3b2Hv82ys7NdLldaWhr/NcykiHzbpKSkpKQkn8+XkpLCGPN6vRaLJS8vr7a2VlGUUaNGUZpT1pq8tDP4fD5Ro/YwisbVFnQriqIYDIbwt43UGr+q+8jQnEk33njj888/3+5TDAshAD0GBCEAvUBc9GPCfK1VdjzdXyOsnPdltdYG+ik/P/+6667bvHnzbbfdRvNPKEJGmfAt6QxxZDfTJfx8EpxQpz02EY1jLMR15yvLy8s3bdqUmZn50EMPvfTSS+PGjSNbmWoWk0AgwDO10BhEIBAgKfWTn/xk9+7dzz///JQpUyRJamhooIkNVXsUu62KophMpuTkZMbY9773vWeeeWbUqFH79+83mUwul6u5uVlUdLpVUQ1ms9lgMEycODE9PX3nzp2MMXJ/9Xq9VIZsm0xjGKfOektLy5/+9Kfm5ubZs2f/7W9/83g8NBX4hQsXTCbTxYsXP/nkk7lz59JO3W43PVAk7eiv6ExLZh+pNeKUn6ja2tqSkpLOq0oQX5w+fZoeEPFWpNEKRVGSk5MlSaqoqHj88ccPHjy4ePHiO++889q1a5cuXZo3bx7Z23/+85+z1kBxAEAsAEEIQC+g2+eOOoaw+3rwoWpWCVqlbXbEjlYeStpR39RoNN5///3f+973MjMzp02bpquldfVkFIQ5k3HhGhfe65VFdhQqrR5TdOgqKIpy880307KYjqWjzJ49O+ptGWOlpaV85ono6MyF+M1vfkML+/fvNxgMbreb/qU5CQHobj7//POf//znDofD4/Fwv2v6qV1BCAshAD0GBCEAsULk3T5teFuHNg+DtsMtVq6VCiotJxbT9etTrdRuoto1rU9KSpo4ceLBgwenTZtGBhxVVe0ee+dPTgyqoyiIRLfH8pFq75B2yxN8HhEpdIJQbc2yLJMNpKPmYr457Y4b1jpUA+2dB3lqNw9/+Kpn1ufzqWabCL9hJD9JmiDMHoPvOoqrEzWdGRUK/8SR8ml37tBYeDZ5lKC4RlWAFsQbuLGxUVUPd/fo7gYDACIBghCAWCE6C6HYRejkx1Ur7VT160agaZ0/WXsaVVV5qJAw8kEi57SHH374iSee+Mtf/vLwww+TYxLfUOq2SEIQ7+j2OMVbNPwj08mMO7oDNx3aPJJ8wrp3fiRd7VAKM8yG2p/g9QdCobqBVZ+PSJ4sWAgB6DEgCAGIP3S7iV0+Tq+1DbYbsKe7ia5BRhRyijAzuLgJl3k0t/h111338ssvX7x4sbCwUBISk0ZyFBGSYC6j0RGJAa1X6JJLEBfXsUNEfUSJdypALIP7DYBYBoIQgF5At88duS1CNSrfhb12rW0wlBRU2QZVFol2paNoTtTaCVWakApMnjy5sbHxlVdeefjhh2n+AN3GhNpXRwmfDTKBidkjDe8zGbPNBgBEByyEAPQYeNgA6AV0rXmddxntPGFCqnTNcdy4J9agFYccsTbW1ndIjCdU2mapoTqNRuP8+fNLSko+/PDD5uZm1Y6k0HThyDQGuQEAAACQYEAQAtALcM0jSqyos4xGEg3VyUbypobShKwjPquq2sRhYP6TuGu+I8bYypUry8rK/vrXvzJNWgKlFV5Y+1N4eDP4zATiYeoefuwAsQoAAACAKIAgBKDXUImQyCUHze3L0RVpUdDRxquWeT2RKENd2SYuq6yFPJiQMbZq1aqWlpb33nuPtdWE4k5Vy6JkDYPYDK3LaHRntceI8KpFXjg2CdX+WNbqAIAogMsoAD0GYggBiBVUMi8MqhhCRbCD0UIUnWPez+bbcknGy0h6Mz0oGq/RSBAthKH+ajeh/kFRUdGqVateeeWVlJSUWbNm0UQUPP290jYhjWpZPN5QO2KtCdN12xzXqMyt8UgCXAUAQCTE72sKgLgDghCAXkPVtY3cZVSUjrr94yi+o+H72VpxGGovXJKFqZAXUPRyjYZpGC9QVFT04IMPPvvssy6Xa/78+QaDQasJWVsFG6rNKsXLV6raHxddky4RS3FxpFpgTAAAAACiA4IQgFgh6hjCLtm7rumPtZWC4rIo6jpkmdRWqNo2lBVLafUdDQaDkiTl5OTcf//9b7/9ts/nu+2222hywkAgQIZE0U6oK/nCrGEhLIQJQHi9HY/w9ifk9QKgL6Ny4+/FliQk8f7yB10LBCEAsUIkLqNiKF03oavuVIleOmobVJXX2htDaT8WQjpSgYEDB95+++3vvPNOU1PTwoULHQ4Hl4ViVpjIbX2iKNVtcyyjajDZSzu6FYuHI+WIjTcYDL3YEgBAlxP5ICkAoJNAEALQa6ikDgnC8OOg9KvX6+2xtqkaqYTIGaMrurRGv1Dlw/yqrVkSZqUfNGjQfffd96c//amysvKrX/2qw+EgEyLJA21gpMoXVDe8kCWEhTCSAXVFkzsnfklKSnK5XIqixFQnsjNhvR3aS8LYT/jrpfviXdv1ae+SXegOeEVxUNqUVxE2IMJ3bI/dOdxrI7o9xtFAFQDxCAQhAL2A7rct8qQyoiDsvs9kGK9OsX+jMh72TMO4pdRgMGRnZ//mN795++23n3766UWLFo0YMcJkMpFbqe4RqQ5N16FUkqS4szipjlf3/KuuIKnBeNSE2h72pUuXeq85oMtIGGWri8qmHQwGVXeyNv45kdQ+J5SbCQCgt4AgBCBW6EyW0S5UX2E8OTm6o8vh87V0Bm2eGK4/eS6ZJUuWbNiwYd26dZWVlTNmzDCZTKyt8AsvkLTr431AOsKTH6fdMlXved++fb/4xS9GjRplNpudTqfZbDaZTEaj0Ww2GwwGo9FoNBplWTYajYwxWlYUhRyMxSjEyB8lXeOquEZRlKSkpJdeeunw4cP33nvvyJEjg8Gg3+83mUyRnHPdyql5RqMxOTnZbre73W6DwVBXV7d+/fqPP/540qRJN9xwQ1lZmcVikVpT8nbGCKw7qqI1wOoWC1NAGwLtcrmSkpJSU1NfeumlmpqaX/3qV/379/f7/XSBGhsbPR4PPea0LVVIZyO8QZjK0KvVYDCYTKYzZ858+umn165du/3220eMGNHY2GixWPiLQrc2fgLpEnD3AVkD7S4jI6OysnL58uXnz5/v37//TTfdlJube+7cuerq6vHjx//P//zPxo0bb7nlFrPZnJGR0dzcnJ6e3tDQ0NLS4nA4+KExxpqbm9PS0n7+85+vWLGCblq6hfx+P19gjNG/pC19Pl9ycvL69es3bNjwve99b8CAAc3NzaE8/MXL4fV6PR6PIkwqq71Y2nMiHrvRaKRnjZatVqvJZDKbzWazmdbQT3SYEb52dKPlISa7inj/xoGuBYIQgJ4j/Ic5EkFIfQKyEPLxY9almrBDgWehCnetU5YqN4zoyMqFgcFgWLRoUVJS0vr16y9cuLB06VKn00mKkbV2X0RjpjjuLq7na0J1o7tWfncfkXi9Uu82VO8qlntdvNtKjZw0adL69et7u1E6TJ48ubKyMisrq1v3MmXKlEWLFuXn5+fn57vdbqvV2q276w6am5sdDsfAgQP79etXUFDQfTuaM2fO1772NZfLZbPZum8vRUVF586dC/XrzTffzBgrLi6eNm2a2+2+/vrrd+/effbs2UGDBgWDQYvF4vf7vV5vWVnZT3/60xtuuKGje//2t7/97W9/u1MH0G3Y7XZa6Kiu6xn3EwD6LBCEAPQoYb5kosALX8bj8Wgr5EKlBxRLu/Xrumu2u5Xq2HVDEJUQiW2CwaAsy3Pnzp0xY8azzz770EMP3XnnnXfeeSf3/KQEpKo6VU6k4q7DqKkYUUq60ZWqNapNdFuuSj8TI0cXHvFgSdtrTRm922sMBoMmk6mmpubkyZNZWVmic2An6/T5fAcPHiwtLS0uLmaMBQKB5ubmXbt2nTt3rr6+3ufzjRw50mazud1uraE7CmshN7IZjUZa9nq9ZOds147Ef1U1g5eXJMnhcJw7d+7YsWMjRoyw2WzDhw+fMmVKIBCgka+GhoZVq1aR7avzXtz0XF++fLmiomL8+PFKa17iTlbL4W+nLVu23HjjjS0tLX6/Pzk5mSzDjDGy11ksFsZYUVFRdna2y+XKz89PSUlJSkpyOp02m81sNtM1bWlpuXbtGmOM5GtTU1NSUpLuHun+Jwun0Wg8c+bMhx9+uHjx4pycHHo6VNedXxGj0VhXV+dyubKzs41Go9vt5pP3RH1aQvnqK4ri8XgcDkfkVXVHPm3Aga4GIhCEAPQQWu2hUjWNjY2MsbS0tJaWFuo+iiXpO221Wmtqag4cOKCtlhObb/lIWhW5t55WE0qt01FYLJbvfe97Z86c2b17909/+tOBAwfOmjWrpKRE7E3yc6uVhbRsNBqpA6faL9MzJ8YI2q6/tvev9fXVWghj7bjCw02FsRkJ6fF4mpqaOuO3KUKVXL58+dq1a3PmzCkuLvZ6veSnt3jx4s7XHzu4XC6TyRQIBJ566qn6+vqUlBRyOOxMnVw7eTyelpYW1hoq3OWC0O12nzx5ctKkSampqYyx2traY8eOGY1Gp9Pp8Xj69+9Puu6zzz47duyYx+O5fPnywYMHq6qqTpw4QS0k9Xvx4sXx48czxsiYeeDAga1bt5pMJlL7siwHAoFAIECylt5dgUDAZDK5XK6qqqqjR4/a7XaSiNQ8lTKXZbm+vj4pKWnEiBGTJk0aPHhwd9uWOyrqYipBFACJDQQhAD1BeP1APyUnJzPGqqqqwtRD/ZjZs2czoSvctU2NcaS2MYRaTUjKedCgQRkZGampqSdPnnzvvfcGDRo0cuTI7Oxsm81GXcBQDkt0Pn0+H8/co2uojP3THqFk7Sqt0mNwWR7LFgPRdObxeCjtrXYMoqN3EV3T5uZmk8k0cOBAxhjZmhIPkkBGo5FCJVNSUsRfOzMcQ3LL5/N1fkyHK0z+l1ZardYHH3zw448/Tk5OHjJkSF1d3aBBg+itlZSURO95Orp+/frV1tbabDan0+n3+0UDoMlkqqiooGezurq6pqbG4/HMmDEjJyfHaDRSUCVFGfCwQzKrKoricDiSk5MbGhpcLhc1iSsr0Q+FXoP19fUtLS179uwJBAJjxoxhMTnaxeLhlQtAXANBCEDPoeoRqkyFBoNh/vz506dPnz59+qZNm956660lS5bceuutP/nJTzwez9e+9rVBgwYdOHBg48aN9913H2v7gYyLzrGWSGxTWrucqAlVG1K3mzZJTU1duHAhY+zAgQOffPLJpk2b8vPzx40bN2TIkEGDBml3Rz0qn89H/TOn08kY83q9lBQh/IHEIJKQViRUy6mM6irE8r3EEZ8dpokyjR14ChCVgVq1EB7Vfe50Oi9durRp06apU6cGg0GeYiqUP7B2ZeQnSlEUSgdCypaWSWDozoYq3mkRmncoLpq16hY6UV6vNysr69KlS6dPn1adOpVVP0JE2zg1XuV1HOZAVIT3xKZDIDveddddN2PGjA0bNqgELTFu3Li777773Llzs2fP3rp165UrV4YOHcoHDmRZ3rZtW15eXktLS1NT0549e4YPHz5x4sQOHXWEHDt27He/+11qaioJwlCH2Rmie3nCQghAjwFBCEC3E+bLynuxLperqalp7dq1FHO/YMGCH/3oRzk5OYyx+fPn8y7R0qVLH3nkkcrKSqYxksRmh5h1sPfZ7k8qTSiuFG1H/FdZlsePH0+eV6dOnfriiy/WrFlD0Tj5+fmDBw8eNmwYaT9Jkqi/yxgbOXIkDeTzzBOiBI3N88za9rq40gvfFePeyLqVxDIxaMfQ3h7BYNDn83UygFB1pP369RsxYsSRI0d27NghSRJFwXHhJzoDqyrhLdTmU9VtHlmPLRYLzePi9XopuSX3TdAO6LQbTBjmGFVDPwaDIRAIzJkzJz09nbW9LaMYBRCLia+OSMprEU2Cqq3oXV1dXW2326urqy0Wy/79+2kTr9ebnZ1dUlJCnpmnTp1au3ZtbW1tc3Pz/v37r169euHCBfHldubMmXnz5lH2TqvV2q9fP8YYJV+N5JDbhfZiMBioSdXV1aEOvEMPWvjvHV+I5MIhhrBbibX3J+hdIAgB6AnELpSqa8KXm5qaqqqqCgsLfT6fyWQ6ffp0UlKSw+EoKysLBoMDBw4ka1VlZSU5joo1s97+Xob6tGglaxgzYIQVck2ou7muGZb+HTx4cGFhYWNjo9vtrq+vr66uLi8vP3fuXEpKiizLJpPJarVmZmYOHjz4lVdeOXjw4J///OfKysrMzEyVi2lcfEd1Ywi151mlBkMVi01CPUq9hVaBBwIB8usL3wPWKknxuVZdIIPBMGnSpFGjRilChmGak1OJzAE4QltiMBi02+3nz58vLS0tLCwcPHiwy+UqLS3NycnJz88X588Qk8S0u3fVLviG5O8t/kSmNt37U2U1jUSE8NPFJ2wQy0R+/7QrpJuamp599tmf/OQnVHL69OlHjx5NTU1NT09vampyuVwVFRWMMYvFUldXR+3x+Xwej4ciA81mczAYpNeUxWIJBAJut5vHAapefeIJ0f0byVEwxqxWq0quiye2Mw9XZ96WYpPi4q0LQPwCQQhAD6Hohb1xKEPA8ePHqadVXV29d+/e/v37OxyOkydPNjc35+XlWa3W5ubmI0eOkOWQV8vaCs5e/3BG3gsJtT7CIfwwR8pPCK+NylssFgq7otT2NTU1Fy5cqK+vb2xsLCkpmTdv3vnz53klzzzzDC1s3rx53rx5gUCAumWiKTJ8I3sYVVc1VFIZ0bKqaGaeiLWD6ii9eP+LCo3WkEmtXUOHdmWoq0CVGwyGDmVr7Az9+vX717/+NWjQIIfD4XA4nE5nfn4+GdV7DHEspqP3qu659fv9Ud/z7RYOBAI0ikT/Go3GvLy8zMxMxpjBYGhsbLx8+TJjzOFwpKWleb3etLS0tLS0pqamlJQUSZLMZrOiKEajsaGhwefzkVT2+Xxut1u3MaobPpQpVbc8LTc3Nzc0NKiOq6veA7rjaLAQxgK93lUAMQUEIQA9hygktJY9WZbtdju5AyUnJ6ekpJBnUXJyMqWbZ4w5HI6kpCQ+Wsw08UUx8ooPZQaMpHntFtO1B6q6HaHW859oRvv09HRySCNmzZp1/vz5nJycxsZGkkkmk6muru7GG29UFIULQt0D7JUzr3sjEar0ieJ5kAT3WiomSscYFLoR0us3v7YBPM9H1OZllYkmCkUUNZSy8syZM2+99VZycvLIkSP9fv+xY8esVuuwYcMiMUN1Eq2HYef3SAGEugGQHWqY1veBNzglJeWBBx44cOBATk5OcnLygQMHampq6AVuMBjGjRs3ffp0xlhDQwPNLVFdXV1XV9fY2NjQ0ECDVn6/n0RaQ0MD2fApC47YBnFYR7VeV/4pbT3eVfchJdpRHWNnTlGXoDq0WGgSAIkKBCEAPUS7PTnqNZLflL8V1jrrIJWnlWJvRldk9ha6Uo1pNJ72J/GvqiqVqAtlYGnXc0yslsxikuDB29jYmJKSkp2dzRijXhqVF8N1dIerVV3VSNrQeSLx5iKxJ5ZnbSMhCX4e+BpVT7er2971hOoZ9yKihVDVz2ada6fq6nTTBaK9cA1z11135eXlsdbEmHa7XbQ/d18zeGO6UBiQwU1lIYyiSdp/6e1Nxj2bzfbxxx//n//zfxhjly5dorNHLxB+3mg+Eia4bSuKIqbFMhqN9Kqneepp83bdIsKvF50mxPZ7vV6tm0bE56N9tBI6kq1Unr2x84AnBnHxegc9BgQhAD1HqHFljvivqPqCwaDYG9AVk7rre5J2TZQqY2aorcIUY5ozIPZvtCcnfD+SS1BuIhOthQSddppPLEw9Yf7tPsLvSOymq+wqWlGhshB2Q2O7kVhusKIoom1H9xkJP5SjGj0J9VO79bTbTt1tDx486HK5br755kuXLjU3N3s8noaGhqtXrxYVFYlH1OVoR4h0iXDvqvNGr1Pt2zKUsV13v6GuC3+Ubrjhhscff9xut1++fJkEYWVlpcvlGjBgABWgGQh9Pl95eXljY2NzczNlCzObzT6fLxAIVFVVlZeX0yuITM3/P3tvHiZHVe//n9632ffJTJJJMknIQjYCSYBElggBIosCgoALV6+iXL3q9brw9UEvoojoVdGLuCCIKCCyb7IKsoQtCVnIPlkmmZlk9pme3qv798fnN+c5ObV09TLT1TPv1x/z1FRXnTqnuvrUeZ/Pcoxrq3e79GyG4g0Jh8PjYCHU7NsNQAwhAOMGBCEA4wTXHpoeOzRpzTP4pVIpSh7IRl+KfL/m3LalXpZ8zKEWIerJfiZIF2NFJ42qpWsxnbEO7SS7q6ahkqBhnLgOmHiMlNbPao5MmnfGZrOJrsV61ldqGqbe84h4q/k4XjRH2/Q9nNMWrmkwz0UKitVQc+DAgaqqqpkzZ6ZSqe3bt+/YsWPr1q21tbWLFi2ifMjjgPoWGfyQDQqhw7jLqN60WkaoT7Hb7UNDQ7///e+/9rWvLVu2jDH2zjvv3HnnnU1NTYFAoLe3l1YRZIx5vV5FUaLRKHXpPJSXLI3JZDIUCvX09PClJiVzmV59xL5UPefIj5H2U03Y8Q9VpndDE81Hy+TjqvaFAXmk4G8uYCkgCAEYb/jQUNKHopmLjQ4L2PEiUBxW8tL48dbp38UxhziGM7aEiPfEwHKoxiY4nYob4j3hN1MsSvqUxrjqATf5zunVpLB3Xu/q6gdDcyCothBi4JVfotGoWrGrH2zj227waS7fV9pHd8mSJWVlZaWlpUuWLNm1a1ckEqmsrHS5XGo/WJaJrM1vJTO6Ip9l0+xFs8Mm+BowxmgZiVAoRP3JySefPGfOnJKSEpp8URTl61//OmNs6tSpM2bMGB4eXrlypcPhcDgcLS0tNEdDC6KmUqnW1tbh4eFYLGa82qS6IZqzcuo60zYVnmNcpR65PBWiBtZrCAAgL0AQAjBOqHWR5uuN27L4u1AUNjSO0cu9Vtj3pTTGFUcbiqK43W7G2O7dux944IGDBw82NTWlUqmjR486HI4LL7xw3bp1NpuNzCkOh0O9Wrq6WPGikvnRWHlqQkO3FStWMGFgpCkIJVmlZ+HRq7+Zyhh8j3qXUFeAhpjSieqSaQCax8ExEKHcRfz26n2zkvHWZsJbcoyQrtvc3MztzHPmzJk+fbrL5YrFYtxsxYQ6q6erssNYNku/bjMCSTyGojq5/4WI+Zqrp4TE7cbGxltvvXXHjh2VlZU1NTV2u3337t1Op3PatGkHDx5sbm4+44wzfvGLX1CSKofDEYlEqM9JJpMejycajbpcLlp8IhqNkjGTXEiMa6v5ipFul9Rf8UKkXLh5weAxNvlsq42iuXxrAAADIAgBGA/SzpLyPAfiC5sbtUQRqLYQqu0PhUVdDRpTHjhw4P7776+pqTn99NOXLVtWWlq6a9euN9544/333x8YGLj00kudTmfatqhHeNKAgIxdfX19XV1diqL4/f5kMmmz2Vwul9Pp5PkbaJvGhbTcWUlJyWc+8xk2msVHLNl4bTdepbRDk9zHLpp6WBNxpXIx/4dUiNoSiwFW7tiOd1BU25yN4RMc6kkWcSivHtYz4esz7g1Sxzsj6NVNWmeF8h77fD6mek7y+NhoFqUpLcz/4sTWqX+qmVZecz6IoCmtKVOm/OY3v7n33nsvu+wyu91+1VVXlZeXv/vuu7FYbPHixRdffDFjrKurq6ysrLe3t6am5tixY4ODg11dXSkhr0x/f//Q0BD1imm7F+kVo/5+NY/hG/SgZnQTTJLL1JhaEBZqogSACQ8EIQBjjp4RSdpvs9nEOVru1EQb4ol66S7HtBUGaI4zRDcqu93+7LPP3nTTTf/1X/91ySWX8BPnzZs3b948RVE+8pGP7Nu374YbbuCaUK18NFuaOt43le7MN77xjdtuuy2PDZTW+RDbK26P81eglg3iTXM4HGT2VCes5zidTo/H43a7xbEgxlt5JCXAclBNxl+K5qcmxZKkFgxKEDWJnjtAHjGYRMvlcjQ5QgHb5LagdxWTNZQgs/zRo0eTyeSFF164aNGiSCRy4oknMsamTJki9iSRSCQWi9ECg+FwOBQKRSKRVCrl9XrpI7vd7nK56CrqoEc9eax+xagPlnRsKpWKx+N6SWtyQd1XZ3S6mSqhvwIgL0AQAjB+pJ3iNZjPFq2FWRReEEihUcV27Ngxa9YsUoOUO8c2muvF4XDcdtttd9xxxwsvvEAr/qVGUyxoDm40L0QbdK0//elPjLGqqqpoNGqz2QKBgM/nCwaD0WjU6/V6vV7yy0qlUmVlZVwOdXR09Pb22u120RhLXwS5jGYx8pCakNKK4tNri14hac+i8quqqkpLSxljZNXR4+STT+7p6ZEuZ3wtkBbxgeTTIqnj7f+aY3T1F60+TLOXMCghl/rnuD8viO3KvY28exEdqtNqLXUh4sHS6f39/XfeeecPfvAD+vf999//zW9+c+zYsUAgMH/+/PPOO4/20wL0NCPjcDjIfZSmz7hu5BlHNdOiSpi0FWuWM3YWQk1MfoOxWGysawIAICAIARgn9F6BfJ6eSz5SSqKFUDIJGg9HCoLmsJV20sArGAxecMEFjLF4PO50Oukjrr7mz5+/bNmy119/fe3atbTT2E4oCWbpU5r4nzVrVjQaTSaTdXV1jY2Nhw8f7unpKSkpmT59ut/v7+7uTiaTc+bMCQQCFKjzyiuv9Pb2SnPSTqdTyp8hDbmM73+mA+js3KuksyhuLRwOn3feed/97nfD4bDP5+PfCH/AHA7He++998ADD/z1r3+9+OKLrWBqnnjQOJt+wnqPinnLSX6lUVr4ozI+lxsfqG+Rlt3LtF02/eg4xtjg4OA777zT399fWVnJGFu8eHFlZWUkEqmtrd2zZ88HH3zQ1tbGGHO5XOFwmLKMRqPRaDQaj8dp7oB6JOq+7Ha72CWmrZj5Y3iBVPh4vkcyFYRZWBcBABkBQQhAAdAzEeh5ZImeP9LIQG0iGAcMvMskD0Zy0HryySdnzJixbt06JqzCzA9WFMXhcJx//vn333//li1bFi1apDYPiqhHctJ9mz59+uHDhzs7OxOJBFXAZrMdPnx4cHCwv7+/t7fX5/MlEomRkZF4PF5ZWUkatb+/X6+9ZCHUS7pg/ranHVVn9w1KT46iKC6Xi/Ttf/7nf6Y9/YorriBfNQP7FTCD+vebTCZdLpfH47Hb7fxplA5mOhMBhUXqWHJ/+AsOTYK43W6/309OktxlNCMLYUor/FI8oKWl5bvf/e7NN998zTXXLF68mDE2bdo0+mjmzJkk9hhjlEqUktyQ00QsFvN6vSQLKZI5HA5z210eHxLNiTYLPoTjabQEYJIDQQiAVRAtgeKULTcv0LZBNMg4v9ENzFziR4qiPPTQQ9/97nfLy8tpwlsqgeRffX396aef/tvf/vZXv/oVS+eUxS/Ejp/wpj2BQIAxdvjwYdo/ODjY09MTDodpdOV0Or1eL2XV8/v9w8PDoVDIZrNJnpMiUrpO9VBePek+1mj6ForexUNDQ4yxmpqagYEBdcVIllNaHZ5ER69kYBL1rXO73V6vl7KwiPFjYPyhnsfhcFRXV0sri2b0zGsezM3viUTC6XSecsop999//5IlS66//voPfehDPT09x44dczgc06ZNW7du3bnnnssYo5RXsVjM5XJ5vV6Hw+Hz+chrlFIEB4NBkqwUamimbzFpRZTm0VKjmL8JOQKXUQCsBt5PABQAzdG85AkmTsmLjlvSVD1XX+M5jjfWn5I985lnnjnxxBObm5ulT6UCbTbb/Pnz4/H43r17W1tb9WIIeVCWuih+DxctWvTcc8+5XC5K3DoyMjIyMsIPmzZt2v79+6nyO3fuNG4pTVHTUF5cyZBpWXjGc0QlXlH8y58QyigTDoc117M2mHq3oKGg6OCPYiQSeeONN+bOnTt79myXyxWNRo0z1hqT36+Gl2amSjb92EU1vI/Kb6eUS2l8qujgwYOPP/54IBDQjCHM1ANfPR9HxYbD4VNPPbW8vLy8vDwUCn3+859XV763tzcYDNLMVEdHR39//8jICF+nJJlMBoPBbdu2eb1el8ulPt18PaXpKs0TpcCEjMo3D69J2keOjjRw1we5g7k/IAJBCIBV0HPKEi2E6iPH3zZlgFhJkm0HDx58/fXXr7/+eo/Ho/YClcxrPp/v/PPP37BhQ21tbXl5eUqVkUV9xZTWeveUTEVz7Wyn0+n3+6urqwcHB2fOnHnw4MFIJEIfUaYZqTl00ZkzZzKtL8hSL1RJqc6ePZuleypsx2c6sVRzihdxtmL69OmLFy9+4YUXduzYUVVVFQqFchGEzJx4M19UykSWI0LykzR+VGxCqGp+6qrfPZrHZrNVVFRs3769p6fnjDPO4P6iLK8/ZJvNduzYsVtvvfVHP/rRpZdeGgwGn3rqqb6+vurq6kgk4vF4+LW8Xm9jY+Pw8HBdXV0oFFIUpaqqigyGpBKDwSCZyMixQp1y02Sfn/YwcZZtfDApCOEyCsC4AUEIQIFJCak+xDe32jtUc39BLIRMa5Bh00q00NHREYlEmpqa2GgMj2YJ/Nzzzz//Bz/4wbZt20477bSsJW5vby9jzO12Nzc3+/1+v9/f2tp66NChXbt2BYPBAwcOnHzyyT/4wQ8WLVr061//+sknn0ylUhdffPF//dd/ffWrX/35z3+ubmZnZycb1ZmWVU2irmaMHTx4kKUbRos2DZAvxEmKqVOnfv7zn9+1a9fw8DA5BGoabDMqPKPj8yUgKbsSyRJSLDkWmKnAy/13Ry6aNTU1tbW1CxYsYKPpl5i59L+a8CktseuLxWL9/f0UeBwIBOrq6n7zm9+Ew2Fan/CCCy5oaGhgjE2dOpVy/J500kkej6evr6+xsZGN+iOQMpw/f/7g4CBFEIy1BS9rwZkFafscupmDg4PqnYQVJkABmEhAEAJgRWhAacYkVRA1yAxT3ov7u7q6pk6dStvi2EtdIO2n5eO7urrEnUy/georMsYqKioYY2632+Px9Pb29vX1TZkyJR6Pd3d30wEvv/zyAw880NfX96c//am3t7ehoeH73/9+U1NTe3s7Y8zhcNDMNG/jv/71r6Ghof3793d3d1PcHaWCoIGaoii0ShjtVxSFPFQpiYjkPmdyHEzWG940WpGMp6e3jSJGHFEm/VQq5XA4zjnnnNtvv52Zm2KnwRkGWHmHnt7KysqVK1cWui5AA/q9sKx6UbXHOC+hubn5C1/4wl/+8pcVK1bMmjXrzDPPXLlyJU3TdHV1xePx1157jbZfe+01SjG6ZcuWYDDY1dVlG00bpijK4cOHTzrpJIfD4XK5YrGY9AvVnBbUrJ7BWcZtzO9rRbxcIBAYGRkhlat2UrDZbBRdGQ6HNU9XhxIAAHIEghAAa0FmtEynzwvl72dwUbvd3t7e3t/ff/LJJzOt8BV1TCB5RjU3N1NCFC4g1RflpWlOYweDQcZYOBw+cuTI8PBwVVWV3+/3+XwnnHDCT37yk/Xr12/duvVzn/vcAw88UFlZ2dTUNDg4GIvFfvvb35JVjYsoXr7H4ykpKamvryefUnEtAa4G6UTKmLpgwQKeyZDS2PAyM/qabDYbZX9xOBzhcJhS49DyZVwQEowx2lAUhfRwVVXV0aNHzVwOyU7GAptVMzcCEWlGyaRZjP+s1PNilFTm5JNPfumll/7yl7988pOfnDlzZiKRCAQCbrd79+7dTU1N1LNFo9Hh4WFFUWKxGBlgKQEpTQbxzKJcIuppOU2X70xfB+LiqxmdaBIpOoBn/NKDUmEtW7aMCXJds9VjUVsAJiEYBwBQAKQZZRG+R3xDG+hDMXJsnDWh5gBF3NnW1uZwOE488UTN0/VGMHPnzm1ra+vp6ampqdFUg+KGNESgnZQvtKKiIhKJVFVVzZw50+/3b9my5Yknnjj11FMZYyeeeOIdd9yxbNmyhQsXzps37/XXX/d4PB988IEUQ8g58cQT7XZ7Q0MD+XoZIKVRzQs0RjQf6UfufNddd92Xv/xlCMKCIHqNYsxqQdSzUVmYB/VEGs0KrVmz5sUXX7z//vvnzp17ySWXDA8Pt7e3V1ZWzp07l8IXnU5ndXV1IpFobGzs6uoaGRmprKwkCz85IAwNDfl8PoqFliYXxHhOpqMJjSsvHckfV/WR+WVgYOC///u/9+zZ8x//8R+pVOq73/2uy+X6xS9+kUqlfvrTn77yyiu//OUvm5qa7rrrrpdffvmTn/ykZrWlJuAnlh0wrgIRjAMAKAAGHbHmu03zbZ22qPFHqkxnZ2dpaSkZrKQDpHGY2OoZM2YcPnx43759NTU16ktIyS2kEuiv2+32+XwLFixoa2srKSmpqKhoa2vr6+sjvXfo0KEpU6YsXbqUjc5D0+ITyWRSynKeSqVotp5qMjIyQgtaiFeXWk3be/fu3bhxY01Njcvl8vv93PvXvOGXhCUZCkZGRsLh8JQpU5YvX27gGCaGMDmdTvLUNfN45F3BAla44F5gEtFTke8RD9D74sS4QX4k33Y6nfQzDwQCn/rUp6ZNm1ZaWrpkyRJ1OdQtOByOWCxG7uXxeJx85sPhMFkIY7GYbXRNQql6Uk+Y4+yDgY006wdYLVYVRenu7v7Upz41f/58OmbBggWpVIom2u6+++5t27bRyo0nn3xye3u7x+MhdW0c5ImfGAC5A0EIwMQho9FAfl+iaqFis9m2bdtGaRIoEY7e8It/RIeVl5d3dnaGw+EVK1aYrKqkzaqrq8Ph8AcffBAMBru7u/v7+xsbG6uqqmhcxReJZowlEolXXnmlq6tr5cqVt9xyyy233PLss88yYVTkdDppTCZdiF9Oc+b+7rvv9vl8ixcvfvTRRwcHB0tLS83LA16a3W4Ph8OhUOiiiy5SFOXHP/7xPffc4/f7paxCogOteDPJj9TMt0zZL0DekR4M40EtGFP0fDH0/BSydvflBR48eJAmnh599NGXX37Z6XQ6nc7Gxsbzzz+ffpu05kQikXC73UePHh0ZGaGuxuFwUE8VjUaPHTvm8/koblntdZ9dDTVvhUFROT6x4h0m0dve3j5z5kyv18sY27lzZyAQIEHY1dW1fft2EoSMsW3bts2ePbu6ulqqhtoQit9UdkBIAxEIQgCKAJOjE6v17z//+c/POuusL33pS/F4nJad4IYvURySwuF2KqfT+cQTTyiK8qlPfYr2iFPy6tGbOFCgbY/Hw0YNepSCJZlMXnLJJT/72c/+8Ic//OY3v7nvvvu+8pWvVFRUlJWVtba2Uh0CgYBe7kTaL/ptSgdI+0tLSykBDCU2DAQCNN9v0kJIPmMej8ftdvf398fj8UAgEAgERHdZyWlN77YYPzbqW8qs9xQVHXqeezAYWgS1UNf8SE1G393AwEB5eXlJSckll1zy/vvvu93uKVOmbNy4cf/+/Zs2bWKMUcpZRVEikQj1DGQNo06Seozu7m4STh6Ph0/ciL960QqX6aPFT/d6vdQ/Z3S6mfLVe2w22+Dg4ODgILXr6NGj3IVkaGiI5/0KhUJdXV3Tp09X20XNXAgAkCkQhAAUADMxhOIeLpYsOxWqGU4zMjLy3nvvMcZIEFIKFkqMSYdxw6ColNxu94svvqguVh23ozfy7uvrY4w5nc66urqSkpKenp6jR4+2t7dv3Lixt7f3oYceosMaGhpqamrOOeeckpKSm2+++XOf+9y2bdsM2ihVW6yAVJNTTz1127Zte/fuveSSS8rKykTda/JOUnJ/RVGGh4ePHDly4MCB9evXU6JCcSyoeSvoaTEfGYhlJ/KLsUM4Bq8FZ9xmQChJZiAQoNBlxtjw8HBZWRl5qldXV1dVVYXD4alTp8bj8cHBwaqqKnJTp4Pb2tqqq6uDwSCtSchFo5SCOBc3UepnGGMjIyPqCOoxujOUKplv8/6HcinzS9NcHr8bYo+nGQYJAMgFCEIACoDxkJE29CK7+GhAOquwb0e9qzc3N7NRyxipQcbY7t27586dyxj7+Mc/fv/991NLKTsfnTVr1izKFGpcONORZDQOI3/LaDR6+PBhSvVeX1/f1NRUWloaDAZHRkZohv4Pf/hDe3t7eXm53W53u91kDOR3WM9maDAiURQlGo1u37597ty58+bN079nZnG5XE888QQl3DNAqpJ5mYcYwnEDQ9gJiaYkI0fxYDD417/+de/eveFw2OfzVVZWfutb37r66quvu+66eDxOJsTm5ubu7u5QKFRRUcGzUtlsttra2mnTplEI8aFDhzo6Otio+0O+oF5iaGjoyJEjmq3IyxSk+NiTl6zo1sEzMCuKIva30kShXk0sO0lqfdAdAREIQgCsBR8NiFPFmseIjEXPbmDGNP5U3ENV5Svd0cZLL71En/7jH/84dOjQtGnTpBUmSkpK9FagUl9RLYbJGclms9EyEkQoFNq/f79U1e3bt6ubJjpi6c3BS6Y5yWOTFqXg9k91nU1CzwBfl8ygnkx1H8xbCKWbjwEWAOaRbFb85zNlypTnn3/+4MGDZWVlN910k9vtHhgYoJShJSUldMzbb78dj8f37t3b19eXTCaHh4dJEVGZ0Wj0z3/+8z333DM8PLxw4cJNmzbNmDGjpaUlHA7v2rVrZGSE3C5So2moqc8xXkCCeien0zlt2rSZM2eWlpbu2rXrzjvvnDdv3ooVK/icndS6XDDWmZI4lFZtpX5PfCeqZ+KgagDICxCEAFiULCyBxhLO4HhNJF9Nk5+KQyKeM50y75E7kN/vD4fDS5cupUCa1tbWM84447nnnuPZ+UKhUCQSocUq1LExYjglHzRIdaABBPmpLlq0aOfOncFgcPny5TU1NZ2dnVVVVQ6HIxKJlJaWejyehoaG3t7e11577T//8z9/+tOf0tp9fNihlnPqkZ80RrHb7U6n0+v18tXt2fGjRjOIMwLhcLi8vFwSeKIQ1TRXmrH72ZDjBIAckH564q8pmUz6/f7y8nKPxxOPx91ut5hvmTHG4+VomRzGWCgUUl/Cbrd3dXVddtllHo/nhhtu2L1790UXXbRs2bJQKDQyMsJGdRR1VqIglCKW+fxULBarrq7ev3//ypUrI5EIY2zXrl3t7e3BYPDQoUMtLS22sUyAZLPZ9CyE0jah9y7DBFbuQEsDEQhCAAqMZkiYCOUyoY/sdjtPbUKk9fOR3uvqfzVrJVnG1EY542QGtOfss8/eu3cvY8zj8XCPUDL9ke0ukUjE4/Hnn3+emkaz47t3745Go+eff766OaItzmCs0NfXd8YZZ7z88suanxqwZs2alStXejweqqRm+epIQom0Tr9qk4LxCIzm7NUWQs1accxbCKUjM9WuAEwq1J0h09KE7e3tp5xyymmnnXbXXXdde+21oVDok5/85GWXXcYYC4VCN9xww4033mic4PfGG29csGABY2zjxo2nn366z+e74IIL/vjHP65bt+7ss8/OsRV9fX2RSKS1tXXv3r1z5swpLS29//776XJiS3MMRlCfTiZN/i/PnsqO7+KSyWQikTCO9oSeASCPQBACYBUk/SAmkhG3JVdSzdGJ+Km0RxRXoupT25pExZI2fkOSjvR31apVR44c2bt3b2trqzhdXVpa+vbbb7e2tt5///2f/exnu7q6xDJ37txZUVGxcOFCqY3itaThl3QTBgcHh4eHGWNHjx71+XyUmUBy7OSFUMWCwWB9fX1ZWRnTEnLSHmOTKTtew6e9V0wl4DVLpsWsxZ287Zp2QvMxhMaPEABAxGAOTvwpDQ8PkwXv2muvvfbaa5988knKJcMYO3To0NKlS9Mu93LllVf29/czxmbOnLlx48bW1laaR6Nih4aGyMOTCyfen4s9G4fXzel0lpeX33nnnVQI7XzvvfdKS0u5eVBsVI4dQkqVb0x8oYhuoqKFUP3e0fSXyaViAIoaiEAQAlAA1KMH/vITLUXcKii+Gs2IE0IdaCGpQYP3gZ43pt4lNOduly5d+u6773Z1dbW2tnI984tf/OJvf/sbpUj5+Mc//s1vfnPOnDn0ER0TjUZnzpwprkqvdo9UX1HE7/eTO1ZlZaWko/Sgu0ojNnXJad0vpVtts9kcDkfas6QBnEHhYmpW9UVTqjhGlnkMIQAgUwx+ualUihzmKU/M8uXLt27d2tfXV1lZ6ff76efJvT2lcxVFcblcyWSSSrj44ou3b9/+6KOPVlZW/vSnPy0tLX388cfD4TCfHyRNxftGsUxJFtLxgUCA5OixY8e+8IUv/OUvf6mtrb3wwgudTqc4D5inmyTfFvG1IhoMRXFI+9O+gAAA+QKCEACrQO6gtC2O78nARR9pmp6Yfp4VtcFQ3E5rG2QmRgZqkyOnrq6utbX1wIED8+bN4+sLf+ELX/jjH/9IM9MjIyOhUOjjH/84fZRIJDZv3pxIJJYuXSp5SGoaNvXshDabjYY75l2e6BgpxShHkkwGJjVjfc7ryaN9aA8N6bjq07SFShY/A8OvWGczwykMuQDICMkix/eL25S1mDHW39//3nvv/epXvwoEAj6fb8WKFX6/nxIakyzU7NKpNDIGulyuhQsXplKp6urqysrK/v7+jo4Ocra0jQYNilms9Ho8+iiVSvn9/tNOO+3rX/+6zWbr6+vbv3//vHnz/H5//u6QEVLuUM0bSO0SjzTW3mNQTQAmFxCEABQATV/B1PFRZHyUQCJQVEFqb0A94WfeGzCttVCNJMPU0isej8+ePTsajX7pS1+qr6+vqKhwOp1z5sz57Gc/e/fdd7e3t3/0ox9dsmTJ73//+/379/v9/sOHD2/evPkb3/hGTU0N+UoZ1Ef8K7WLL+tspu1infUWmTC2oamtow6Hw+VySRZg9Vni90jiUPNWU2nGF1VjxkIo3kPzJQMARGxagdl2u53se9XV1bRyDGPsD3/4g8vlisfj3FeT+nnN3z4lXyG/UKfTuXTpUtpfWlo6bdq0fFW+qqqqqqqKtg0mEPMFKUDREii6jIrbJufyxqieAEw2IAgBKCSi1cg+ivgvG1UO4rbaF1RC/V7X9LQULVHikebfr6Ip0nZ81Ifdbu/p6Vm2bNlJJ5105ZVXUqBLLBYrKytzuVxf+tKXeCEjIyM0DiCB5Pf7d+7cuXXrVqZl+BKvpWe9VDsaGShh0d9ST0RlEUNot9vVup3fKyqwvb199erV55133m233RYIBMSU62ojbdpZAH6ucVuMay4WjmEWAJlis9loJdKGhoZUKkVmwDPPPJOWoCAr3JEjR9ra2mj5B7HLlabYuru7Dx48SIJQ8vzMsYbGn46pwU2a+dJzH2WqdQgBAGMKBCEABUAzTkPvXz6FzHSixZiWcNJzK1UUJRKJ+P1+KsfMG9fAKVS8HPd+5J9u27attraWMWbsjBQIBKQ9/f39lD5BbZozM4fNtZN5ScMn9TU/NV6bS9P6JzoAax6sKApN8//mN7/54he/eOKJJ+oNxcgD1nzsKGHeQqgnnuGIBYAeBn2L3W4fHBy88cYb+/r6fvvb35522mkul2vt2rX8AI/Hozmpp+5YHA4H+Z2Kc0NM55ebaf3V84BqO2fWE0N6J6rbKFkFxSMxJwXAuAFBCEABUOsoshqJ+x0OB+kQ0SqoaXrSE2xq2ZlIJN5666133nln5cqVK1as0PS6lMYc7PhXuNrAqB5DxGKxwcFBm822efPmsrKyFStW0EJb0pgmdXyqGC5QfT7f22+/vWPHjlAolEql3G43OUxSbgapyZoDCLfbTWvT5wspM42mAhT/paUINWUkb34oFKJwoMWLF8+cOZMfoy6cvvFMLX5IFQPA2KEXOkjdVHl5+ZEjRw4fPlxaWkrpYXgXZ7PZqqqqZsyYwX/R6i6U/tbX18diMc0DRNKqJkmb6U076u3MWnZq+neQ3U+0CkqfSkdqVhvkBehtIAJBCEAhkSIGuaQRRaDT6YzFYrzv5kJRKoFjIOQ2b968efPmN998s7+/f+7cuZWVlWZeCRm9iYPB4HPPPbd169bm5uZZs2YNDQ3dd999mgsuSzidTkqT4HQ6I5FIfX39I4880t7enkwmzz///CVLllC2VdHXiOkMWehI83UW66C5Xy9VqZ7JlAShgSRTFKW0tLSvr0/co/ddpC1NE2QZBWB8kCbdHA6H3+8/ePCgOkmYOCtEvqBMZxqI79dMEqM58af+iB3/FlCfJc6sjZs8kGqoF0MovhABAGMNBCEAhUTy2xGH5mKsIB/cS8cwnSlevSi7gYGBM844Y/Hixd3d3WShYvr5RcVLaFZebYFMJpMvvfRSU1PTunXryNYXj8cTiQTPp8eOH7iI2pWngUmlUuRSFYvFnE7nxo0bn3322RNPPJEGT8ajH8Llcnk8Hs06G6MnovRWDNOTnWQeNFiYntf/vvvuu+yyy9xuN/9m1XeVpgBgIQTA4thsNpfLJTnPq3/Rg4ODO3fuVCe+4lDf2NXVdejQoXg8Tv2DKOFs+vEF0h7xLSC9bphODyaJQz29auZupN1pELOQHEWzEBgMAcgvEIQAWAXSCfQyJi9BeneStODvb5fLJekTPScitSYsKytrbm5uaWnZu3cvz1Kj6X5p5nXLy+fb3d3dhw4dOvfcc7keM788uhqyy5166qmvvvpqLBbz+XzqNqq3GWOUqkFshclpZj0RpV4UnhnOqdvtdpfLJbZd7VPKGHv66aevvvrqF1988a677tK06/I96nUI1fpfOkvt0KuH8aIaAABN1La41PHpYaSP+L/xeFz80en5/KvlUFpvT/FIMzXRbEi+0HMZleojuYlKhei1Lm+1BAAwxiAIASgImmEbNptNVDLcjiT6iNq0spXoDQs08wT09PSQcmtoaBD3s8ynXdVDjUgkUldXRy/1RCKhqTQMXvBqVyJyHy0pKTFvH2OMORwOST0at4vfalLa6khFvRhCvdge+h6pHPIFVTtukV9ZZWXl0qVLU6mU2jeMH0bLTkizAOKXLil/W4ZZRiUw2ALAPJozU5rTOvyXVV5ePm3aNLFX0SyktrY2FouRyVHdeYqST+ph1D25ngOIKGLVB4/D3JDU6elNbElg0gqAvANBCEBhUL+D6QXMA0tEASDmm9Fcz8AkFM1PzpyagkE9VkgrpcR/7XY7z+aiJ1wNCtQ00NlsNr/fr55ElwZJ4vDF5XJlKofEong5/KKSA6rkeaVuEY3P6FYY1GTu3Ll33333vHnzpPGcRGlpKS3aof7IYNiXtcuopmEBAECoZ230JuPEAyTTn9vtTiaTvCcXJ3RoQs0mrMwudnqaVZLm/sSQAb1Kqn3vNbfVTc4UTYOkpiOoekJQUyumfSsBk0BXAxEIQgDGCekdJv1rF2DHewk6HA6ecYSsiGl9/NRzxoTX66VVkklgSIMAphIDxi8MejGLx0irsUtk/fqRmqweJUg30+12k4XQ/BVtQtydeBbdfBKEevZA9b8Oh6OioqKvr294eDgajYrDPvrrdDr7+/u3b9/e0tLS2dkZDAbnzJlDGQWl0hKJxLFjx2pqajT9hA2+qVwshMYCFYDJjJ7NinehaV0tBgYG2tra4vG4+KNWn9LT09PW1pZKpXiWLM1fpZ6FTZov0zvS+PTc0ewqxZ2aLqPGpkKThkQAgHkgCAEYPwyMPKlUSowVZIIfIzkN8vdoRvlF2PGT02VlZQMDA4cPH47H4zNmzEirrIyVoXonVU8tq7JD1MCZGiqlW5S2MjbBzVJ0GXW5XIqi0LjN/M1JJpMtLS319fXbtm0LhULcgzSRSCSTyWg0Wl5evm3btj179lx++eVbt249duzY2WefHYvFaK1q7iSmKMrw8PDcuXMXLlzY29ubtuF5AVIQAAP01IiehY33Y2KPMTIyolc+l3/RaFSyhqWVPZreCmnP1bMTmrxoWnKZJdQUrmrPCPRaAOQIBCEAY470Rtd8Q9PoX1xZgQs/0hJ8v7jAnaYkY1qDADq9srLyhhtu+L//+7+LL774rLPOYoIcZVqv1UzfsqTEDN7cmsUaH6O59KJe3bi3JM00mw+DoRPJEqg+RTPLqKZxlRgcHJwzZ05jY2N9fT1FQtJwkL47qtWqVavefPPNVCp18sknz5gxo7a2lo0aXROJBB2TTCbj8XhpaSlj7JlnnjHTEF4fKYrSAOPEFSYLAWDSIlnhbMfH9Kr7h4qKivnz52ua48RfX1NTE3m/09qGxi6gZmqoibHxsICWN9vx+WYM+iWYB7MD3TsQgSAEYDww0/PabLby8nI60ufz1dfXk6mqrKxMjAkpKyvz+/2MMS4gNcvnx9tsNkpq53A4jh49Wltb29zczA+j1Oc05sjltUp+TYFAoKamhqrNI0CycO8hXUQxNna7vbq62m63U1UNFC9jjFaqKC0tnT17Nv1r0lxJoZtNTU1S9WhEsnDhQirN6/Vqhu3xOjPGHA5HVVUVLemhVmUUF5RIJLxe7/Lly999990FCxaUl5fTUpPUXjHbBI/JrKqqYqPhN3oDNapDLBYLBAJlZWXMMKu7HhglAJAFeu6amkd6PB5xlUK19wF13eRWILlI5PcXatOJiDZuwlhjYOpkOjZYAEAuQBACME6IoVnqgD1SCHV1dfz4lpYWGtPX1dXx9YsZY7W1tWmzlRCiViHD1JYtW1atWrV8+fIDBw588MEH8+fPdzqd5NOYl2Xr/H5/XV0dVSyXBSdsx0f0TZkyRa9AaShAUnnGjBl0cCAQML4QV9pcyzHGEokEP4BU6MaNG9evX19RUWGy/noL2bNRgyfdIrfb/frrr8+ZM8f4FH4iG3XKNT6S7Jn9/f0snfYWLRgGBwAAskBPqAwMDOzevdtgHUKiu7u7ra1NXMSVk9EP07yhT88NPot+YKxFGrqm3IGQBiIQhAAUBqkvJjV44403XnXVVSeffPLLL7983333fexjH7vgggv+/Oc/x+PxK664oqGhoa+v7/7776+qqrrqqqvMXOX111+/8MILzz777GQy+fLLL9vt9lmzZjU1NXV0dHz1q1+dPn360qVLOzs7+/r6fvzjH3/kIx/JsVFbtmz57W9/e+211y5btizHojivvPLKH/7whx//+MeNjY0mT7npppsOHz781a9+Ne2RfBacnEW/9rWvMcZ4chc2amG78cYbh4eHm5qaduzY4Xa7FUVRFIUCAmmDDHcUAnrs2LGXXnqprq7u/PPP7+3tDYfDpOLoMMZYKpXyeDzxePydd94ZGBj41re+tW7dOu4syo5PEJpKpRoaGrZv375x48alS5cuWbJkeHiYXE/JqZivSOH3+6kOZWVlLS0tX/7yl5k5CyH8rwAYC/TMerFYrKurSzxMc2geDAZ7e3vTeuAbYDORKVqT3DuBHE2a6o4L/RIAYwoEIQDjBLcHShts1N8yEoncfvvtt99+Oz/lj3/8I9+W5M3VV19t/tJ/+9vf+HZPTw/f3rdv3759+2j7wgsvNF+gMb/+9a/zVRTn3nvvzfSUrKc/RUHITYi33XZbRoUcPXpU/PoMSCaTTz/9tJkjN23atGnTpoyqYcZCaGCpwBQyAFmj/vVRf+L3+5ubm6V5H/G9QNuVlZW1tbU8elDPWd3g6gWPB85axemFxwMAxggIQgAKDIXO20bXMW9oaBgaGqJIs7Q+RWYwM0PMhyC5vHQzHa+MRZl6WRxMXig1ivojzdhFTW2vdwlNQxw/13ykpXhRPdtCRmYBqQQMvADIC3o/pfLy8ubmZskRlP9g+dqDVVVVdJhBL5HF1ccTzTpkEdgsAlNhvrDCEwKsAwQhAOOEOPXLtPri8vJyxlhfX59ooRq3uo3zFYsOzXA7KaWNmRJMlmymnExP1CMv8w4AADXSxA39DYfDfX19tMaMwbmDg4N9fX2241ecH4c65520OU41MbN4PQAgX0AQAjCu6Jl02GiSGLzwwDgjJtFheAIByCvqH9SxY8d27NghTcRwyz9fNefw4cNtbW2RSESd3HjCYN5INVHvAAAWAYIQgHFCnSZb8myE/wYYZzQ9bPEcAjCmlJaWUnCg5qdc+VRVVVVUVNCCQFIMIf9XfJVYkLSdiWgGtB2/8GCmRQEAcgGCEIDxwExUW9plJAAYC+LxeKGrAMDERNMlpLKykhabIaRcoFzsTZkyJRaLud1uWpGV6SwfzyCWAAA5k4eVxwAAxmiGDkohhSy3hfsAyJocczwAAPTQlGqhUCgUCqXt8MPhcCwWczqduaw8YXEmWHMAKF4gCAEYP1IC/F/+KWIIwThDD5sUQwgAGFP6+vref/99MXmYTYDv3Lt375YtWyKRCK08wY9kOgtaWJaxv6MAgFyBixoA40Rarx69kBIAxghyTpOSW6SOD1Ua90oBUPSoVZD4U/J6vZWVlXpr1fD9ZWVlNTU1TJVYWBP8VAEAuQBBCIBVgCAEBYGve6b+CLP7AOSOFClQVVU1d+5c3uHrabmmpia32+3xeFKpFF+enpcjHmnx3+lYrEkLcgeTCEAEghAAq4AYQlAQhoeHxX8xSgBgjKAfl91uTyQSaX9oqVRqZGREvQ6hOkn1ZPjN6olhAEBegCAEoACktFLPZfFSNzhlMgwRQNaQdcLpdMbjcXIZ5faKlImMuACAtOh5Xx87dmzLli2XXXaZx+MRD5N+dAcOHNi3b5+iKA6HQ/pVck1YFOoIFkIArA8EIQCFQVMTZlFIFh8BQG6iBulk8PwAMEYoiuJ2u9PGCHg8HgNHbm4bxE8VAJA7EIQAFADN17zJdQgdDoeiKP/v//2/yy+/PBqNRiKRRCKRSqVisZiiKLFYLB6PJxKJRCLBN2w2WyKRSCaTtMYxiQFFUcSFgCfw2gN84MXjcHg2P/5FiMcYFCXepWQySaMx8TbS4Ix/lK8miLUV68ynFWiDvlOy+PHvOpFI0INBD0k0Go3H4/Tv9u3b3W73/fffz4QZCgwxARhTamtrTzjhBJfLRf/qzQzW1tbG43HJTVTKRIqfKgAgL0AQAlBk0GjgpptuKnRFwIQC61wDMD44nU6arzE+jEtBmmDiO8Upm8nzU508LQWgIEAQAlBk8PfiyMiIy+VSr14FQEZI9lLEEAIwRpCc6+3tPXjwYCKRcLvdBgf39vYeOHAgFot5vV7RQsj0VyO0FJNQtQJQvEAQAmAVTC47wV+ufr8fL1qQX8yseAYAyBRRyMXj8aNHj/KP9IRTKBQaHh6m7NN6+UUnz+908rR03MD4AYhAEAJQxOQlM824YbCOFkfyjMqxfDNjJh4HaP6KJhsijvN4fTK9FgBgIkHhu01NTWl7gMrKymnTpjkcDimsF10HACDvQBACMKGQtEqxa48xbYKmXMz9inS6mO5FVIM51zoNBjWXPsrX2icAAAOkX73b7T7llFM2bdrEs4jp/egaGhri8ThjLJlMUgYpdU9i2QQzee9JJptFFIBxBoIQgCJDXIoqre2LWW+Ir+cfRfs1l9vKqAnGvlWaFxUxf0X1nL3m1zHOSTvNL01pUjcCALJDs8+Jx+Mul2vXrl1qLwPpyL6+vs7OzlQqxaMJpMxPagdvzf7NvOODXglZkHeTJmKbARhTIAgBmLBYfGQ/btVTj2nGyP9KkoViPsCCiHNpUQqTx1v5mQGgiNCcgqG/O3fuVBSFjIR6v7jOzs729vZEIsFtiZLwkybO9MhlQiq7+ayxc+ggYCfMC+jqgQgEIQATCusvHqBXq3zVNos7kN3wwtgWp/ZEVe8fa59ek+NF9fEAgLyg/nXTv9OmTUt7ZGVlZXV1tbhAheaUk+ZFWVaTUJpuGtkxRhZCAMAYAUEIwATEOu9OPRcmaTUtveMzxWS0niTDcolO0WyCZuHi+IyHA4l/x59xdmcFYBKiKY1mzZpF6UPVH3Hq6uoSiQStOaFZiHFqK8mhVPKcT5u2NJeeASlwACg6IAgBKG6k17YF4wY1p6sN6mkmh6ea7Hyo1LE3aa8oHmngYKlnElRX1cxFxwioQQDGFHF6SPy59ff3p40AHBgYGBwczOXS6mLN7Mxvt5AvD4ixqBsAgANBCECRMdYul3knlywFWTRKc7Y77ZHZXTFtW6TBkIF/V6aXBgBYGW7819Rge/bsURTF5XIx/R/+0aNH+cL0xtdSlyC5HtiOX/nGeCfLZILMfJXyApwaABgjIAgBsArJZDKLs0QXxKJQFHmvpIHo0hsnZeccpWmM1TuMD1yk1DJqFVoU3xoAICMkFwDpZ15bW2schMwYq66uHhgY4BllmH5WZBE9d03zBkOxwvny4c+lELGofJUGAJCAIARgIlAs78i0MX5ZTACrfS81I2Q0q6FZSBYXSnu8ehvz3ABMbLi/qLp7OeGEE/Ryh3IaGhooEylfh9B8N8WjlNXxhwbx2+qOMUcLYR5fTMXyjgOgSIEgBKC40UxAZ6l3ZxY1zK7+euUblJb17dIcPGkWrlnJ7C4KACgu9H7mvb29Bl0BabaRkZFgMJid5wjT72oMpBrvQi3YTcFCCMCYAkEIQHEjzQcT1rQ+aSZXGKMLmT84l+GF+Qw0AADA2bBhQyQS8fv9TGfKjDF26NChrVu3rl+/3uv1mgmHZqoOJ+sYQnUJ2QELIQDFAgQhAFbB5Exw0SWVkRjreo7bfchdSRbLVwYAyAKDkL+SkhK73S7tlP51uVykGMWAZPEwPWd4dVFMx2BoEENIO3Ps5cYihhDkC7yAgAgEIQBWIZfeGT17cYHvC4AJj4Fb5jXXXKOXLYaftWzZsqlTp7rdbnUMoUl/dSmjlXhi2p1mMM6zld9eDn0mAGMKBCEAVkFRlEJXAQAAwJjjcDjEhek11Y7D4XC73TabjQQh01linums9afpBWpsJ9SriR7jKdLgVQHAmGIvdAUAAP8/Gb3qpCUT4E4DAADWh/rqu+++OxwO8z1qGGNvvfXW008/HQqFuC2R+3BKzpzqd4dtFM3C9bCy3MrRfxUAYAwshAAUAM3JzlzWIcSbEgAAioX+/n69GEJOJBIZHh4mNagZQ6g+xTizcXbomeb0ZiHVmcMQQ2hNMGwAIhCEABSA3MMFxy1jJwAAgLzAe/6VK1dyl1G9SLxp06bZ7XaXyyX19nqvDz0TX46mv7RlqoMbx+KtBPUCwJgCQQiAVcjIQsijSvCaBACA4qKpqcnAQkgSq7KyMhaLMa3VIySNJwownkiG/1UfnyNiwIJaFlrc9RQAoAliCAGwCtnNqsJCCAAAxcW7774bj8dpW4wbZEKXfuDAgW3btjHG7HY7Dwg0WHbIIE+M5hoV2UF1SHstvJgAKC5gIQTAKmRqIeTbePUCAID14dqpu7tbbw1ALt4GBgb6+vri8bjD4dA0ykmo845msZKEScbzWgCAcQCCEIACoBlwn5EgzHvIPgAAgPFh4cKFfFv0CBWPmTJlSiKREFen4BiscMiO9xpVe5Zm/b7QfOnoXYvptyvrq+NNB8DYAUEIQAHQzAdD6xCafOdpqkeYCgEAwFJodumzZs0SF5PQPKW+vt5ms7lcLkVRRCMh01JHXOypYwjzJcz4a8vMtXK/nBrxuvkteXICgQ1EEEMIQAHgiz6JPXIikTBzLp0iuYwiZgMAACyIuNAf37lp0yaaAWT6HXhHR8eePXtSqRRXg8ZWOL4EkZRRRjwrlRsZXYsJ6jF3bKPkpTQAgAQshAAUDMmBJ2uXUQJvSgAAsCxip33w4MG0hruenp6urq5YLObxeMQS9HSR+GlKyPnJdHxScmlC2mvl5XKal2Z42QEwBkAQAlAwpLeaSQshwdUjXo0AAGB9xL56zpw5krhSH1ZXVzc8POxyudRFaYpJKcUL04+7y+6tITqFmrlWfn078aYDYEyBIATAKmSdZRQAAEAR0draahBDSOKqqqoqEomw0VVnjcWV2jqnttTlJYZQnU1UfS3+L1QcAMUCBCEABUN6d5KFMO2UqhRDiNBBAAAoCnhvf+zYsUQiQZpQrw8fHh4+evQo05JVYn4XtV1O+qtZQo6tkF5eY3ctAMD4gKQyABQGdYh8LBYzf7raZRSvYQAAsCZSb79p0ya+MD0/QDrl0KFDO3bsCAaDogCzHb/su9j/6wUWjsWrgVeDasK38RoCoEiBhRCAAqD51jTpBWq326WDoQkBAKCImDVrFvXkHC75uKyqrq6ePn263+9nggDjmlA8SypBczsj0r5K1BbC8QR+MXkBAwYgAkEIQAFQv/vZqMYz+apDDCEAABQd1OF/7GMfCwQC4h7xAHoLLFmyZObMmU6nU1J9kjFQc0JQ2plSLRJojMGRajk6ProCIhCAMQWCEIACoPkKHxkZYYxVVlaGQiEuDsUDHA6HzWYrKysbGhoaHh5uaGgQj1G/m/EGBQAA6yDGEMZiMbfbzfSzjA4NDfX09JgpVvQg1bMT5gv1ayWteoQlCgDrA0EIQAHQfE/ThHHaEUAwGGSMkR+RVKAEXsMAAGApqK++9957zzvvPINjbDbbO++8s3///qVLlwYCAYPEnkzHNsjy8QowLsFY7I2R/RDvNQDGAghCAAqAZMejYBKbzXb22WevWbNm1apVzzzzzMMPP3z22WffcMMNAwMD1113XU9Pz4MPPlhVVXXVVVf19/dXV1frFQgAAMDKeDweRVFoW28dP4/HY7fb07p6igEIfCc3zemt525GrYnZa8xUQF2ZPGpCvOMAGFMgCAGwBKFQaGhoiCQfY+zDH/7wN77xjcbGRvr0qaeeikajTU1NjLE33njj7bff5oMJAm45AABQLKxYscLr9dK2GJInSrjp06czxnw+HxOSyjBVQlG9pGLiyhOStNNLSapG7zDxjWNcGUQuAFAUYNkJAAqA5sxrMBgcGhpiowsS7tu3jxahYowdPny4o6ODMZZMJoPBYG9vLx2jLlNMBQ4AAMCCSClGmVZGUIfD4XK5mImwPfUKEOJ+JqxyJCUp1SxEeonobRt8JJaAmUoAigIIQgAKgHqC1ul0xuPx/fv3x+Nxp9M5PDy8c+dOChdkjB09evTAgQOMMbvd3tvbu3//finLqPS+ly4neu8AAAAoLNu3b5cWnlX3zx0dHfv27Usmk3a7Pa1tkH8kHiOJTEmzSVe3aaEukO+UPEXVh6klLgDAssBlFABLkEwm3W63w+FwOByMMafTSXPDhM1m4zPKdrtd+lRyNNJ8DUMTAgBAYeGSaXBwkE/q6U3hjYyMRCKRtBY2KWxPiuVTvxrY8SqOHa8YmeoNIhUobbPjX0A2rdhFAID1gSAEoACofWlSqVQ0GvX5fFz4iZ8mEgnx7ZtMJtWvW01NiBczAABYjWXLljmd//8ATFOGMcamT5/u8XgYY9xIqKnK1HqP708dv5C95sEpw/hzSUOq0XzpSOWbuyVpwIss78CbF4hAEAJQMMQ3HH+b8nd/IpEQJ2550GAymVQURZpdNpi+BQAAUFikDrmiooILQr3DAoFASUmJpmBTa0JJLxk4l2pWT+8NojY/ivUxPktdjVzAGw2AMQWCEIACINkGaYOUHvft5NtsNM0MP97YPGhwLQAAAAVBlFJbtmxJJBKiJlT7bR46dGjnzp1r1qzxer1pPTalCxk4cKZ1G9F8ZaglJS9ZbRWUXnB5eQfBQph3MDYAIhCEABQATSOe0+kUX6iiICR9qN4WS+Pb6OUBAMBqiD1zZ2entA6heBiPIRwaGlKLK7WiUzubSNpMfQnNszR1o7ETiqQJ1b6p+QLvNQDGFAhCAAqA+t1GYYF8Zpf/S59K4lDttGMAPEgBAKCAqCP3li5dysPF9URUY2Ojoihi/jCmyudp0P+bDzg0IGtfU8m5NHdgIcw7GBUAEQhCAKxCIpGIx+OUZZTepjxQUMwiI2lFdcyGZiwH3qYAAGARqqqquL+oFATI+/CqqqqRkRHGWDKZ1Bu7G1gLNX1KNQMLmZauY1oC0thbNe+JZESgXgAYUyAIAbAK4ryvpPpEcWiz2TSzjOqVmemUMAAAgHyh2Vfv2LFDbf3jx5PQOnLkyJ49e8466yyPx6PO5mJgu5NiCKWaGLwU9Gx6esGBBiVL+9VlZgrmNPMOhgRABIIQAKuQTCZJ6ZEypH/5R5KFMG2eNw46fQAAKBSaPXBHRwfv3pnQgYs9eU9PT3d3t2bQoJkrql8HetviKepoQDpAqoA4fWlccr7AiwyAMQWCEIBCIkUGSgpQfBlLFkKDohgmUwEAwMJMnz6dxxASqdH80rzbr62tDQaDmoa4tOqIl2Z8gFSs8ZHi+8hk7OKYgtdcjkBjAxEIQgAKgGaQBjveM0cUgeIpkjcpP0szVR1emQAAYBF4Lz1z5kwShJpyizZqampisZjD4eCL0/JyzE//qZ1CNY9Ja07M9G2i+V7LBfXVoWcAyCMQhABYAu4jyt11xEQCaeWf+mWJ0EEAALAmw8PDNN+nl6CFMRYOhwcHB51Op2Znnjb/J0tnymOqKUiDcgwK0Sszv6jfhpjuzBGMDYAIBCEABUAM0hBjNqQOWvQgFa2FapdRvVh/9b8AAAAKAu+od+zYkUgkpJ38X+q0jxw50tbWJq5fn/e4gLF4O4yRKQ8vMgDGFHv6QwAAY4NaxUmqT3M+WDMFeUpgDGsMAAAgZ7xer7gOoWbX7fF4fD4fX7+ewaQDABgzYCEEoGCktBZx4llGpXc/HxZktOwEAAAAq7F48WJu91NDnf+MGTP8fr/L5VIvMlFE/X9+RWymCVcBACaBIASgYBjHAYpuoup1JgAAABQpkUgkbRBgLBYbHh5mjBlklLE+emsbZl1avooCAIhAEAJQAAySBKh9RwnNpSY0zwUAAGApJFH0wQcfRCIRzYXp2aiIOnjw4J49ezTjwyeh7+gkbDIA4wkEIQAFQPPdRsGBaaeNNWMIjU8BAABgHfTSgElThPQv7/MNUpICAEAuQBACYAn4i5/v0RN+mjsn88wxAABYGXX/PHv2bJ/PJ+2UaG5uFmcJeeIZY38Qi7wCTK5DaL628H/JOxZ5VIBFgCAEwIrorT9hfDyyjAIAgDURe3VxdUEy94miUVyNlnp1npJULEo6kZc2pq0AAExIIAgBsCjSe10cTOhlGcWEHwAAWArRrMfZs2dPPB43jiHs7u5ua2uLx+Nut1sqRJ13VLyWFTD5MhKFrlr3ZlEgACA7IAgBmAjAZRQAACwIGfEkRRcMBtVCTvIFjUajjDFFUcznDCu6/t86ChaASQ4EIQAWxfjVrmk/hMsoAABYEKk/P+mkk8SPNPvtGTNmJBIJbh5kgm5Ur0JkWSlonP/G4CPJWohXW96x7DMDCgIEIQBFD96UAABgZSQLod1udzgc4kdsVDtxfZhMJkkNGqzGzj8qoreAgV8oAKBQQBACYF3S5pKRwIQfAABYEEmw7dmzR7N7Fw/r6Og4fPiwQToZdbEThonaLgAsCwQhAEUPdCAAAFgZqZcOBoOJRELzIzYqh8Lh8PDwcCwW83q94pEmV3QoatRWxInaUgAsAgQhAAAAAMD40dDQ4HT+/wMwPWtYTU1NMBikbc3MNCIWNKnlV8Kp227BJhcX0NhABIIQgKLHYIEKAAAABUTToCcKQsnux8MCfT5fVVWVy+VS52XRXHvQUj2/mOEsi4qpT1FLYku1F4BiB4IQAEuQy2Sn8VgBAABAodDULcPDw4qikCbUW1k+EolEo1GHw8EloliU3rZFyL1K6mUJ9crEKy87LPjYgAICQQhAgeGdcqYpZDjS/DF6eQAAsDK7du3iHb5eDGFPT8/u3btjsZjH4xH3q7et3OcbLzuRVstJS26oERfhAABkDQQhABMBTJECAIDF4dKlrq4urdQpKyurrq52uVzJZNJutxtkFi2i/l+9SIZoBuTb6hbpRQ8WUdutBoQ0EIEgBAAAAAAYPxYuXMjXIRQRJV9tba2iKHa7ndsSjcWPwXKFlsJms2kuRSjpE9LA/F+EygMwpkAQAjARmNhrUgEAQFEjCZjBwUEpRkDdh4fD4ZGREUVR+Lma/TzfacHUMmkxVn1MaA7fIEspXna5U1yPChhrNCZpAABFh5jSDQAAgKWQuugNGzYoisL/lYLA6d+Ojo6dO3fGYjGumtT9vKiXLBhNp66wZBuUMseoLYd6EtF2PPmsNACTElgIAZgI4I0IAADFQkVFBRc/kt2PRJTNZvN6vYFAgGeUUR/JitArxFgfSh8RmicCAPILBCEAAAAAwPixePFil8vF/9VUO1OmTKE4Q55UhvaTw2TxTgKqYwX5fnE7NYrmWXAcBSC/QBACAAAAAIwfwWAwHo+TJtRTd8lkkmII+RL2xWUb1Fw+kYx+fI8UQyi5j6r9S3nJrBjuAABFBGIIAQAAAADGj23btolJZSR/Ufr3wIEDu3btoqQyxSh+NOusjoGUwiDFIw1ajdBBAPILLIQAAAAAAOOH3+/ny06I9i5R5LhcLrfbLcYQTgBE8yA73gxo8BE7/v6I20WqlgGwGhCEAAAAAADjx5w5c/QcQbnamTJlCikiKYawqJHygtpsNp5tVYohNKn0JsZtAaDgQBACAAAAAIwfkUiEb0uuj6IQikQiyWRSlE96SVYsiN66iKLdz2azud1u8V/xMINVKGAYBCC/QBACAAAAAIwfu3bt4jGEXDiJkYQ2m62jo6O9vT0Wi/l8vmLMp6IpWSULoegmqg4LFG2GeuUXdcJVAKwDBCEAE42iGCsAAMDkQRItIyMj6o/4BvXhiqLQqvTjVcf8o1ZrapdR0U2Ux1XSiXqSUnSsHcPaAzCZgCAEYCIAEQgAAJZFEjBTp07VW3KdH1NbWzs8PFzUglCNlDnG4XDwf6Vtl8slrUMIYyAAYwcEIQATAbwmAQCgWJg6dapkGFRP6lVVVYXDYdJFtMeyEXTmX0BkBhTbLmZblTKvSm60TLUUIQcGQwByBIIQAKswwWaCAQAAaNLZ2ZlIJCjRqCRmuObp7+/v7OxUFEV0qmSjmUiLQvyoKyn5gjqdTlEciplX6SOTr8WiuBsAWBkIQgAKTLG82gEAAOSFffv2ae4XXwednZ0HDx4kH0vJPmZBjBeRF7fF9KHiWaItlEyF4mIb/CaolyIsosyrAFgWCEIALEEubzK8BQEAoIiYMmUKt4ZJ2TK5AbCmpmbKlCnJZFJypLQsJqunKApfezCRSHA5F4vF+LaiKPF4PJFI6EVaSte1vmC2IBZ/nMA4A0EIQNEDGyMAABQRM2bMSHtMZWXllClTbDabuDC9Na1hUqSftF6i+GkqlZoyZUpZWZmiKA6HY/78+fF4nD6tqKiYPXs2Y4xW2mhubnY4HNR2sSjNcEFL3Q0AihEIQgAmApgZBQAAi8N1S0dHB98pKhzRBzIUCnV3d4sWQrGft1Sfb1KPpVIpt9tdW1vr8XhoT3NzcyQSoe2Ghobu7m7GGC1V39zcXFtba1yatAEyAioaiEAQAmBdzMfT440IAADFwvbt2xVF4V6jIrwz7+rqamtri8fj4mEWHMSLpkvJiCeuG8EYs9vtdXV1P/7xj6uqqr761a8ePnz461//ek1NzZ133skYu+WWWx555JG77rpr0aJF99xzz5NPPvnAAw9w06gomDkWvBsAFCkQhAAUJXgvAgBAkTJ9+nS9ZSf4BF9lZWVjYyMTggLETKQW7/PFdSPEIMmKiopbbrmFMfbf//3f/ODf/va3fHvx4sV8+3e/+93nP/95OpH/Fcu3/n0AoFhAmnsALAqMfgAAMCGZM2cOdwTVo6qqaubMmT6fryjeBbSYhOaygZKdkDHW0tJSXl5eWlrqF/B6vT6fLxAIlJaW1tfXM8buv/9+9VX0rggAyAVYCAGwKMYTn5gWBQCAIqW7u1tSMuouPRQKDQwMKIqi/qhI+39u0BsYGBgcHDQ4MhwOM8bq6ur4HnHZCb3UMgCArIEgBKA4EGde1bGFmCUFAACLwwXM1q1beQyhXuLQw4cPf/DBB7RwnzqdjOiNOc5oijF1flGO5BPLGOPLThhTUlIilWNwFQBALkAQAmAhxDWXxEGAqAA1RwCYKAUAgGKBXCIJvd67urq6pqYmFot5PB5uFpN8Jse8olqYzymq3qBz0wpCOkX0qlWvbKH+CGQEhg1ABIIQgAKgnhJWx1roveTw8gMAgKLmhBNO0FxyXRyjV1dXt7S0OJ1OvvKEZqZNiyCaAfXWIcwUWn/C5KUBALkAQQhAAdB8gdH4QEo9p3mYmfcrdCMAABQQA6ESi8WSyaTxYfF4PB6Pi+4hlu3VDSL6NOtssiEul4s21CVLV7TsnbEyENJABIIQAKsgrdckveGM1yRUmxzR1wMAgBVQ98/79u2TunT1MceOHTt8+LCYS1O97oJ1kBSanoTLCK/Xqz7Xag0HYGIAQQiAVZDcgex2Ox8xpB0HcHcdTJQCAIDVkPrtkZERbiHUIxqNRiIRaf16y+ZTyahiJo+UXEYlr1T1RwCArIEgBMASqFPGSeqOh9cjyygAABQXkow58cQTxS6dHe/9SNsNDQ2JRMLhcKgXqLBIh69ZDT1tpk6UmserW+SGFBdQ0UAEghCAAiOaBPlOUn2a0SMmYwgBAABYk8bGxrTHVFdXK4pCvT11+0UhgQwqlmmduWlUL7equCYhACAXIAgBKACaibN5olH1BLAoDqUVKQhM9QEAQLEgrkOoGW5ns9m6urr279+/cuVKg9wqRUQWalb0lVWfZeWcqwAUHRCEAFgFUfVJ5kFJIuIVCAAAxcuxY8ckeaPWSENDQz09PQ6HQz0DaE2bmGbOT/OpR9VIghAvPgDGDghCAAqA5otTjCGkbc0EMwggBACAYoR36XPmzOFqR+rtOTU1NZFIxOl0aqpBK6sj8UUmxcZnhLgwvRppqUMr3xAArA8EIQCFRMwnLq5DaLfbJUEovmIlTSgWMp6VBwAAYAZJsbS0tKRdYLCuro4J8q9YYgjVqNVaFhbCtKGJRXRDLAIGDEAEghCAAqA5nSkqQEn1if9KWpGfO5b1BQAAkD1SF71v375kMilOAjLhvUDapr+//9ChQ6eccoraSFjs5NgcvO8AyDsQhAAUAL0sApJJkP/rdDpjsRg/V511RjMVDQAAACsg9fmHDh2SFhgUk4rRnoGBgcHBQXKbnABekeIbKgsLoeSGmvfqTUKK+nECeQeCEABLYB+FSzuHw8H7a8kk6HQ61V6jDP07AAAUA62trVKAnLr3rq6ujsVidrs9mUxOzr5dHTDP8JoDYGyAIASgAKgnOHnwPXci4tv0r7giE6ZIAQCgGCE9M2PGDGlhev4R/7empkZRFOl0y4aLZ2TANPn+0hSEAICxAIIQgHFFnVCOvxqdTif3C7LZbHoWQhKHmiUAAACwLNxtsqOjQ28dQn7M8PBwMBjU7N6t2ecb1yoLEavOu2NBJQzAxACCEIBxwjhBHPf51BSBDoeDTydrZqOx5vgAAACAmo6OjrSddigU6uvro4xikhWRZWKRyzH40OB0HuAghjhKqXHyNXcplSNZU0EWQF0DEQhCAMYPUezxnfyVJi42KFkIJWuh+K9YoLSS4Vg1AwAAQCZInX9DQ4PL5dI7mHry0tLSiooKPbdJ86P5HMf9BqeLsevqt5vBiVlkQRPlpZlLAAAyAoIQgHFF7xVoG11+kP8r6UNJK+qVCR0IAABWQzKX0RqDxvh8vtLSUv4vxA8AYOyAIARgPOC2O3FaVHR6obSifM7Y4XC43W4uAl0uVyKR4GdpphgFAABQFFRUVNCGQYigz+ejwybGwus2my2ZTOZyeh4rAwCQgCAEYPzgk8TqFzzJPL/fT/86nc6SkhK3203/lpSUcKugz+crKSlB3CAAABQd1G8PDQ3Rv3ypIekAxpiiKGImUosrIs3U2bSRTCZTqZSiKKFQyOPxjHvVAADpgSAEoACoX/+pVMrn802bNo0fMHfu3MbGRvp39uzZ0WiUtmtqambOnBkIBCRhafHhAgAAAOqud+3alUwm+SJD4gE8KKCrq6uvr6+1tVVKTG1NDGoozmZmVGYuFkUAQEZAEAIwfugtIUhqsKKighyEysrK+PzxrFmzQqFQZ2cnY6yysrKkpKS9vZ2plq4CAABgfUjk3Hrrrbfeemuh6zLelJaWDg8PM9OZsSEIARg3IAgBGFfUL0KKrLDZbAMDA4wxh8PB1SBjbN++fXy7v7+/v7/f5/OFw+H+/v7KysrxqjUAAIA8wEXOjBkzOjs7aYqQnCq5xwdt2O12ejtMmOgAUoPMdDykKAilCIv8VgwAAEEIwPihloLivxQx6Pf7g8Gg5ul0fCAQCIfDvb29JAgnzFgBAAAmNmKfPzIyEolEDA7mcmiC6R/z7yyeSo1NuJsAgNWAIARgvOHJRaXYP4q2j8Vieu9L2h+LxZgQlQEAAKDoMO8POWln/dS3CAHzAIwREIQAjB/iOhPiNkEJBtKOEuiAkpISsUzC+pnoAAAAsOPNX0ATRVGkPXjBATBGQBACMB7w0EH+PlOLNzL6mZwMFsvR2wMAAMA6aC4vAfQgdxg1mPoEIO9AEAIwTqg1obTtdGbwe+Quo+r3It6UAAAAih09IyrecQDkHQhCAMYV9awwf7eRIEz7qktraQQAAGBxYCFMC7cQ4jUHwFgDQQjA+GH8SsvOQsiOH1hgkAEAANYELqMZEY/HxX817xiEIgB5AYIQgAKguaRSRoIQb0EAAAATGEkQ8kxs4nK+0NVZg1EEELEXugIATFLUfTFlGTVJRgcDAAAAxUU0GuXbfKEmBhEIwBgACyEAhUH9SiMLYdpXnXFmGgAAANYHqsYAeqmJglDKyoaoQgDyCwQhAAVA802W0euNWwjxUgQAgImKzWaz2+0mk40VO9RMm83m9/sHBwd3794tHaBexRdvQADyAgQhAFYhuxhCTJQCAMBEJZVKqddnn/AMDg6y0RhC/oJT60DaVi/GCwDIFAhCAKxCRi8z6R0JAACgiDBp01uxYsWDDz5YV1e3fft2h8MRGyWRSCQSiVgspihKQiCZTCqKkkqlkslkMplkjIl/844YzS5FtvN/+aWTxxOPxxVFobZEo9F4PB6JRKhRg4ODXq/3oYceYsdnkbHZbGrfUX7FiWEmHTcweAAiNvx+ACg4yWTSbreHQqFAIOB0OvVW4yX8fn8oFIrH406nEz4zAABQFJCwiUQiXq/XZrMFAoGRkREzZ41D3SyLoii2UdTuMFiIAoB8AQshAAVAU8hlnWV0AstC6X1v0EYpF3lGd0PT7dZgHCb66xoUa/IwAADQY2RkhKSj1+stdF3GA/F1RsGTkiVQs6uHnTALJuSYAWQNBCEABUCzIzYpCCdV1IT51vFsBHm5ikFkpkmNKn5NxjrWfK0AAJMHkj3BYDAQCHg8HofDUegaFQCxG1Sv3ztJ3oMAjAMQhABYheyyjOKNqEdG88Sa1jy9jHZSyQaHpf1S8K0BMEnILgGYuPQCL8f86aIxrVjg3qGava7mfnSkAOQIBCEAViHrtebz9S7MYtxg8tLZlZzLOEYyGIpDMfW2uOQxS9cotdjTdFUVD5OGLHpxL0U3bgMAZI3J3ztlZJkM/ue8D5S0H+8/NWc/1R04MAlUNBCBIATAKmQkCMeiKx+714NmyWndMnPRSFLAicG25iVMzkZrJr7TC24xbgsGNABMKkz2t7FYzPzBaoqiY+GiTuw/NXtU9U5pLq8o2guABYEgBMAqWOGVb6YO+X3jGrtlGmg2Y6SGSDPK0rZe+Rk5fOotBJJ1E1hWt8LMncylSgCA8WSMlouwFMazZnq9t0E5AIBMgSAERclE6vct5bYxbjfWpFtmLlXSC+ejbbUnp14FxALVGQ6kcBe9auTShIzK0TsFWfgAsBQmf4ZkIczolImEcZMt9fYEoKiBIAQWxfxrwDhPo2XjtfL4JsvvS9HYkzNH45Ja6RlbsVhWrVM7doohhVzCqU152eWhkeIV9WqiGQCjvmLahDSSuNWskkmMpWwWBQIA8ouiKHwbv0cAwBgBQQisi3GAmebwWn1kptFr44ZY/1wqk/bc7MSbGT/DLOSH3kfGX2JGVxHPEs13en81L6RpPNRLD2OgaUV1Z2CK1GtvRt+CeZmtZzvVq0nBZ08AmBhk0dWLgpBjhVcYAGAiAUEICoyZTBvGA+LscnVYZIybdlCeFjNBZQb6QTrMvCenmUtr1lYyrKlTAujVISPpK15Fz0KoWQe9Yo3lHJeXohA1H7CnGXZofLD0E8huWsG8ss20ZACAJpn+mkSXUQAAGCMgCEHhyfQFKYmoSe4yalyOuplpG66pByR5M543kNfEzBU1XVI1bYPMhNIzlkbizeFn6W0zwzuv9zWl/RY0C9GsRhZiL6M7DwBISxbdvphURvol4ocJcgEzfUAEghAUDE0rn6Y5y2AUa3JQa37/eKJpDcv0Ha829DGtO5YjeVSAkoFRqqSmW2Yu5i/16SZdJdM6UopV1bQHqverz5KambZF6hGhZuvU23qYkYtWmEABYIJh8jeVSCRyOR0AAMwAQQgKieQ9KG5ruv/poSmKTDLOli7jPWYw01i1W6b5Mb1aL2kKJOlTg8oYN8Gknyoz8U1pii71VdI2TXO/5rak7sTyjQ3X7HhhLNVNtGGaqapoMFTPs2gKYE0DuxVmSQAAhDijBAAAYwoEISgwBi52TGtsrSdL1GWqR9LGwqZI0fRL1PMJTCuQTF4uLypC9Eg048SY0YU0v249UWdwuplqqM1oevfH4J5natkTj5RkZEZoykLj6gEAcsek0hNdRvEzBACMERCEoMDk4u1mpkyWbuifd7Ibl2eNSV1hYI9S72SCyJFKkC6ndomULqdXYZNumTmi6ZasLl99OckP08yF6BSDqzBBuYn/am7zajAT34L6UwPnT16ycVEAACswGRamBwAUHAhCUEikYCpNGSANYTMSEpLV0dgamUsT1MVqHqnZ0jxWQMKgmWrdqFmOpqRhWnLCvFeqgcFW2s7RXUrTQ5KZUIN6O9NegmlFBqbVXWlNtQYlGNxDk8drfh2QiwCMNVlYCAEAYIyAIASFRBq8Sv5vmsebGc1rfmrSWJQLmh6D6gP0FEh2g2/js0Sxx61Ymtuap+htSy3Vk5Rp62Z8800qTM0Txeqpq5ppacZfqHSMsZrSMxuy48WkwbegnvXQrKo0F2D8hfJzzQt7AEAumOyL8GMEAIwDEISgwGgOqSU0nQzV3nSTE5PjfvUpZiSopqAyMLRmKmvTHmx+zKQ2yqkLSWteNmnH0zxRsmBrmjf1lLN0nw1stpr1z242QV1tsTJq51LNSwMAsgMWQgCAdYAgBAUmrW1qMriu2Ww2RVGczmx+jwa+oJqkjvdclY6X/AbF46XTmTCgKfh3pDZ2ZV1IdodJalkc6qmlsqaVT5LZBpUxGEeq/T81dakZpJs5sX+AAFgWCEIAwDgAQQgKiabRie9PpVLJZDLrEa314c1UFCWRSJSXlzPT08Z6pYloWlPVClxzxK+nXiSxoT6gUEgiysBDMmttI9nuxDsg3Wq1QjbQ7ZqaXF1P6RLitsEezVZr3gFNO6oVvlkAJhJc4OHHBQCwDhCEoGAYR0mlUim73W632wtbSeuT1l6khjsKZnc5SbFYKupMUmKaQigLTah3vIFJ0OQ9UftqGhxgBr3jzTwnkuctrIIAjB1Zu4xaaiYOFC/o4YEIBCEoPAaeftdff/29997rdrtLS0vdbrfb7fZ6vW4B5yh2AcaY3W5Xj27pzZp2CJ5dExwOB/2lq9vtdqfTabPZnCpcLpfb7Xa5XB6Px+Vyeb3eyspKp9N50003ZVQlRVEURXG5XOYD7ZLJZDKZVBTFZrPxGpo/l5/IfVytMCjhsXDSHlG4Sr7HZtSO5MPJNyRLmgRXg8lkkv7SU0ePhMm7TbdaURTGmMPhcDgc5mdGkqMwxvgXZPATE2tFJzocDrHJ6rth0PzxgaqXTCYTiUQ8HlcURdOPoODDHWMf5hw9nIF6FkbzgPG/vWrrOnWY9JT29/fPnj3bfGmiIByLlxcAADDGCj+YA4CjHnZPwqGS3W43Dhpxu92xWKzgv9x4PC4JwrTBb2OEKP8kJaMp6pggCA1URHZt4ZUhZZV1owoF1/zqr7XgjxxBX0oymYT7ACheaK4wkUgYHEPvgoceeuhjH/sYHngAwJgCCyGwEJJVh3YGAoF4PJ42sMqCpK2bZNSiSMK0w26Si6tWrTrzzDNbWlpOOeUUh8PR2dl55MgRp9NJxiVuYopEIiROpk+fXllZuXPnzj/84Q/vv/8+Y+yiiy664oorSkpKDhw4cPTo0WQy6fP5yF5ks9kSiUQymYxGo9XV1S0tLV6v99FHH/3d737HGPvhD3/4hS98obKyUqqq2nly3FBHORp4ThpHx2k2SpSRZPpjjJHk42JJ+rodDkcwGPz2t7/9q1/9yuPx/Nd//deKFSvC4fDu3btjsZjT6XS73fwSqVQqHo/H4/FZs2Y1Nja2tbX9/e9/f+mllxhjq1ev/tSnPlVfXz8wMLB///5UKuXz+cgszF1/yVpbW1s7ffr03t7el19+efv27f/4xz8yuofnnHPOP/7xD72H1iJqkKMoit1u/8Mf/vDZz3620HUBIBvIBSAtehZCAHLEysMnMP5AEAKLwidEw+HwpEqzlvaVTwfs3bv3zDPPbG9vP3To0FlnnTVv3rylS5eOjIxEIhHuMRiPxx0Oh9/v93g87e3tTz/99BtvvNHZ2Unl9Pb2vvjii/Pnz1+zZk1FRcXAwEA8HudXURTF4/GUlpY6nc6dO3c++uijW7dupY/+9re//fu//zsbVUQFMQlm+qnaxmXsDKmXgiWVSvF5elKD6mM4fX19v/rVr+is9957LxaLffjDH77iiivC4XA0Go3FYlRUKpVyOp0ej6eioqK7u/vFF1984oknjh07RoWEQqGXXnpp6tSpF1988apVq6LRaDweTyQSdOdJwHs8nkAgEA6H//nPf27dutXhcAQCAaqh1+uNxWJ698rr9Q4PDzPGWlpannvuOb0bIirewg5JpW/trbfeYowFg8GSkpLq6upgMKjO2KGusJkm5PhU0+3i36/mFem7S42Sy+UmJ3xOhOceU08XcnM9y/fwN+2MEn8AyFnUfAkGWMdQDwCYYEAQAmshhmAVui6W5qMf/egPf/hDxtju3bttNtvUqVMZY7W1tXrHOxyONWvWfOpTn5o9e/ahQ4fa2trOOOOMnTt37ty5c+nSpcbOSMFg8Pzzz//lL3/p9XrvvPPOvr4++poK5RKpN7Djwz7JfZTQNP3xAtWDckkCiT7MXV1dZWVlfr+fP6iiduLn2my2devWfec731m9enVPT8/mzZunTJnS2tpq0LTa2tpgMLhy5co1a9b09vZu2bLlzDPPPHjw4MaNGxctWuT3+43vTG9v74c+9CG6hMfjicVixvMp1LS1a9c+88wzK1euZMdnTJWUYQGD9ER1J34Rra2tN954I6nfoaEhcUbDChibgEwaiECRwoVojojPSdqwSQAAyA4IQgCKDBoHHDhwgDEWi8XmzJnT1tZ21113pVKp1atXz5kzhzEWiUQcDofL5Uomk48//vhLL710wgknfOITn6ioqGCMbd++nexCJ5xwQnd39w033BCLxb74xS/OmjWLyiSPxEgk8qc//WnDhg1r1qy5/PLLvV4vY2xkZGTTpk2bNm2aN29ed3c3959kowMXvdUUMx0bGQx3xIumUqlEIlFbWztjxgy73R6Px/nEPNNZ8U+zfMkMKO7nnqJU7ODg4I9+9CO32/3Nb36zpqZGjPlUC6d9+/bt3bt39erVNTU1ixYtevjhh2+//fZVq1Z98pOfZKNpgch39L333nvggQecTud1111H8v7AgQPbt28/88wzp0+fzhj79a9/3dfXd+aZZ55zzjmMMYoj9Xg8jLFt27Y9//zzPp/v/PPPnzZtGlXVvN7o7u5+5513ent79W4IO17o8rs0nsYKzedhaGho48aNtE1PBewnYIIhxhnqdVMAZAHmFIAIBCEARQZ14uFwmDGWSCTcbvfMmTMbGhra2tpef/31vXv3nnvuuSTe9u3b9/TTT5eUlHzhC19obGwkNUhwtXDqqaeeeOKJb7755mOPPdbQ0HDJJZf4fD7G2Ouvv75hw4bGxsYbbrihtrbW7/criuJwOJYtW/b1r3/9b3/729e+9jWv19vT00PqMRqNKori8/mi0SilJFEb1jKCq76UkCFW/JTkX0VFRUdHx/bt2x0Ox9atW10ul3gYNZP75rHjJQ1HL3+MaJii7ba2tgcffPCb3/xmR0fHQw89tHr16gULFpAmVEcS0r/cY7Ouru6qq65avXr1hg0bfvnLX65Zs2bJkiUOh2NwcPDRRx8dGRn56Ec/2traWlNTQ8dTVCFtT58+/brrrtu7d++GDRtuv/32j370o01NTYyxoaGhJ554gjF29tlnt7a2kgkxHo97PB6v1zsyMmJy1BgMBumZkdpuOz5pkPrOjBua35HX66UfAj9mfCsFwJgjWQjVUzMAAJA7EITAKoj6AaSFRglchPj9/oULF86YMWPDhg133HGH0+mMx+Nut/uUU05ZsWIFncL1CR83UxBgRUXFeeedd9JJJ/3jH//46U9/Wl5eHo/Hg8Hg+vXrly1bxs+ljfLyctr42c9+VldXd+zYsRkzZkydOnX//v3t7e2BQCAUCtHBXq+XxGF2flMm3YZ9Ph+XBHQ3jh07ZrfbSVY5HA7RfGfgNaoZOMeO14SMsWPHju3bt2/KlClTpkxJJBLPPfecx+NpbW3lmlAsn4QoN5mmUqnS0tIFCxYsWLDghRdeePbZZx955JFAIBCNRltaWq655prS0lLxdClPaUlJyZIlS+bPn79jx44nnngiEokkEomKiooVK1a0traSjGdC8K3P50srCPk3ReugMJVPJtP5SRYkcFQzc09JSQk/YJyrBMA4oGchBACAPAJBCKyC9KozyAkB2PGrn1PGRbvdHggEzj777AcffPC3v/0tY+yRRx7hapAyzTidTjqeTE82m40vdldXV3fNNddceeWV999/f1lZ2d///neuBhOJBPfD7OnpoZ1z5swJBAK1tbW9vb2vvvrqokWLli1bduDAgbKyMrqc2+2WrIVZN5M3QdygYh0OR01NzZNPPqk+/sknn7zgggsM3Aj1ssjwnep/V65cmUgk7rzzzquuumrlypXxePypp54677zz5syZw6UvvyJfFZOgFR1I461du3ZoaOhjH/sYY+zyyy//7ne/y4+hHDNs9LbTfnKFpdykixcv3rx583XXXccY+/73v3/iiSfyc8VGkSeqsRclHexyufhqhJIMVps9C4WeLrVC3QAYOzR9v/HYAwDyCwQhAEVJKBRio0kvuVT717/+1d3d/b3vfe/OO+9kjL388ss/+MEPli9fvnbtWqfTSYfFYrFYLMYFIemTzs7OBx98MBqN3njjjX/961+Hhob+/ve///jHP161atWaNWtIn5BI2LRp07nnnnvttddefvnl3d3dZWVlV1555SOPPPLd73730ksvLdz9OI7t27cvXLhw/fr1Ka0lCtUYjK64IiK9Z7fbTz/99P7+/r/+9a8f//jHV69e7ff7n3zyyYsuumjWrFl2uz2RSHCTIP07ODhIJfD9L7/88ksvvbRkyRKqz/vvv3/zzTfPnTv3rLPOqqqqomNSqVQ8HqdvmTFG5rtIJPLUU08NDAwsW7aMzt2zZ8/f//53xti6desotwpPZWFehLvdbjISSjdENMqlrJFllB3/ZVGgLG0XvGIA5Bd61MVUSXjIQR7BtAIQgSAEoMigTpzUBWm83t7eTZs2dXZ2BgKBM888s7GxkY487bTTGGP79u2744475syZs2rVqrKystLS0mnTppEdjzF26NChDRs27Nu3r7m5+ZRTTpk7dy5jrKys7KKLLnr77bffeeedjRs3nnbaacuWLSPpGAqFpk2bdt5557HRpKbf/OY3H3nkkcsuu+xnP/vZI488Qh6nZtJ7mHwb8cNI54jrCtAlkslkIBBYtGjR0NDQ0aNHA4EAhdVpXijTVyCPPKRFJkgTnn/++U8++eQDDzzwiU984qSTTnK5XI8++ujll18+depUWgqSziVzX2NjI110aGjorbfeamtri0QiH/rQh1atWkWHLV68mDG2a9eue++9t6mp6YwzzqipqbHZbLNmzeKJXo4dO7Z169adO3f6/f4lS5YsXbqU9s+ePTuVSu3atev555+vq6tbvHhxIBCgOpM+NHmHQ6GQtDqFpoleUxOO56hCfWnxeUBSGTDxsFruXADAhASCEFgFxBBmBAlCj8czNDT0yiuvRCKRNWvWUDrKZDJJksztdp955plnnHHG008//c477/j9/tNPP91ms1VXV9MwOhQKPfnkk8PDw2vXrj355JMZY6lUitbHq6qqWrdu3amnnvrwww+/8sorNptt+fLljLGamprDhw8PDw+XlpZGIhGv17tixYra2lrKVipm+BhnuNcoUV9ff/fddzOd2DMzj5k6hpDkByXXueiii5544om77rrrC1/4wqJFi0Kh0D333PPpT3+6ublZPGvatGnV1dW0/e677z7//POnnHLK+eefT9lfYrFYMpn0eDyLFy9evHjxhg0b/vnPfzqdzrVr15aUlPh8Pu5x+sorr3R2di5btuz000+nPaTfXC7XnDlz5syZs3fv3s2bNyeTyZUrV1J6GBKEZjRSZWVlVVUVN05q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BBZCPc67+uqrKa4sLb/61a9OPPFEKaxL7bVo0nqjlgQ0fCehdcYZZ7z00ktPPvnkvHnzYrGYx+PhdjlKDFNSUjJ79uxUKrV3795QKFRSUjJ9+vSmpqYDBw4kEgluYiotLU0mk3v27KHgQ72gtVQqtW/fvm3btp166qls1JWUDlYUhZr8yCOPfOYzn7n++ut/8IMfUD0N2kttMSlCDKDUPuIePZXCFRetGEk7H3jggSlTppx55pldXV1UGSnUk6ckZYwlk0m6z4cPH3766ac7OjpWr17d19eXEpL9kL+oGIoplkbLTrz33nu7d+/mpmap7dI8ggF6iW2NTxefK24hdLvdov+qSdJWMuskqJNHbk2elgIAAAAGQBACqyBZ5PjQubS0NBKJ8CSNokskneLz+cLh8B//+McvfelLjLHf/va3Z5999qxZs9QSy3ygl2bkocfjicfjHo/H7Xafc845GzduPHDggNvtdjgcZKYjQZJMJgcGBsrLy20228DAgKIow8PDZWVlFAZJRrxYLOZyubxebzKZDAaDdCIbHcSTpOHbpD0+9rGPzZkzhzFGXrJUJTrmG9/4xsMPP3z++ec/+OCDBw4cuOeee3hlpGbydCnSuh3qxhrfGYLW29A7TDM1i91upyUZq6qqvv/970cike3bt5MepohEWrSDakgpW5PJJH3vJSUl0Wj00KFDHR0dR44cOXbsWH9/P7/nbDS00m63u1wuOosS/NAGYywajdbW1t52223Dw8NdXV1qX1/z0FUyPUv6OkhRu91uydSckbVWjxxXxZgkZBT2CQAAAExIIAiB1YnH4yQhRESZQWKATEw7duz44he/+PnPf/7nP/85CQwz+UXVyTA1jyftx0YF1bJly4aGhijhDV2FakLbsVjMZrNNmzbN6XSSLOEOk/wSJCPFNTPUkpUsiqRC6ZhEIsHTkNhstkgkctttt917771XX311f3//9OnTb7jhhltuuUVqhe34lQxId2nG0ZmHWwgNPHLV1+X/nn766YlEIhwOizk/1V67dInU6CINU6dOdTqdc+bMmTlzJgUWsuOfB82i2KjF2Ofz2e32d999t6+vL1NBKBZIQi6j0yW4y6iYPpd/lGPJbFQQIpGmMZCCAAAAAAQhsBbqxJhqNShBxp/58+dv3br1yJEjP/3pT4PB4Je//OWbbrqppqbGwNgijZWN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', + crossOrigin: null, + filters: [] + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 776.561, + top: 173.3615, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: 'f772494d-01de-4a9e-b21d-67faed778e60', + selectable: false, + hasControls: true, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(44,246,72,0.99)', + stroke: 'rgba(45,240,230,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: false, + hasControls: true + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -16.7824, + top: -8.9323, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '正常', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: false, + hasControls: true + }, + ] + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 386.3748, + top: 155.1298, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: '3fea9335-b7a3-4b01-bf7b-7d15b4ca6b62', + selectable: false, + hasControls: true, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(248,9,3,0.94)', + stroke: 'rgba(255,243,47,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: false, + hasControls: true + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -15.8708, + top: -8.9298, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '警告', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: false, + hasControls: true + }, + ] + }, + ], + /**画布 */ + clipPath: { + type: 'rect', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0, + top: 0, + width: 1200, + height: 900, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + selectable: false, + hasControls: true + } +}; +// mock tableListDataSource +var genData = function (params) { + var data = __assign({}, currJson1); + return data; +}; +function fetchFabricModelsById(req, res, u, b) { + // let realUrl = u; + // if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') { + // realUrl = req.url; + // } + // const body = (b && b.body) || req.body; + // const { method, name, desc, key } = body; + // const params = parse(realUrl, true).query as unknown as API.PageParams & + // API.RuleListItem & { + // sorter: any; + // filter: any; + // }; + // console.log(req, 'getModelDetailApi'); + var result = { + data: genData({ id: 2 }), + success: true, + msg: '获取成功' + }; + return res.json(result); +} +exports["default"] = { + 'GET /api/v1/mock/fabricModels/1': fetchFabricModelsById +}; diff --git a/mock/fabricModels.ts b/mock/fabricModels.ts new file mode 100644 index 0000000..f29edfa --- /dev/null +++ b/mock/fabricModels.ts @@ -0,0 +1,820 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-09 14:29:49 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-05 09:58:06 + * @FilePath: \general-ai-platform-web\mock\modelDetail.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { Request, Response } from 'express'; + +const currJson1 = { + version: '5.3.0', + objects: [ + { + type: 'rect', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0, + top: 0, + width: 1200, + height: 900, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: 'workspace', + selectable: false, + hasControls: false, + }, + { + type: 'image', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0.7463, + top: 0, + width: 1200, + height: 900, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + cropX: 0, + cropY: 0, + selectable: false, + hasControls: true, + src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAIAAAA+D1+tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0xMS0yOVQxNjowNjozNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjMWE2ZTE4MC1iMTc1LTQ2NGMtYjBlZS0zYjgxYTcwNjY4MTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4YjQzZmIyYy1hYmVmLWYzNGItODVlZC1k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oizn60n1OZ3O5cuXnzp16vXXX588efKcOXO459vFixc3btw4YMCAFStWiJuo6jcYDIFAID8//4EHHvjwww937drF/YR5AyI5hwDEL2FGQyIJciYS7EmBUwAQgSAEIFbwer293QTQ59Bm3lOE+EBygCwoKHjsscco08zBgwdTU1PHjRv3y1/+kuYzIBFCsz+rPCr5LsS99HovROW6yTUhdRnpwNesWZOamjphwgQWQmUxjcsor5ObQ81m82233fbpp5+uWbNm2bJlUogEqqSZRddTlSyUZXnw4MFf+9rXPvroo9dee+2uu+5ijH322WelpaXz5s2jCSq41BQFOVVFNV+6dGnv3r3Hjh1TqUEA+ji9/kYCIBaAIASgRwnjNka2mg6NQeJLBjoJH4ZQ2s6Mp7SGApIgYYzl5+e/9NJL//Vf/zV58uTnn39eVIMqX1Mm3Jm9622ldfJkgsuooplej+x47777bmNj47333muxWPh50K1K6zIq2kgVRbFYLHPmzFm/fv2mTZtuuukmHk+oKizWo42cpGLp6ekrV67cvn37n//855aWlmHDht1///1ms5m1ika+U1XWGc6FCxfghgCA1DqVC/2bYHY/AKIDMYQA9DRSW/j6TsYQdmkbQfwR3c0Qam4uMaCOMeb1er/88suZM2du3Ljx8ccfv3btWlVVFWuNjuMSS3tXM01mzp5Ed7/iSuoaKkIKlnfffbe2tnbZsmUOh4Np3EpF6FRrH1uVX6jVal2+fPm1a9fee+891nrGdKvS3QVrmw9j0KBBFRUVhw4d6tevH6lBJgRqai2E4pGaTCaLxSLWDAAAADBYCAHoMXTDqMS+KZ9zrPP1AxAhuiYjlUYqLS194403JkyYsHTpUirwxRdf/Pa3vx06dOjXv/51KkOztGtj5KgqlVmsOw9IH1WTxMkDg8Egzf/OGHvzzTcbGhpuv/12mp6B6+FQIYhhhJwozCRJuv3221evXr1u3brFixdrNaHf7xclHP8rXgWXy/XKK6/4fL7/+3//L2Ns8+bN/9//9//dddddhYWFBoOBTjI57jK9uToURamtreX+on6/n2y8AAAAAAQhAD1Hu9nMeqwlABBcGol2MC5CmpqatmzZUldXt2rVqmHDhjHGAoGAwWCYOHFifn7+tm3bnnrqqRkzZkycONFoNIoKRAylUykT0SW1d+95ahup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hg0bfvnLX65Zs2bJkiUOh2NwcPDRRx8dGRn56Ec/2traWlNTQ8dTVCFtT58+/brrrtu7d++GDRtuv/32j370o01NTYyxoaGhJ554gjF29tlnt7a2kgkxHo97PB6v1zsyMmJy1BgMBumZkdpuOz5pkPrOjBua35HX66UfAj9mfCsFwJgjWQjVUzMAAJA7EITAKoj6AaSFRglchPj9/oULF86YMWPDhg133HGH0+mMx+Nut/uUU05ZsWIFncL1CR83UxBgRUXFeeedd9JJJ/3jH//46U9/Wl5eHo/Hg8Hg+vXrly1bxs+ljfLyctr42c9+VldXd+zYsRkzZkydOnX//v3t7e2BQCAUCtHBXq+XxGF2flMm3YZ9Ph+XBHQ3jh07ZrfbSVY5HA7RfGfgNaoZOMeO14SMsWPHju3bt2/KlClTpkxJJBLPPfecx+NpbW3lmlAsn4QoN5mmUqnS0tIFCxYsWLDghRdeePbZZx955JFAIBCNRltaWq655prS0lLxdClPaUlJyZIlS+bPn79jx44nnngiEokkEomKiooVK1a0traSjGdC8K3P50srCPk3ReugMJVPJtP5SRYkcFQzc09JSQk/YJyrBMA4oGchBACAPAJBCKyC9KozyAkB2PGrn1PGRbvdHggEzj777AcffPC3v/0tY+yRRx7hapAyzTidTjqeTE82m40vdldXV3fNNddceeWV999/f1lZ2d///neuBhOJBPfD7OnpoZ1z5swJBAK1tbW9vb2vvvrqokWLli1bduDAgbKyMrqc2+2WrIVZN5M3QdygYh0OR01NzZNPPqk+/sknn7zgggsM3Aj1ssjwnep/V65cmUgk7rzzzquuumrlypXxePypp54677zz5syZw6UvvyJfFZOgFR1I461du3ZoaOhjH/sYY+zyyy//7ne/y4+hHDNs9LbTfnKFpdykixcv3rx583XXXccY+/73v3/iiSfyc8VGkSeqsRclHexyufhqhJIMVps9C4WeLrVC3QAYOzR9v/HYAwDyCwQhAEVJKBRio0kvuVT717/+1d3d/b3vfe/OO+9kjL388ss/+MEPli9fvnbtWqfTSYfFYrFYLMYFIemTzs7OBx98MBqN3njjjX/961+Hhob+/ve///jHP161atWaNWtIn5BI2LRp07nnnnvttddefvnl3d3dZWVlV1555SOPPPLd73730ksvLdz9OI7t27cvXLhw/fr1Ka0lCtUYjK64IiK9Z7fbTz/99P7+/r/+9a8f//jHV69e7ff7n3zyyYsuumjWrFl2uz2RSHCTIP07ODhIJfD9L7/88ksvvbRkyRKqz/vvv3/zzTfPnTv3rLPOqqqqomNSqVQ8HqdvmTFG5rtIJPLUU08NDAwsW7aMzt2zZ8/f//53xti6desotwpPZWFehLvdbjISSjdENMqlrJFllB3/ZVGgLG0XvGIA5Bd61MVUSXjIQR7BtAIQgSAEoMigTpzUBWm83t7eTZs2dXZ2BgKBM888s7GxkY487bTTGGP79u2744475syZs2rVqrKystLS0mnTppEdjzF26NChDRs27Nu3r7m5+ZRTTpk7dy5jrKys7KKLLnr77bffeeedjRs3nnbaacuWLSPpGAqFpk2bdt5557HRpKbf/OY3H3nkkcsuu+xnP/vZI488Qh6nZtJ7mHwb8cNI54jrCtAlkslkIBBYtGjR0NDQ0aNHA4EAhdVpXijTVyCPPKRFJkgTnn/++U8++eQDDzzwiU984qSTTnK5XI8++ujll18+depUWgqSziVzX2NjI110aGjorbfeamtri0QiH/rQh1atWkWHLV68mDG2a9eue++9t6mp6YwzzqipqbHZbLNmzeKJXo4dO7Z169adO3f6/f4lS5YsXbqU9s+ePTuVSu3atev555+vq6tbvHhxIBCgOpM+NHmHQ6GQtDqFpoleUxOO56hCfWnxeUBSGTDxsFruXADAhASCEFgFxBBmBAlCj8czNDT0yiuvRCKRNWvWUDrKZDJJksztdp955plnnHHG008//c477/j9/tNPP91ms1VXV9MwOhQKPfnkk8PDw2vXrj355JMZY6lUitbHq6qqWrdu3amnnvrwww+/8sorNptt+fLljLGamprDhw8PDw+XlpZGIhGv17tixYra2lrKVipm+BhnuNcoUV9ff/fddzOd2DMzj5k6hpDkByXXueiii5544om77rrrC1/4wqJFi0Kh0D333PPpT3+6ublZPGvatGnV1dW0/e677z7//POnnHLK+eefT9lfYrFYMpn0eDyLFy9evHjxhg0b/vnPfzqdzrVr15aUlPh8Pu5x+sorr3R2di5btuz000+nPaTfXC7XnDlz5syZs3fv3s2bNyeTyZUrV1J6GBKEZjRSZWVlVVUVN05q3gHJTmiR36nT6VRXG4CJhCQIkVQGADAWQBACUGSQluvo6BgaGtq1a9eWLVvWrl1LUpCw2+20GgFhs9kuuOCCCy644KWXXvre9743depUWs7+0KFDR48eXbRo0Zo1a8SDxXPLyso+/elPK4ry85///MUXX2xubn722WcXLlxImTwcDgd5SPJV1K0G3SsxkM/kQEqanhDDAml85nA4PvKRjzz66KO/+93v/u3f/m3lypVbtmx55ZVXrrrqKvIUZYxVVVUlEol77713ZGRkeHi4ubn51ltvFa8iemkyxlauXLly5cpt27b95Cc/mTlzZkdHx+uvv07mu7q6ussuu8zg3NbW1tbW1oMHD77yyivNzc1z586NRCLMnI9ZTU3N1KlTKQltSlhjw6S1rYBGOY/HU1dXV6irAzAORKNRvm2c6gkAALIGDjbAilDiE6fTSUkjLPKUjvM7WH052uN2u8kQV1ZW9rGPfaylpWXBggW1tbXJZLK/vz8YDJIVi5aCcLlcfr+/tLR0eHi4vb1948aNDzzwAJVWXV19zTXX1NbWLly4MBaLDQwMDA4OkuGR7rndbq+urg4EAgMDA5s3b3755Zfff/99OvfQoUNTp06lq5hMBzr+2EZhWksLpj1XM3zONrqEPS/5ySef7Ovru/DCCysqKv7xj38cOXLk05/+NEnQtrY2WtqRMXbeeeedcsopU6dOLSsrC4VCg4ODkUiEr4dhs9lKSkoqKyvtdvuBAwdeeeUVbvB0Op3XXHPN1KlTFy5cSElc+/v77Xa7w+Gw2+1Op5O+4srKSsZYd3f3wYMHd+zY8cILL+zduzdtYx0Oh6Iop59++qJFi/7v//5Pnf6HV08U0tKe8fx5ill2XC7Xd77znR/96EewloAJCcUt/+AHP7jhhht49mAAABgLYCEE1sLKY7tx1qV6l+NumdXV1XPnzvX5fNu3b9++ffvIyAitsuDxeBRFGRkZIek4NDTkcDiqqqrmzp17wgknTJkypaOjgzG2fPnyqqqqXbt2Pfnkk+FwmDKL8EvbbLZYLEaFtLS0zJkzZ+3atVwQ0tCEpx615kiFizdxDzP3PfLQQVEKchVEGpiWhTjvvPOefPLJhx9++Nprrz333HOfeOKJRx999Nxzzw0EAjNnzqTSWlpazjjjDMbYq6++OjQ0FIlE/H4/zzHDGCMNH41G6+rqWlpazjrrrIaGhtdee83pdJ544olLliwJh8NPPfXUyMiI1+v1eDxut5umS0gQstEFGFpbW0888cSGhga73W5GEJKSf+2113bv3n3KKaewTDy3C2usoIuSA+3nPvc5Nipu055FQtqaTywATMid6/F4+vv7//nPf95www30kZj+lx9vkQlTUHRYdqwFCoJVbC8ASKFKNNo2YyGkA1pbW/fs2WP+crRqHP9rUHgikfB4PHv37v3Od77zxS9+cfXq1T09PZRiRLNYzXIMBqDcSY/+pcUGEokE3QRFURRFSSQSyijBYNDv90+fPr2+vr6/v//gwYOUIpLMqtx+xVevIsdORVEikYjT6ayvr58yZUokEunp6Wlvb08kEjwKi9eBZ9S02Wy0RsXIyEhDQ0NjY2NXV5fL5ZoyZYrH4ymisM+0iUb10Iyjo4/o6yAP26eeeqqjo+Paa691OBz33Xef3++/5JJLGGOdnZ3l5eU+n6+9vT0YDJKWo4UlpEeF6kZRhalUqra2lnw4+/v7BwYGUqmU2+2mpJq8AmQn5JlmuWWYrIXXX3/9r3/9a6fTKa5jJsGXyrj11lu/+MUvBgIB+kWoDYCSjTSje5hfqCbcYPL666/v3Lnzs5/9rHFLAShSPv/5z//mN7/hy5yOv1keTFSK4t0Nxg0IQmBFMhKENKi96KKLHn300TH1q3nhhRfWrl07RoUXF6K+KrqXilR5zUl36Uj1tmh+pEfu0UcfHRwcvPzyy30+3z333ONwOK6++urxa5UA/QoOHTo0ffp0t9stpQ8VIavaSSed9O6779Ie9T1JKwjHRyKqa8KOt1KanDn66U9/+rWvfa2zszMej1N0Fk24JJPJWCymKAppcppDSWqhV76x47S6X7Kmo7X1Md/Dj9EdTlsB8QDaFmvCsyXTDI747EWj0Xg8TssCxWKxI0eOLF68+Prrr6fZN/EnUMBMvwCACQkEIbAW/LXHBSE3YuhBg1qyEIZCoVAoJA4Z+V/JGMi3ucFBr3xFUUpLS3t6ev7xj39cf/31ZIUruMtZFiMAzRFz1qN5Kb5uAmNgXZRUyuOPPz4yMnLJJZd4vd5Dhw498cQTmzdvnjZt2syZM4PBYDgcjkQiekY2fj/5CDKRSJBJkFxD6QDu8UgLS9JS9Ywxl8vlcrnq6+t7e3vnz5/f0tJy5MiR5uZmY0FIVrW1a9c+//zzoVDI5/NJ7WJaX7RFvnQS5KFQqKSkxKSPqzpIEgDrw5NjGfwqGcyGIEOs0I0D64AYQmAtstM5jLGhoSHGGGVWZKODxdToOnV8LEj+eOK40NhflHwmo9GooigdHR2xWIxc/izSk2Y0AtC0jGU9hpBMNOqhyZjeouzKz+4szYl5/kRx/16Xy/WRj3zkqaee+stf/nLttdc2NTVdf/31jDGn07ly5crXXntt9erVtbW1XV1dbrdbXQ3K18pNjqT36HHlpnKXy0Vq0OVyOZ1Op9PpcDgontDv91N22TfffPO88877yle+0t/fb7KB27dvZ6MLmRhjqREn3ROebdWkhZAx1tfXRxoSg2lgZegRFScfuQ5MqVI6Sc8zAABkBAQhKHroLXjqqacyxioqKsbIdtfQ0LBkyZLxMQzqjU1FLaf2eBQP4+VIXp2SsNEzBKndk9J6h0ofjfXQJLvyc6yVnnMp2ajp/qxfv/6ll1566KGHtm/f/pGPfGTp0qXf//73t27d+rvf/e6Xv/wlY4yWMcylGsY8+uij5AlZWlpq8hQ6Uh2hJDZTdM60iJ2NqsR/kuZt3X6/n+yuY1g5AHJG3Tkzw57WCr9KUESgDwQiEITAKmi+7TT3aB4wMjLCGItEItztzfxF00KTr8FgkBbDkM7Ne68qFSgqMc2PxFZIToyahUjX0tR7vEzJ8zaHZhUrmiMwSS2TxqPts846a/fu3VVVVatXr6aUM83NzYsXL6bT86IGpW+cCd9vY2MjBQTmEkBloPos9QyIlTFfMQyDQLGg2b1DBAIA8g4EIbAKOZqYdu3axRijxJi0x4x/oJmrcL00PDysHoiPA2ZaoSenpZ2SeEgJ6+npXUvTFGl8RTV5GbXk8YanrY/YXs15eqk022gkKsW+zpkzZ/r06fv379+/fz8dz1dE4NkC84Xo/EwOpWlXX5BQzx1In1p20JnRnVTPqmTdLkhKkCnmJx/TTnNIU4SW/XkCAIoICEJgLfirjr/wqqqqwuEwBVPxJKJkvqAEG16vt6enR4yYUg/lM0JztJdKpWhBCM2PsrhK7qj9iNQizTjST73TwOypVuzFa5MxUx+DaXh127m0poSBbrfb4/H09vZ2dHQMDg4ODAz09fXxc42vrnmttBXmxwSDwfw6Nk+84WbuT+PEuyfAIkhRynrb6hhCAADIBQhCYC3UY7Xu7m7jU4LBIGOMlufmC6abvJyxU5xUDmWiNzhxPDE20KlHEnrxYJo7RXdBUcBoGsdya4fV0VPXepqQexRTrGBJSQktJU++o3pINljNwpkgDg2iiSgDDTOXJIYoeMrcjBgjk4immVT69q02rwGKEYMHSfyZmzwXzyQAIC9AEAKLQu+5q6666pxzzjn33HNffvnlm2666Ywzzrjxxhsjkcjvfve77du3X3XVVSeddNLBgwcfeuihdevWMWFoa9InMK2tRjwgHo/n2qr8Yaz02PG6zowPkt4BE17yGaP3kKhvi1rR2UYTkJJx2/j07OrGLyfupP1jukp7oYahBhZs82hOiOgdY7AHgCww/9RxG6BoD8TEBABgLIAgBNYlHA5fddVV5513HmPsiiuuOOuss+rq6uijm266iR/W0tLyoQ99iFLn00pNZNQyjvdTKyVNRO/TeDwuLmNYWKWUtv4GXo4GzpDAAMlHy/gZkBSg8SgwrbYXjzdppx3TUWPBH5tchsW5xxACMNaY9AHBMwyyBjMLQASCEFiXaDS6ffv2devWUe7Qxx9//IwzzmhtbU2lUh988MHRo0eXLl0aCARcLtfmzZuPHTu2YMECzaFe2vG0hN5An7L56xUyDuPvHC+heXp2UZGT5EWiNpzqedtqRvWIp6tzfur5KJoJImKG3xGCi0wySR5jUKRkNE/E8JMHAOQABCGwLk6nk1Iy0koS4grULpcrHo97PB7aKUb38WP0is1uFJhKpWituVwKyZqJfTnLIsk/aXxmJsyMHuC0alCzfL3DND8Sn8xcFpxQl2xB9KY2TA6I1bfO+k0GkxCDR9r87B4AAJgBghBYBbXWSqVSsViMHxCNRnkUn6IolOKf/lULQpazVU1tbBQvYYVBZO7qtFD6tnjRzLXD9G8gz0AzbneY/yhylIWTBzz8wILkxSsEAABMAkEIrIKmA4w4P0oiUNzmn4rikJ8rbaS9nOanYjmihZBZQE3lft20ASpAT/WZf67oydR8PnN0+jKelcBQMi14zoGVMfgJ49EFuYN3BBCBIASWRjTKiWYWSvHCPyK1Jp5opqfT9ACUShATfhTQZXSc0QxCm9hNzpRxi+fUIzW6/oTaAZLyi2LIKIHEoWDCgEcXAJBfIAiBdZFknuQyyo535lS7jKbFIEBLrzI8t+dkeB9PhjaOHRTLl1+XUfWDp2mQpDU5Jyq5//rwYAMAAAAiEITAuthsNnEtNdHpTnLgTCaTkiCUsozmxVrCx/d6Fxp/xkhmADVZ2Ev5Y5lIJPKyKqCZqEW+5uFEtRCacdxNi/jM4/kHAAAwyYEgBNZCGqiJ2fzFoEHGmCgIpWhDEW6iybQa6j1ipOJYCM4syNd1Re/ZiSok8oumryZTaTa73e50Op1OJ2XKZWN5e6lKtBRnRifqxd9anNxVnGZIMAAATAYwEQZEIAiBtRB7qEQiIQpCMamMZCHMzmU0UzQd9iZkLjgD61MB1a/VML4PqVTK4XC4XC632+10Orm3sxQKqxfCmjV+v582HA5HdiVY/GHO/Uapn+EJ+SsGAAAATAJBCKyLw+FIJBKSwZC2yVoo6kMDj74sXMLUbmncXMkPmHiDSLXBRL0+3sRrdaaYvwMulyscDjPGPB6P0/n/d7Z6bp/5uqXxeJyKytpJddIK/knbcADAJGQyv8eBGghCYF246iNbBxkM6SPRcsi0BKE4as99mT5NJmRnamY1jkk+bjaOYeOfut3uRCLxxBNPlJSUDAwMPPXUU2eccUZNTc3+/fu9Xq/49OoZXWm/3W5no3ZFgn4ODofDbrfb7Xb61+v1Op3OWCz2xhtvVFZWsuMz9GbdQAAAAABMeCAIgXUR8zSy41UfbYtrcGsuw51H6UKVUZc8AUbPmstvSPZAfvMnQHvzi8ENURTlzTffTCQSDofjhRdeeOyxx6qrqzs6OjweD91Mg7XjKRSQ1KDdbicdSH8Jl8tFAYoul8tmswUCAbfbHQ6Ht2/ffuaZZ7JJr9vNgAkOAAAAgEEQAisjZfWUFKAZG8s4MElGk3phV4AdPzvAt8lj83/+538++9nP9vX1nX766V/72tcYY8lk0m63mzffcdEiLoxpYPquqanZunUrYyzrxSeK5ZvNb1IZAAAAYNICQQisCxnlaADN9/BPRaugnoUwv0hpTicqkgJhWlFzk+E+pMV4SUBFUWw2W0tLC2OsoqJi6tSptJ8e5qwzvqgvxKGvrKqqKsffwuQxAk+elgIAAAAGQBACSyMaCaVVH6RsjdKJalWTNcYLWkxOJlvb9SSxnnstG02JtH///p6enr6+vi1btlx22WVMZzXLfFXSZrN1d3eLOyfbNwUAAACATIEgBNbF2AJjvHiapBjHum4TCb18PJM5htBkq9WHeb3eQCAQi8VKSkr4MWNxD8WAQ9oYB5s5AAAAACYAEITAukgumhl5bE5O3ZJ3JrMINIOUlUR6PikxTHIUMwXmbtOeSOmOAAAAADAOQBACq6MpAml4LcYQZlqCMZN5MI21B/OCKMzMu4lqBnAanGvw1SDOEwAAAABmgCAERYPaR1TMMiqNiXMcDZuXQBNj2G2QP0YEylDCIIYwo0LEs9LeXuMj+U6nE907AAAAANKDEQOwCjmKDbWRMHfXO4ORveZKA8WIuMYgE5oj3j1pW1Q+xd588+S3pZJ6FEvW26NXiN4BtO5F1nWzPnnMF4U5DgAAAJMZCEJgFdRjMmkt+EwHbXkZ1+rJAM3a5n658UdThxsnVpWWfyzShmeK1FK1bZBlIhrFe5hLldQX1ZT0k4Hc7yQAAEweJts7AhgDQQiKCa4P1XFZ0pBurHs6yWFVXYFiIQtlq277ZEDd0hx1V472VYM1V4z3my95UjE5Ww0AAAAwCEJQpFghpT4f0Be126TeEo4GYOgsoelSm9FZentMllC8j19hMZhRAgCAiQ1e5UAEghCAbJBMZJO2Y53Aw2jj75SbhXM0TeflySnqKQmLMGl/wgAAAAAEIZiY5O7OZ/6AyTyUnJxtN46xHM9qaLor52g/n7RxoQAAAMDkBIIQTExyHOel9SXDOHJSYTBBkN2TkJeHSsruk0U1jIud8EyelgIAAAAGQBACAEB6NFeKl1xG9QSG3W7X8yw1vwa9Ghi4AAAAAJA7EISgaJDSikpgZAzGAmk9QGPxpt6pt5ql5NIsOX+af5jHIqdRsYQj5nEdQgAAmGxg1AREIAjBRMAKSUfBREV6a0o5RQ1OtNvtaY9Rl2ZepcBlNEcmT0sBAAAAAyAIwcREXCs8xxLGqPyJhHnfRcvaZNSWPSmO1GazccFG23pr04tnMa0mqy2NYsmaFdBE72aSEM0ay35HErAQAgBA1mD0AkQgCMFEQD0CznGFMT5G1zt9kvSk5m+dsULOe1KWvKMOBTSos6gJuXLTXFfQbrdTAKGmSDNzW4y/gkyNimawyDcyDkyelgIAAAAGQBCCCYI0Jhb1SR7zQGp+OoGHlZk2TS9kLrvSCoumM6dxMhjpqUgkEgbli+F/op1QXY5BCQZ3W1EUg6sbVyy7E8cZWAgBACBriuuNDMYaCEIwMcm9p4OFkEg7aNYLscslf+b4o2lS1nQKZULMnrg8vej5KZasuXh9WrufVAcAAAAAgDECghAAYEQWwYEG1rNMHUoLgpishTa4NU90ENU0SounOBwOxpjD4XC5XAaXELWf+tImUd9DunoWmPRWLSD5mlywfksBAACAcQCCEACQHjORbGmzcWraytQnFhYxE4woZSVNqNkQCTpMUZR4PK6+BD/AWCTr3Zw8Oi3rfbmW+l7Ggkni+A0AAAAYA0EIgDbGK7xNYJOC3sjYjDIxjrKT9I9eEk4roKdm1TlF1S0iFEVRFMVutzscjrRpP9Wy0Iw+yZe5dTJrocncdgAAAICAIAQTmRzFhoEmnMDOZprBcuJHahdQyZzFZZLkYGmchYWN4+jcwCaml6lF/Ei8LWI8oWhCdLvdDocjEolEIhFJ72ne1UwxuFeZ3sZJu4wn1CAAAADAIAjBRCVfOi2thXACjynVbVTbzdjxBjSmUoNqLST9zV0a5R0pwYwU76f+xsVkobwJdru9vr7+wIEDjDFFUYwlaF6qzetG2U0n/JOZlyyjE/guAQAAACaBIARFA63nZvLgPI7zDC6ax9G81eA5MwlNgxg7fmiuFk7iX368ZF4bvyalQzO3p3HyGOl43sxgMPjMM8/s3Lnz9NNPLy8v7+vr8/l8Usma27m70TqdzkwXnNBsoJUZn183AABMYCz1/gUFB4IQTExylxzqkaLdbpdKy5elwvpo2gaZqu16tkEDmyGzjK6WxK06UFBdSbW4HRkZ2bNnTzgc/sc//vHaa6+dccYZjLFAIOB2u8Wz8lJVzcq73W6v15tj+VZ+pEVbdI5FWbmZAAAAwLgBQQgmJnkcLBrHEE4G1IFzTEcmaeZikWyDaU8cNwxS4DBV0CA/S7QN0l8+U/DOO+/cddddsVjsxz/+8U033XTdddc9+eSTq1ev9vv9fX19dHraBDNm0HRbpY2hoSG/388Yi8ViWZdvBX0+DkySZgIAgJpJNYwBaYEgBACkQTOGkAnGNKZlt5GkoGamGVaIGEJ1ThdNWag+UjyMS0HGWCwWe+CBB956663W1tb/9//+X1NTE2Ps/fff/+c///nYY4/deuutdNYNN9xQX19/9OhRMxZRuhZlKLXZbLSooMvlcjqdTqfT7Xa7XC766/F4vF6vz+cLBAKhUOjFF1/87//+b8aYx+PJy/0BAAAAwMQGghBMTHJ0Kks7IJ4kI2a1mdQ4hlDTnqaZb0YqX/PfMcXg0gZKlStGkoLRaPT111//4IMPysrKrr766pkzZ1ZUVPT19b311luMsQcffPDhhx/u7+9vampKJBKDg4N9fX12u11tJBTzfPJPuYp2Op2kCe12u9PppL8kCB0Oh8fjoX8DgUBVVdUnPvEJ8lPNxUI4SWaOjb0AAAAAgEkCBCGYIORXWqgzoKRSKXEcP0lGzByTMYRMa1lC9fHGZ401kj1Qcm1lKjuhiPgYxOPxhx9++O233161atXll19OO//yl7889dRTM2bM+OxnP9vS0nLOOeeMbWP0iUaj2Z2oZxTNQ51yQHNuIscyC94oAAAAwApAEAKgy2RTfZqIdj9N26BxKKDaNijZCfUk4nii1hiSJkylUslk0uFwkOvm/v37f/e73+3Zs+fiiy/+3//9X8ZYLBa7++6733vvvfPOO+9Pf/oTHZZMJhOJRO4NNBComk2IRqOBQIAWn8gCzWtZ57eQx5pIX3G+igUAAACKCwhCUJSone6kPWM9vCt4QpSxRp0/hmViJzR5bmFvnaYdWBIJiqKQkydpvJdffvnNN9+MRCIXX3zxKaecwhjr6OjYtGnTvn37qqqqvvrVr86ePZuOpKJcLteYhuRp3kBadmJCPpZjB24XAACASQsEIShKyHNPjOySxtxm3P+My5f22EYxc3C+sFR6j1xqYpA5ZvwbaOAOyg9IjeJ0OhljsVjs6NGj77zzzqFDh2bPnn3iiSfOnTuXMdbZ2fnAAw90dnauWbPm3HPPdblcbPRpFJ8WiA0AAAAAWBYIQlCUqJWS3pg7l7G4OrmIZrFjJ2kKqAaziMnU097G5xZQLKkrzL/xZDLJs78kEom77rrrjTfemDVr1pe//OXKykrG2JtvvvnTn/60qanpE5/4xIoVK+j0ZDIpppwxWHIjl0pq7hT35PeWWmdKgkFaAwAAAGMABCEoSrKz+5nHQAqqK5DFKH9CYibOzYJ3SUyRmkwmU6kUjxUcGhq67777Nm7cuG7duj/96U90/LPPPvvuu+/W19ffdtttLS0ttFNRFLUeS2uKVB9jnM/GoBB1apyskSIqrfaVjUVSGau1EQAAABhPIAgB0EWShVKW0XFwfUyrS62AZiX1nF1NHjamaGowcV1BxtjevXvfeeed/fv3z549+8Ybb2xubmaMbd++fdOmTYcPH16yZMmpp55aVVXFjl+AUZ1uR600zNhL9cx9Bjlv8ijeLJ5qZSySyliwmQAAMKZgIgyIQBCCYkKdS0ZCU6eNUa+np9ZyvJwFx6ZmrE960k4ac6vFRqa3ayy+ULEm4XD4vffee/XVVxVFWb58+XnnnccYGxoa+sMf/rBt27b58+d//vOfJ69R0b5kHDGYo1pTr+QhbY+Fj6g1zYNEdk+OXjkAAADAJAeCEBQNBqM3g1wvYz2izXv5NtXq7dJOm87C7sbehmqzmLryGWkt47yjmv/mZfw9FgYivvHCCy/cfffdJSUlX/7yl+fPn88YC4VCd9xxx86dO88999yvfvWrdBgPMuSn8ySlUuFq/WZmBiHtrVOXORa3xbLkq4bWbykAAAAwDkAQgolAIpGIxWJsdERukNMyC/iYOx6PJ5NJzavkHekS4r/ZZew048BpXEIWx6ctoYAmGuk2BoPB2267zeVy/fGPf6RkoR988MHzzz/f29u7aNGiT3/60+Qgqrmig+bzIH136m1pp4E4MdB7mgZYGL4AAAAAYB4IQjARcLvdFOVFjMXEv8fjmTp1KvkKjjNj0Zy8mE+zKCQvaTxyr7wkn2w2W2lpqdPpnDdvHqnBXbt2bdu2rb6+fuXKlTyJaCqVstvtUqBg1nXglxb1ZFpZqA5T1Cswl1oZ16SwjEVSGQAAmGxYtpMHBQGCEEwEvF7vwMAAG5sOTnQspG1KQVnUnWnes49Y/LoGJfDtz3/+8+++++5TTz21adOmQCBw5ZVXNjQ0pD0r92qYNOupQwfJc5WeRiKRSKSNszWJxcVSUf/6AAAAAEsBQQgmAkNDQ7fddpvf7y8pKRkYGHC73bSfrwvH/zUuhw+m+WjY4XCEw+Hm5uaDBw/+/Oc/b25uPumkkzo6OioqKkpKSkpKShhjiqLQcgV0is1mczgcdrs9kUgkk0la2ZyP4GknMxFTR+XQcD8YDA4PD/f393s8ntLSUp/PpyjK0NBQNBrlNisikUgw/ew75Pjq8/kqKioURYlEIiMjI2T40jyeqip9SjUvKytzu93xeDwcDkejUdrpdrv5PefWKrvdTuX4fL5AIJBMJiORSDAYdLlcttFV++LxOG3w1f8YY/F43OVy8YC9VCrlcDjKysq8Xm84HB4eHk4kEg6HI5VKOZ3ORCLBb6mk3MQbToVXVVXF4/HBwcFwOGy3251OZ0lJyeHDh++4445XX331m9/85po1aw4cOHDgwIHh4WGbzRYKhTweD50eCoUqKirKysoYY0NDQ5FIRMwokxabzRYOh+l7tNvtiqI0NTW1tLSIz4Oea65oTiTo8Thy5Eg4HG5tbXU6nclkMu1zPgEYu2RRAAAAwGQDghBMEDo7O3t6elwuV1dXl9frJRVBQ0ZpfKwebZPYkPbw7Wg0Wl1d3dvbOzQ0dPDgwQULFjgcjmg0um3btvb2drvdXl5e7na76Vput3t4eDgWi4XDYbfbTTUhRkZG/H4/SRqKeBRRj25TqVQ4HO7v7w8EAiUlJdOnT6+oqLDZbI899tjmzZvXrl07bdo0xlgkEjEoh8bNdCtIz5SUlOzbt++99947ePDgOeecc8IJJ/T29pofXlMhfr//6NGjv/nNb1atWrV+/fr+/n5+AEXZMWFxdpI9U6ZM2blz5+OPPz579uzFixeXlpYyxsLhMKkpLvwURaHK2O12l8sVj8dJ8qVSKa/XqyjK22+//dxzzy1evPiCCy7o7+8nHSgqJS7F6bp0Ot0Er9fLGGtvb9+wYUNjY+MFF1wQDAYjkYjH46H7/OlPf3r9+vWLFi1yu92Dg4M9PT2xWMzhcIg3R1GUkpKSP/3pT1u3bv23f/s3l8sVDAbpKurbpam0k8lkfX39e++99/TTT0+ZMqW0tPSaa6456aSTUjpZQ1OqVSj4LWKMXXbZZQ899NCKFSumT5/+wAMPqB/mTJk8QmvytBQAAAAwAIIQWBcDy5WE1+u9/PLLL774YpfLNX/+fLIQch2oHvZJEpHG0FLGTv5RLBarrq5uaWlZu3btRz7ykRUrVvT29v7zn/88evRoWVlZY2NjIpEIBoOKotjt9kgk4na76+rqkslkd3d3JBJxuVykx6ZNm+Z2u0OhUDgcFt386NKigYvT0NBQWVkZi8Xa29tra2vPOuusioqKY8eOvf3226effvoJJ5zgcDgikYhYmuZtpPLJkub3+48dO9bf3x+LxdauXbto0aKenh7Nu6RXmt1u93g8iqL87ne/mz179oc//OGjR4+KVjKxIfQNJhKJ+vr6bdu2/fOf/5w/f/6ZZ55ZX18fjUYpYM82uii80+n0+XyMsVgsRneSbKpk+HK73YqiHD58uLu7+6yzzjrrrLNCoZB4OdpwOBzxeNzr9dJZ0WiUxGEikXC5XHa7ff/+/du2bWtpaTnnnHN6e3vpi1MUxe12U4zo8PBwX1/f1KlTXS4Xv7e8Rclksq6u7t13392+ffv69evpEsYPqviAUYsaGhqqq6vffvvtk08++ZVXXtm1axcJQuM7z28v/7tjx46HHnroiiuuuP766//93//9e9/73ve+971AIGD+CwXM8v6xAACQd/COACIQhMAqpE1loXZcFBXIqlWryIGzsbFxLKrX1NS0atUqyi8yMjLy1ltvLVy4cP369dFo9NChQ0eOHInH47FYLJVKlZSUzJ8/v7KyMhKJ9PX1hUIhp9NJToZDQ0P79u3r6Ojw+Xzk26kXluZ0OmOx2Jw5c+bMmRMKhd588819+/bt2rVrxYoV69atGxgYOPXUU+nI8vLyTNsyY8aM9evXL1myZOnSpYyx+vr67O7JJz/5ybPPPtt8CQsXLrz00kuXLVvW0tLCGCPtp4nb7eZ+vyIul6u1tfXaa6+dPn06Y8zv92ue7vF4aMNut6uvMnfu3CuvvJK0X3V1tfr00tJSMmAacP7551dVVZHjaHYsXbr04x//+CmnnOL3+2tra8WP9PSJ9OuIRCIXXHDBPffc88lPfpIxtn379vr6+unTp3/mM58xKCQt4om5p6jJLzadNVeyQ2ppjqUBAAAARQoEIbAKuQzIksnk8PAwGzX95XdsRzaxVCpFl2CMvfjiix/5yEdWr17NGHvrrbfuvPPOqqqqpUuXjoyMJJPJDRs2bNiw4eqrr160aBHpFqKzs/PRRx89cOBAU1NTU1NTLBbT82glc9Y777zz2muvXXvttatWrZo6deru3bvvvffeFStWJBKJ3t7ekZERisfLNMkntWVkZKS3tzccDlM4YkaZSGgYbbfbu7q6gsEgY4xi+QxOodwnsVhscHCQ0v8QO3bsOHr0qMfjsdls5eXlzz///Fe+8hXG2C9/+cuLL76YzHe8BFLRvb29f/nLX04++eTzzz+/t7eXp1Hh5kG73R6NRu+4444//vGPJ5100g033DB//vze3l6KFaytrZ0+fXoymQyHw4yxTNvOGItGo16vl0I6qYSMYgj53YhGo93d3QMDA+QWm/Ysde6ZVCp15MiRP//5zyQII5HIsWPHcp8QkdpiNaWUx/pYrWkAAABAQYAgBFZHc7xOO7mUovwo7HhvukwRU3qoDXexWGxkZIQxFgwG+/v7ly1bxhj74IMP9u3b9/GPf7y1tbW6ujoWi9nt9nPOOeeDDz7417/+NTw8fNppp1Eh27Zte/zxx+fNm3fBBRdUVVW53W7yEdWsCQmMtWvX9vb2Hj58+L777rvqqqtmzpzZ29vLGEskEuFwOBKJBAIBdWiZWEhKZxX7aDQaDAZHRka4lVKzydJtkarHGOvr66PbLiW20WwRYywej0ciEcofwxh7/PHH29vb6+vrnU6n0+kcGhoi51Wfz3f06NFt27YNDQ0pikLhhalUKhAIjIyMbNu27ZlnnrHb7YsXL+7s7CQtGo/Hye3T6XQqihIKhQYHBxljDoejr6/v2LFjfX19FJO5e/fu3bt3t7W1rVy5Ul1z9bIN6naReKPwTjb6KBo0PyWsHS8uHRGLxYaHh4eHh0maqm+XWIJoP+c19Pl827dvnz179nnnnfcf//EfF1xwwe23375u3TpykTX4OgAAAAAAOBCEwNLwoTA73kdUwmaz8aUgNDM0qveLyTk0P2LHqyx+iZKSkrq6ung8/sc//vG99967/vrrTzjhBPH0mpqa1tbWt9566yc/+UlPT89FF120Z8+eW2+99fTTT7/kkkvMt53cCA8ePPiZz3ymsbGxqalp5syZvCZ6lWTHB5tpOuLabDbSYNwwZSws9cr3+/0G6Uw1vyzuC3r06NGnn376+uuvX7hwYTgcpgC/c84553/+53/oyJGRERJ4lD2FAiAVRfnQhz7k9/tXrVq1atWqUCjEr0K5TClCz+fzXXvttbwmwWDQZrNRgp8dO3Z8//vfb25uvuqqq6QKSxviv+q2uFwuA5dXUf6Jt1GELJYU1qhXjniuVBMqvLW19Tvf+c4Pf/jDZ599durUqddffz3durQurwZYykfUgPy6jAIAwKQCLhJABIIQWBdxBQK+R/NfvcyKeqN8pqVY1MY0vfFiIpF4+eWX+/r6/u3f/o3UYDweF09xuVwrVqz43Oc+t2/fPsbYxo0b169ff/nll7PRZSHEYb1UB7GGdrt9+vTpt99++4EDB1588UVaFo+8KDP1FNU0OnGNYdNf88AgAako1zVP5I3iJSSTSUokE4lEWltbFy5cyFTBhHRFyowi4XQ6GxoaPvShDxnHEIpQUfxRWbRoUTQaHRgYoGqoq8p01C87/lZQFhy99koV4Ofqmf7Mu4zybcrI6nQ6b7755ptvvpl/RIlV05YGAAAAAEBAEALrohZLfEzscDicTqeoYfgiB9IpmsUaWBoNjAbc5uPz+TZv3lxWVkYmO1KDtN4glR+NRj0eT21t7ebNmxlj7e3t5GJK/o2SGtT8V6xGS0vLjh073n///QsuuEBsrOaNMnD+VO/U06V6H0mF8yYbo2lv9Pv9U6dO7enpicfj9913X0NDA4VEiksOkj+nzWajJDFTpkzx+Xx9fX179uxpbm5mjLW1tQ0NDSUSib6+PkVRaLUJ/iXS92Kz2RRF8fl8GzZsuPLKKxcsWNDU1GRSTmt6EWsa/fQeG/V3Kj7DZPwkH2DGmElXT1F5Uh4jUoAkUMmmykanHoABajcBTJkDAACYhEAQAktj4JHIhNGbwdprmvJPUzXxMiXDlxqfzxeLxfx+fyQSKS8vt9vtNCIn44wYJEaee06nU4o0U5ukuJlOfWlKPyN6eBrLD81bZNI7TnNYrGcGlKSpntAV93CrL63x8MYbb/T395eUlEybNo1CIlOplNvtDgaDAwMDFBbIGBsaGhoeHh4YGAiHw21tba+88kp/f/8ZZ5yxb9++gYEBp9NJnqher9fj8ZCM9Pl8lKuGwgu9Xu8tt9zi8/lo8Y+SkpJ4PM4tkwaa3KRCMBbeegckEomRkZGampo5c+YwxkgPZ6RJ+CKN/BIUT+vz+UgzZ8FkE0W2HAKPAQAAgAkABCGwOuqIODbqsCeO4/Wko3qcJw3T1eN+yXeUb/PV5CjjJVehDodDUZSdO3emUqkFCxZwQchNNz6fj6c/VYuEgwcP9vX1zZo1q6ysTNNESeFzHo8nNbr2OkkdvTZqKhljJ1i9JmveQP6p5DNpBlIvdKLD4di/f/+ZZ565aNEik6dHIpHt27fv2LGjr6+voaFh6tSpTqfT5MIb99xzT3t7e2dnp6IotI6ium56dU5buNrKJM4v2LRS+1Cu0aqqqq6uLkpgy1fLyBFaUeP1119nWX1H1gfWPAAAACCPQBAC6yIalNjxaor2i1Itl6toakLjU2w2m9vt5nFou3fv/vnPf75w4UKbzTZnzhzypbSN5qHhJkQ18Xj897//fU9Pz6c+9alFixZpBsVR3hEyH1Fp8XhcM4DNwLInYV4/G5Svh/FhZEQlPe9yucRYPr1L8wK9Xu/ChQuvu+665cuXZ5o3ZWhoaGhoaMaMGbTcvKYB06AVaR8JpvMI2VRJXIlYLFZTUzNr1qyvfOUrzz77bEZt0YOa1tTUtHjx4ocffphN0Lwp+ZWCBj7kAAAAwGQAghBYC7Uzp6j6xEE2yUXxX4NyzFzX+AC1POAKjTHmdDrb2treffddt9vd1NRUUVEhFquuHoe8Iv/+979XV1dPmzaNC0K1OZRrJ7Is8bYbezmalIjcimXg7WlwunlIxlM5yWSyrKzM6/UyxkZGRr7zne/88pe/9Pl8FFBXVVXV19f3ox/96Fvf+hZjLBgM0vGkjXfu3HnyySczxqLR6NDQEGVkPXDgwCWXXLJ582ZaqYKC6CorKx977LHVq1enUiny7xWjT/Xuhvhv1mqBP4TSpIM4r+FwOF588UXG2N/+9rdoNJpIJMjxODW62CMbTTnD50eoCdyL2OVy0QblLKVpiMWLFy9ZsuT999/PruaTCqhBAAAAkxwIQmAtJDEjqT5JHIr/SiavjAZ5xgeLzn48dQ25g3K73+zZs2+88cann3560aJFpaWlXAlIhkG1DnE4HJ///OfdbvcJJ5xQV1endyQ1kKcJ0Qw11Iv002uUQeAlM2cS1MxtoxaTHNsoXBZWVFR4PJ6+vr4vfvGLDzzwAGOML8rX19fHGPv2t7/d0tJyxRVX3H333f/6179uuOGGOXPmbN269d5777355pvXrVt31113Pfjgg0888UQqlfroRz9KWXz4UoeMsf7+/jVr1uzbt8/r9VZUVITDYVouUtTbou+xyYiytEsvMkFF680IOByOoaGh0tLSuXPnXnrppcalZcq//vUv0s/5LRYAAAAAEwyMFYB1kUQLT5/IVFpxnJ2+3G43yVGyENLfNWvWfOc73znttNMcDgcpN54ThdsSuWVMURS+c/r06d/61rcuvfRSPcsVaQ9KocmEFDUEFxtcbvH9TFheQtKQkp7RLEEqn6lMnZqhm+rLaVopaaff71cUZePGjQ888MAVV1yRSqXuvvtuOqynp4eOvPLKKxljr7322oMPPnj06FGv11tVVbVx48a3336bMfbqq6/+85//jMfjv/jFLzZt2tTc3JxKpegUirp86qmnGGPf//73h4eHKdqQ+/Hy6mVh+TQjuY1FO9WQllJsb29njB07diwWi8XjcbIT8r+0YR6KSDx48KD65gMAAAAASMBCCKyCWj+QaBEH7uK2GAYmGuuk0ozJaLgsJpVRFEU0S9L+srIysdhUKkXBhGKCUKZlzyS3SbHONtXCgNxlVFK/Us4Scb+ZFhkfr94pXlqyMZq5mVLwp8PhoJvJGOvs7Gxubj5y5Ah9VFtb+/e//52N3pzq6mrGGC1OWFJSwv+Sd25lZaXdbvf7/alUasGCBR988AFjLBqN+nw+SuBZXl5OltvUaB4g6fYa2PEMGqL5EVe8xh68JKfJa5SKKikpcbvdTGW0ZBk+qFSIOmuOHpNWNObuAg0AAEXKpO35gSYQhMAqqKPUSFBpul+qbVlquxZLZznkSsBM9Wj4LkpQ22jOGLE08ercpJlMJvm1+FKEvb29GzdubG1tnTFjhtq10lieqf0VTXq98oMJAzlnRoeIEl19Fc1qSDKJFFFZWVkgEBgYGCA12NDQ0NXVlUqlrrjiCsbY2rVrGWNlZWXz5s3jC0WUl5c3NTUxxurr62fMmMEY27Fjx6JFi9ra2kgN0oUikciWLVsWLVq0b98+m83m8/m4Sjf2pdRri55DrJ4gN1DU/O55vV5xzUDNE9WTBZpfjVpJZkGxyCSMZgAAAIC8AEEIrIWk8UTVR2kz+EeihVAywTHVkuKiCFFvm6yYaLpMJBJp1ZTb7aaBfjQa5flgyN00Fou99tpr3/72ty+55JKbb75ZPcQXq+d0OhVFGRkZIcuPpmNnRm3h1jBNh0/uPpq2HE2/U00lyXeSAuSXoG9tYGBgZGSktLSUEsnMnz9/YGAgEomUlZUNDQ0dPnyYMTY0NJRKpWKxGBU4NDQ0MjLCGAsGg9FolDH21ltvNTU1NTc3Hzt2zGazLVmyZNeuXaFQiOxv7777biKR4Os6iFZK8eabb75097ITJzxtLFlB1YXY9JcD0asVE8S2yWrkEn9b1EyelgIAAAAGQBACCyFpCckEJ6og+kgcH6vXdTAzpmeZ6Cg+bg6Hw6WlpaFQiPSeoiiSZYbKjMfjVCu3201pTqgJiUTisccea2xsvP7668nMRd59kriicmiRQ4fDUVFRwUMTNdVg2vZKTrmaSWUyGiJLulQqXzOGkKsa7n9rs9nI+fMTn/jEE0888cwzz7z00kt0sNfr7enpIQOgx+MJh8MkiZ1Op8/n42bY7u5uxtg555zT39+/fPnyjRs3plKpTZs2USE1NTXxePyaa65xOp0jIyOkzG1aAagZWcbMJJVJWwLVgeeq5XLOQFSbIVNBWCwmwTEFNwEAMKnAjBgQQVIZYF0kQSgGCoqGJqYVQ0iMJjdJif+qt22GiMfwq69Zs6a3t/edd95ho4u/8SUBaCUAxtjmzZvJojV16tQ33niDMeZ2u5PJ5Ouvv97Y2NjY2PjRj350/fr1vP52AVIs1KjnnntOUZQVK1ZQ4k36VLMrF9ubEmAq/0ayr+b4PpBW8+M3ih2vBsVtHkNIC2nY7XaPx9PT08MYe+KJJ55++ulbbrmFDn733Xcp1cojjzzCGDt48ODBgwePHj3KGOvr6wuFQnv37mWMtbW1xePxoaGhZDL5l7/8hXyMzz77bN7Sr3zlK9u3b+/v7+eWQMrKI36zdJcyuiHSw5kF3Ejr9XrVS9LbtFYByf0r06tJ3sssIvhNBgCAyUOhu15gLSAIgXWhBff4v6LFg8b0fI9ehg/b8SPpXLpCElG0rSjK7NmzTz311MOHD+/atYvkDSV4jMfjZDA8ePCg3+//0Ic+xBhbvXr1rFmzNmzYwBh79dVX3W736aeffuzYsba2NkpJGo1G6fTkKFRIMpns7Oz817/+tXjx4hUrVvT39zNBzqlbKjaNb+t9JJlYs0DM+ypewiC4jo4hPeZyuYaGhhRFWbNmzfLly5955pn77rvvsssuq66u9vv94XD42LFjbDSRzA9+8INnnnlmzZo1jLHGxsabb77529/+NmPse9/73mOPPVZWVnbttdcyxp5++mnG2KxZszwez6JFixhjzz33HGPsuuuu8/v9ZNQl7a35DGjqZ02Mn6KUPuIx9NDaVNrSdryK1qxhWrDghEkwMAIAADDJgcsosBDSyIwsSPxfj8fDYwhTqZTT6SQHQsaY0+nkH2mS0knFmVHdREEYiUTOOuusurq6O++80+Px1NfXk1+ozWYjaReJRC699NITTjiBMRYIBNavX3/TTTfdeeedXq/3V7/6FWPs0Ucfffnll2+99daDBw+OjIzwZJu8wn6/v729PZlMrlmzpqWlZXh4OBKJsNHVzDWH+5L3o1qeiUiqUk+BSAdoKkB1Iex410e+QRflLR0eHg6FQjNnznznnXdmzJhx9dVXM8a8Xq/P51u9ejUZTu+55x7G2Lx58+bNm0dnNTY2fvvb36ZLz58/f/78+Yyx5cuXv/vuuxdccAHtnzp16pYtW2j7V7/61fLly9va2jo6OhoaGlKpFK1cL1ZVXW3N+yaKavGRy+LR4nfP4Om1jVo11V+K3hX5wVkLwmJxnsxdyBVLSwEAIO9gLgyIQBAC6xKPx2lZNrJEjYyMkCJijJFVbXh4mNYbCIfDPBBLQk8UGSgZvXJEQdjf39/Q0LBw4cKf/exnXV1dFC6oKAoZvrq7u2+//fZHH330y1/+MhmmHnvssWPHjl1yySWvvPLKD3/4w3Xr1v31r39tb29/9dVXr7rqqsrKypGREalKiqL4fL7a2lraPzQ0xIf4elpOanJKlStFFGYGVjLjW8FxuVx6bxSbatkMdnx2UzLqVlZWvvnmm7fffntzc/OiRYsOHDjg9/tLSkp8Pp/H40kkEpWVlW+//bbf73e73WVlZYODg1u2bHnqqafWrVv34Q9/+ODBg06ns7KyMhgMDg0Nbdu2LZlM2my2yspKj8cTCAQo8Ux7e/tzzz33+9///sILL1y5cqXL5QqFQuTWq26yyebbVAGuTEszpy3Bbre73W61eDP4fk1i/mUPWyIAAAAwmYEgBFZB00K1aNEil8sVjUY9Hs9pp51GToCMsXnz5tXV1VVXV8fjcbvdvmzZsq1bt4ql8UL0BtPq6CzjiokCoL+/X1wnoKGhQTqlvr6+paXl8OHDdIrf7z948ODUqVMvvPDCk08+ecOGDfX19Xfcccf999+/fPnyWbNmMcaqqqr0KpBMJu12e0lJCelh0g+SYOBCi4Sx1HxJFZMek1SlGQuqdJfUhkrj207OrtxIaLPZzjzzTEVRli1bVl9f//Wvf13zojQRQPlCGxsbKysr+/v7Fy5cOHv27MrKSopFVBSltLT0/PPP/+53v6sO7QuFQrFYrKmpae7cuYwxv98fDAalthtUW/MmSGGr5iWl+MjxoFMqSq8aGVWPA5kHAAAAADNAEAKrYFMtvVBeXh4OhxljlHKjt7eXf8RHxmTnIb3EGCOZwb3m1HovrWLRlFIEz/wxe/bs7u7uWCzGfVbVrFixYmhoiGuGNWvWUEqY+vr6devW+Xy+adOmTZs2japtDI3su7q6+OVEZ1ox0pIaTlGImmsVGlgIUybylEoH87Q36k81z6JTSI4mk8ktW7asXLnS4XBwX1BNAoFAIBCghekZY83NzU6nc8GCBU6nk8IL0+L3+/1+Py1hzxjbs2fP1KlTxe9O/K7Vz6Emdrtd9PM0Y9BTfx30JbpcLsll1MDuanAVM7MbE4MJ30AAAABgPIEgBBZCPc67+uqrKa4sLb/61a9OPPFEKaxL7bVo0nqjlgQ0fCehdcYZZ7z00ktPPvnkvHnzYrGYx+PhdjlKDFNSUjJ79uxUKrV3795QKFRSUjJ9+vSmpqYDBw4kEgluYiotLU0mk3v27KHgQ72gtVQqtW/fvm3btp166qls1JWUDlYUhZr8yCOPfOYzn7n++ut/8IMfUD0N2kttMSlCDKDUPuIePZXCFRetGEk7H3jggSlTppx55pldXV1UGSnUk6ckZYwlk0m6z4cPH3766ac7OjpWr17d19eXEpL9kL+oGIoplkbLTrz33nu7d+/mpmap7dI8ggF6iW2NTxefK24hdLvdov+qSdJWMuskqJNHbk2elgIAAAAGQBACqyBZ5PjQubS0NBKJ8CSNokskneLz+cLh8B//+McvfelLjLHf/va3Z5999qxZs9QSy3ygl2bkocfjicfjHo/H7Xafc845GzduPHDggNvtdjgcZKYjQZJMJgcGBsrLy20228DAgKIow8PDZWVlFAZJRrxYLOZyubxebzKZDAaDdCIbHcSTpOHbpD0+9rGPzZkzhzFGXrJUJTrmG9/4xsMPP3z++ec/+OCDBw4cuOeee3hlpGbydCnSuh3qxhrfGYLW29A7TDM1i91upyUZq6qqvv/970cike3bt5MepohEWrSDakgpW5PJJH3vJSUl0Wj00KFDHR0dR44cOXbsWH9/P7/nbDS00m63u1wuOosS/NAGYywajdbW1t52223Dw8NdXV1qX1/z0FUyPUv6OkhRu91uydSckbVWjxxXxZgkZBT2CQAAAExIIAiB1YnH4yQhRESZQWKATEw7duz44he/+PnPf/7nP/85CQwz+UXVyTA1jyftx0YF1bJly4aGhijhDV2FakLbsVjMZrNNmzbN6XSSLOEOk/wSJCPFNTPUkpUsiqRC6ZhEIsHTkNhstkgkctttt917771XX311f3//9OnTb7jhhltuuUVqhe34lQxId2nG0ZmHWwgNPHLV1+X/nn766YlEIhwOizk/1V67dInU6CINU6dOdTqdc+bMmTlzJgUWsuOfB82i2KjF2Ofz2e32d999t6+vL1NBKBZIQi6j0yW4y6iYPpd/lGPJbFQQIpGmMZCCAAAAAAQhsBbqxJhqNShBxp/58+dv3br1yJEjP/3pT4PB4Je//OWbbrqppqbGwNgijZWN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', + crossOrigin: null, + filters: [], + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 776.561, + top: 172.6152, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: 'f772494d-01de-4a9e-b21d-67faed778e60', + selectable: true, + hasControls: true, + userProperty: { + modelId: '987', + status: '0', + }, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(44,246,72,0.99)', + stroke: 'rgba(45,240,230,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: true, + hasControls: true, + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -16.7824, + top: -8.9323, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '正常', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: true, + hasControls: true, + }, + ], + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 384.136, + top: 152.891, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: '3fea9335-b7a3-4b01-bf7b-7d15b4ca6b62', + selectable: true, + hasControls: true, + userProperty: { + modelId: '123', + status: '1', + }, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(248,9,3,0.94)', + stroke: 'rgba(255,243,47,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: true, + hasControls: true, + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -15.8708, + top: -8.9298, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '警告', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: true, + hasControls: true, + }, + ], + }, + ], + clipPath: { + type: 'rect', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0, + top: 0, + width: 1200, + height: 900, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + selectable: true, + hasControls: true, + }, +}; + +const currJson2 = { + version: '5.3.0', + objects: [ + { + type: 'rect', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0, + top: 0, + width: 1200, + height: 900, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: 'workspace', + selectable: false, + hasControls: false, + }, + { + type: 'image', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0.7463, + top: 0, + width: 1200, + height: 900, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + cropX: 0, + cropY: 0, + selectable: false, + hasControls: true, + src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAIAAAA+D1+tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0xMS0yOVQxNjowNjozNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjMWE2ZTE4MC1iMTc1LTQ2NGMtYjBlZS0zYjgxYTcwNjY4MTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4YjQzZmIyYy1hYmVmLWYzNGItODVlZC1kYmNkZjA3MTNhYTIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplZWViNjVhMy1iNTM1LTNmNGEtOTM4YS02Y2FjMDg0OWJlMmIiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplZWViNjVhMy1iNTM1LTNmNGEtOTM4YS02Y2FjMDg0OWJlMmIiIHN0RXZ0OndoZW49IjIwMjMtMTEtMjlUMTY6MDY6MzUrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi4zIChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YzFhNmUxODAtYjE3NS00NjRjLWIwZWUtM2I4MWE3MDY2ODEzIiBzdEV2dDp3aGVuPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+ZRXnmQABfNhJREFUeJzsvXd8HNW9939mtu9Kq14syZJly733hm2Mwaa4gXGhp1FSuCmXJ7m5IbnJk3LvLwlJLhAglISEEEwxBhuMDcbgjm2wjS33bslFVq/bd35/fF86z9HM7Gq1arurz/sPvUazZ86c6edzvuVIiqIwAAAAAAAAAAB9D7m3GwAAAAAAAAAAoHeAIAQAAAAAAACAPgoEIQAAAAAAAAD0USAIAQAAAAAAAKCPAkEIAAAAAAAAAH0UCEIAAAAAAAAA6KNAEAIAAAAAAABAHwWCEAAAAAAAAAD6KBCEAAAAAAAAANBHgSAEAAAAAAAAgD4KBCEAAAAAAAAA9FEgCAEAAAAAAACgjwJBCAAAAAAAAAB9FAhCAAAAAAAAAOijQBACAAAAAAAAQB8FghAAAAAAAAAA+igQhAAAAAAAAADQR4EgBAAAAAAAAIA+CgQhAAAAAAAAAPRRIAgBAAAAAAAAoI8CQQgAAAAAAAAAfRQIQgAAAAAAAADoo0AQAgAAAAAAAEAfBYIQAAAAAAAAAPooEIQAAAAAAAAA0EeBIAQAAAAAAACAPgoEIQAAAAAAAAD0USAIAQAAAAAAAKCPAkEIAAAAAAAAAH0UCEIAAAAAAAAA6KNAEAIAAAAAAABAHwWCEAAAAAAAAAD6KBCEAAAAAAAAANBHgSAEAAAAAAAAgD4KBCEAAAAAAAAA9FEgCAEAAAAAAACgjwJBCAAAAAAAAAB9FAhCAAAAAAAAAOijQBACAAAAAAAAQB8FghAAAAAAAAAA+igQhAAAAAAAAADQR4EgBAAAAAAAAIA+CgQhAAAAAAAAAPRRIAgBAAAAAAAAoI8CQQgAAAAAAAAAfRQIQgAAAAAAAADoo0AQAgAAAAAAAEAfBYIQAAAAAAAAAPooEIQAAAAAAAAA0EeBIAQAAAAAAACAPgoEIQAAAAAAAAD0USAIAQAAAAAAAKCPAkEIAAAAAAAAAH0UCEIAAAAAAAAA6KNAEAIAAAAAAABAHwWCEAAAAAAAAAD6KBCEAAAAAAAAANBHgSAEAAAAAAAAgD4KBCEAAAAAAAAA9FEgCAEAAAAAAACgjwJBCAAAAAAAAAB9FAhCAAAAAAAAAOijQBACAAAAAAAAQB8FghAAAAAAAAAA+igQhAAAAAAAAADQR4EgBAAAAAAAAIA+CgQhAAAAAAAAAPRRIAgBAAAAAAAAoI8CQQgAAAAAAAAAfRQIQgAAAAAAAADoo0AQAgAAAAAAAEAfBYIQAAAAAAAAAPooxt5uAAAAAAAAADGEoii93YTuRZKk3m4CiCEgCAHoBcJ8afCOBgAAAHqA8KoPn2PQd4AgBKB34F8aRVHEZdUCAKC70e324RkEIIHhT30o1Yc3AOhTQBAC0KOI3xiVFKRlKiBJkuprhKFKALoEbT+voz0/PIwAxDuqbzFrfa5Vy3jYQR8BghCAnkb1gRH/1X6QOBitBKALCWWiVy3rPnd4GAGIa+gxDy/2RE2oVYwJALQuEIEgBKAXoG+M+L1RLYfpjAIAokPsz6kerjDmegBAohLGNsg0ChAvBJDAQBAC0Mtw+Uf/an1He7NxACQcuvZA0WIg/o3EZwzdRADiiFBPdJj1eMZBwgNBCEAPIX5RVL4o/G90rint9lmhLRMD1YWOtfgW8U5WrdQtGb6eyHfKhB5bhPkhVC1kGvkXym1bt/6YugoAgMjR+oWK60P9C0DiAUEIQM/RrmxT+Y6qfhXr0Tq8hfpJVQYftngklM9Sb41bhw+ui6SR4Vve0ePqpE+XdoAmvE1A+zDChgCASCQfO91/dceVoqPzVYkvNHw6QWIDQQhAt6PNLKoNUqKVsWbzASAh0TqL6prrQ22uO2qj64kKQN9Ea5MXP3YsYpWl+kR2dORFd4iKtX1aVc3g32KmcSVIsHEfvKaACAQhAD1B+OCEUHkO+Zpubx8AMUOoqFpdOupfGl0fSDWmE6ZmPK0AhEc7QqpaH0rFcTr0cujQU6/r3846KGIBiEcSarQDgNhE+1nS2glV1olebS8AfYhQ4hNPIgB9BN3QfbwWQJ8CFkIAegfVIKj2IwRAXyAWBiV1nz48iQDEAj32itDuSFcKxsIrq0vAKw6IQBAC0EOo4o5ULijkOBoIBILBYO+2EyQeMTVxgjgYL8uywWCIkX5JMBj0+/264UNxRIeanTBdW5CoGAwGWZZZTz2P2kh+rUkwTt8MAIQHLqMAdDuhnEW1Yfe90ToAADzBAAD/D5UyVMV0JEbPGW88IAILIQA9hJi6UPzLhM7oQw89dOHChZycHIvFYjKZLBaL0Wi0Wq1Go9FkMhmNRoPBYDKZGGOyLNO4Kf1Vwc2MKnsjzI9xiniV+bJ4A6j+himvIvytov1Vd0EsTHY2+uv3+wOBgN/v93q99Nfj8ciy3NTU1NLS4nQ6H3zwwREjRjQ2Nno8Hm4n5zY61TJVzp8acVlEURQ6Ur4gyzIt82dQkiRZloPBINkf/H5/v379mpubf/Ob31y6dMloNFosFnr6zGaz2Ww2Go30DMqyTMu0IJ5b3XOuQrW+M/9GUn8ktPtOiOSlgRcL0EX1ZuAwxvwCPp9PfEvQv01NTbIs/8d//Mfw4cOvXLmiKIrf72eMSZIUDAZDvSK0URgc2lC3nfSTwWDw+/2ZmZmFhYXhR2xVJsROniUAYoEEGecAIJbR5oxRjTJSb/Wjjz6aP39+7zYVgB5m/fr1Xq+3rq6O+mqBQCAQCCiKQn0+gjqRXBOy1g5cqKF6rgDFZRKBkiSRCKQF+uvxeG677bb777//008/7dGDBwC0x8aNG+vq6gKBQFNTE70QaMiJ3gn8RUFruOrTvhlENSiOK9G/Ho+noKDg008/3b9//65duzIzMwOBAB9hCW8bhKkNJACwEALQQ+iOL4qRhPRlSktLc7vdrHXsU3dzAOIC3UF6WpBl2el0Xr16deHChapNeN9LlHzi6L5YQFU/78DpPju0ITcVcsu82+22Wq0vvPDC4MGD+/XrV1dXxzQGB21tAIDOo3rExKEcxlhLS8uCBQsCgYDBYFBtyH0ExNdFqGp1ETfx+/1Wq/XWW2/9zne+4/F4qAG6DzveACAhgSAEoCcQ01SolvnXZcCAAYyxhoaGQCDQW+0EoHcRvalVySS0PcIoPCR1fbatVitjrKSkhDHW1NTkcrmibT4AoCtJTk5mjHm9XpvNpvpJNN8xvfdDu4ibGI1GxlhhYeH48eO1UyOqRGCo9QDELxCEAHQ7oea01f3G4AMD+hTBYLChoaG5uZn7gGnDCFmIGMJQdZINkC+rRKAKWZY9Hs+gQYPef/99hoggAGKJlpYW1iOfRa/XazabGxoaKisrVT4FfJkXxmcaJB4QhAD0HFzy6XY6zWYzw5cG9DE+/fRTt9tdW1tLc64oisLDCClYiAcI8aeGRwppHxbuESqme+HCj8cN0gItG41Gj8djNBo3btzIGIN9HoDYgZ7HxsbGpqYmSj3FPcn5m4GvFGMIGWOSJNHmulpOlmXyBcjKysrKyqLvL2WQ0nU9wIgtSGwgCAHoIULZCflKclkBoI9AfbUbbrihpaWFPx1a86Co/cSunq6FUBtDqEoxKuYa5clmPB5Pamrqo48++vTTT6PDB0BMcejQocrKSlmW6+vrZVlWJZ1SZZ+iNwNPFUOjSyaTiX95A4EAPfsGg8HlcsmyfO7cuQkTJqxYsYK1TQZOaJfF7DJ4XYCEAR1QAHoUrXmQf1EgCEGfgis6m83Wu/0qCk8aMmQIiyouEQDQfYwZM+bs2bMWi8Xn8zHGJEnyer2sdR4Lbi1kenNOiANJooeOJEl+v1+SJKfT+Y9//OPtt98mQahF6zKqikAGIDFABxSAnkZMbyiCnijoU6hyQvQ6NMsZYggBiB1SUlIYY/3796cJeLuDBx988MUXX6RlbW7hGHk7AdDdQBAC0GuofE4o4xn6o6CPQILw/fff93q9TU1NbrebT2rPowcpsJB7hTEhgDB8zTyMkAcQ8hhCk8nE0xLSnISMsTFjxrzyyisMc6wDEEuQVbCb1CDNN1NZWckjh0MNyybkdxlaF4hAEAIQK8BlFPQpqDsyderU6upqr9fL08ZoJ6ZnjIkBQix0DCETUoyKU9LTJuL09LSG8sr4/f7CwsKpU6c+/fTTUSSvBwB0Ey0tLRUVFRUVFSaTqa6ujscQEjRgRG8DekXQVnzwiLW+OoxGYzAYNJlMXq+3sbFxxIgRo0ePpvlm6urq+IbkRyo2QCsFoaNAQoIOKAC9g/YzA5dR0AfJzMzMzMzs7VYwxti9995733334TEEIKa4ePHi+fPnJUlyuVxcB/KkxNyhQJZl0nUqJwKy/pGSTElJaWxs3LJlS2pq6o9+9KOxY8cyxkwmk+qpD28PTBhrIZQtEIEgBKAX0H0RR9gTlWXZZrMZjcZI3uZ448cvkXQ7VGVU/wYCAZfLFd4HknwmudEsijaE30r09uSQG6fFYqFJxmIKi8XCnbfFqQt5AYoBFo+L+51GB68N3qoAaJk8efLkyZO7sMLHHnvs5Zdfrq6upn/FCWzowyo+zmJ6cAASGAhCAGKFSPqUNAja3NzcA+0BiQEfONeFxtp7sj2c2tpaxtj58+erq6tdLhc1Q+UJRh5c3Ju0XX9RppmVXnQclSTJ4XBYLBbGGDmpUkp6n883cuTIl156iTFWWVkZ+SEYjUa/30/ZaLoE0qJdqAzDd2TDDBj1vKcc8vh3Bm0yzHYJNSNul+yl8wpKbJ7f7++SkAqfz0dTUJhMJv7eE73EaToKuImCPggEIQCxQiRfUIPBIM7QDUB4KEwujMAoKCj43//937y8vObmZrfb7XK5vF6v3+8X/xI84wst8HQvPOkL6Sv66/P53G53cnLymTNntm3bZrFYxo0b19DQ4PF46Kfm5uaWlpZly5adPHnS7Xa3tLSIcUGs1bQozjbGdaA4oi8eGg2p8HQyXBlKrciybLFYtm3bVl9fv3LlSsYYTXVtMBhOnjw5ZMiQgoKCS5cuORyOpKQki8UiSZLJZDKbzbIsOxwOg8FgsVjMZnNBQcG5c+c+/vhjkoLz5s0bNWpUXV1dY2OjyWTSFXViZCP/12w22+32Cxcu7Ny5s7i4+Isvvug+ca6aOU2bTTEMJKe7deBAkiSK8oKZNDroNqb4ugg3ieI7wu/tdrc1GAw2m02WZa/Xy6eLoAfZYDCYzWZFUbxeL80KKJri+aNqNps9Ho/H42GM0VSlPCZQaZ2eVBHmKRVfC0x4APkLISsri5LTXLlyxePx0MAQr7ALz1K8AJULRCAIAegFdMfCI7QQ0sKXX345cOBA6kV1RwtB/EL5Oc+dOzdmzBjW3n21c+fOwsLCnmpaTFBfX9/Y2Hj77bfzNRSDZDKZxJXt4vf7X3755ZtuuqmoqKir2hami8ZNnVxSiqlTA4GA2WxWdalp6u2amhrGmKIodrvd4/FwXZeRkeHz+bxeL8/pGkqM9YBIozZ0914SmJ45gZEPCgQCgaamJt2fVEb1UHrM7XbTwj/+8Y/6+nqfz+fxeGi8SbxjuWeBNhcxNSMpKamiouLEiRNPP/30uHHjWGvQoK61k3slRHiYACQM6EoC0At0/nuTk5OTnJzcJY0BCUlOTk74AjRgP3bs2MrKypaWlpaWFrfbTd0sJhjoaAhfNN1wCx4TpAKfIZpKGgyGoqKia9euPf/884qiPPnkk36/3+PxiOF2NJxhNpuZ5onojlF5vosBAwY0NDSofiLHWjJZ8L2LiU/p6IxGo9PpbGxsPHfuXHFx8fLly+vr6ysqKiwWS3JycktLC5VkrVY1MR5JFVrJWjvxaWlppaWlo0aN6qYDX7p06bvvvivL8pw5c44ePXrhwoUhQ4acOHGiy3cEQDdBlvxAIEBCjgyDfFxVayHkJke/35+UlOR2u//zP//z7NmzJAh1nUI5UIOgbwJBCEAv0PloGXy0QJfgdrsPHjxYUFBgs9lSU1MDgYDX6yUvU+pOiR6bTNBIXNKw1jBF7u2ZnJwcDAbPnDnzyiuv7Nq1a/To0eQkZrVatebKUL6LXZ7LgQ6EvEapGfygyMjGGKM09OE5derU1atXR40aZbFYrl69arFYUlNTt2/fPmTIkKhtrbt3737jjTd++tOfmkympqam5uZm0ZWO0HZ2+b/8XNGFoLkWyWePMfbee+8xxrKyssaPH19fX3/hwoWMjAzW2slu1zFB9A/spteONudQd+wlsRHPYSxcJm6si7oxdD8bjUZ6ZqOrhLBarePGjaOXG41Ahd9vZ/YFQJwCQQhAL6D7jeyQXxaS44PwRHiH/OEPf5g0aZK4xuFwdEkDXC7Xf/7nf+bk5GzZssXv94ea30/7LHQovC1CyJ5A+2psbGxsbGSCsgrf0+UWCUmSampqdu3addNNN6WlpQWDwePHj48bN85isQwbNuzIkSPp6elJSUlMb8RHt3PMVzY3N//yl7/ct2/fv//7v2dnZ5tMJu4Lp7qOokrkuWFpgR+gzWZTFMXlclVVVT355JNUT3Z2NgVAGgyGK1euMMYsFkswGMSbBMQy4QP8ItmWng6j0ZiUlNSuGgSgzwJBCECs0KHPnqp7jUFNwNrqjQiDSymfe3V1dVlZWX5+flZWFhNmgQ9Vv1azUXna6bFjxz7++OOpU6dS5TU1NdXV1Xl5edq9i6Yn3Xs41PpICGWa4GF4qjaIa1T7pfJ+v//jjz+eNWsWHYvH41EUhVL+FhQUuN3uLVu2zJs3z+Fw0OZc73GpJtYv7nH69OmnT5/2+/0+n2/YsGGdDwz2+XxNTU0ZGRmvvfZaWVnZzp07a2trk5OTqW26wWZ4h4AEg/xL6Vlzu93RZUWCvRr0ESAIAYhj0IcDIu3qKxEqQ5NxZWRkpKSknDt37sqVK3l5eZmZmTzMRtd1kxum+E80QlFfX79p0yaLxbJy5UrSlowxyjGobWSHjigKQjnRqVJZigfIl7niVRSFDq2mpmbr1q0jRowYOHAgrz8QCHBxVVJSYjabSTGmpaVxTcjrFHekCJMcMsauXLkyefJkWZbPnTu3a9eu/Pz8QYMGdegMKK2pFBljjY2NZ86cyc3NpUtAmRVra2vLy8srKir8fr8qhJLbP5nGksm1sWpNJE0CoKvo6HtAe4uqhoF0y3TJruMIPMhABIIQgF5A138MSfZAz0Peg4wxo9E4YMCAS5cunT17tq6urqSkRCsFVWYuVWjZuXPnjh07lpycPGPGjJSUFPrJ7/c3NjaKN7xKrIb/tzuQNNMYintU7Z3UYGNj45YtW/r37z9y5EjGGHlaUjZCMjvQPGmFhYXNzc3btm2bMWNGVlaW1HamB753pnGEq6+vd7vddrs9Pz+/ubn54MGDDQ0NY8aMMRgMPFuG7pnRrqyqqjp9+rTBYMjMzKQ158+fZ4w1NzdXVlbS3I+Uyl/VJBWiStQNZQSgJ9EdpIh8eCLqCVdxw4M+AoIHAOgFePdO5XTXi00CfROlNYsmY8xkMg0YMGDSpEmXLl3aunUrpX0XJYdqgQsVxtjWrVvXrl1bVFR0yy23pKSk8AQzRqORJ95stxniglaKdBUqb1iu2UT9JppAXS7X2rVrBwwYMHXqVNb2OaWJGXm1jLHhw4fn5eV98skn5EoqtZ08TWyG2AaPx0OmWrPZPGrUqBtvvPHs2bMbNmygQSKes0fSwI2Q1NRjx47t3r07Ly9v8uTJdOYZYyQCDQaD0WgkZ9QwehiABIa/uHq7IQDEHLAQAtALhMkw0SEweAk6CZ/si9+TND/BxYsX33rrrcGDB0+dOlWVk5OLELKeHT169L333hs6dOi//du/cb0h5j7Rjs2rhvbD38bt2gFC/arSliK6PUJRlPI66+rq3n777fHjx48fP55pxCQXhHS8ZDmcPHmywWD4+9///s1vflPUbCrRqxoMolNHlsaUlJRly5bt2bPn6aefvv7668eNGydOdq+yFtLVaWpqev/99zMzM2+55RaqSqXDLRZLQUFBeno608wmJzq1RnhRAOhJtDbqjg4YGY3GUHmtAAAMghCA2IGsAeiHgZ6EAvxEdyz6t7CwcOHChaWlpe+///7YsWMLCgooQwNNBUYixO127969++LFi/PmzRs/fjwPKRR1BQvhCx3JfR65YuzQepWxTvSMldomg6mtrV2/fv3gwYNJDWpzw4haV2md9UGW5QkTJly5cmX9+vWLFi2ildrDEdvg8/nEBtDC1KlT8/LyDh8+XFZWNmXKlJycHD6btjiiFAwGDxw4cPny5TFjxgwbNkxUd3RF6uvrGWMtLS1vv/32qVOnWAg9jDcPSGAURQllGISFHAAGl1EAepHOu4wqAOgR+S3EM76IKo5qSE1Nve6669LT0z/77LMjR46wtsa6ixcvvv/++xUVFXPmzJk4cSKfMFp7i/Kp3jvUsO5DlVSGaTLKkOJtaGhYt25dv379Zs2axVqn41OpJnEWe4L7iN52220+n+/DDz9krdkOtYfPa+OTTLC2crF///7XXXed2+1+//33y8rKeP3cUEkhi2fOnBk5cuTw4cOltplsVFk04CkH+g7aBzNUyfBDIdG9VwGIO2AhBKAX0P0CIakM6HlUdx1XI+RwKMvy9OnTy8vLV69effTo0eXLl5M74vbt299///1Zs2YtW7aMNiTLodI2lyZVqFJNvdKvCuVTqvLk5Ms+n+/ZZ5+dPXv29OnTWauUUumrQCAgTtrOf+WyedGiRe+99x63E/L6tb7ioizn60n1OZ3O5cuXnzp16vXXX588efKcOXO459vFixc3btw4YMCAFStWiJuo6jcYDIFAID8//4EHHvjwww937drF/YR5AyI5hwDEL2FGQyIJciYS7EmBUwAQgSAEIFbwer293QTQ59Bm3lOE+EBygCwoKHjsscco08zBgwdTU1PHjRv3y1/+kuYzIBFCsz+rPCr5LsS99HovROW6yTUhdRnpwNesWZOamjphwgQWQmUxjcsor5ObQ81m82233fbpp5+uWbNm2bJlUogEqqSZRddTlSyUZXnw4MFf+9rXPvroo9dee+2uu+5ijH322WelpaXz5s2jCSq41BQFOVVFNV+6dGnv3r3Hjh1TqUEA+ji9/kYCIBaAIASgRwnjNka2mg6NQeJLBjoJH4ZQ2s6Mp7SGApIgYYzl5+e/9NJL//Vf/zV58uTnn39eVIMqX1Mm3Jm9622ldfJkgsuooplej+x47777bmNj47333muxWPh50K1K6zIq2kgVRbFYLHPmzFm/fv2mTZtuuukmHk+oKizWo42cpGLp6ekrV67cvn37n//855aWlmHDht1///1ms5m1ika+U1XWGc6FCxfghgCA1DqVC/2bYHY/AKIDMYQA9DRSW/j6TsYQdmkbQfwR3c0Qam4uMaCOMeb1er/88suZM2du3Ljx8ccfv3btWlVVFWuNjuMSS3tXM01mzp5Ed7/iSuoaKkIKlnfffbe2tnbZsmUOh4Np3EpF6FRrH1uVX6jVal2+fPm1a9fee+891nrGdKvS3QVrmw9j0KBBFRUVhw4d6tevH6lBJgRqai2E4pGaTCaLxSLWDAAAADBYCAHoMXTDqMS+KZ9zrPP1AxAhuiYjlUYqLS194403JkyYsHTpUirwxRdf/Pa3vx06dOjXv/51KkOztGtj5KgqlVmsOw9IH1WTxMkDg8Egzf/OGHvzzTcbGhpuv/12mp6B6+FQIYhhhJwozCRJuv3221evXr1u3brFixdrNaHf7xclHP8rXgWXy/XKK6/4fL7/+3//L2Ns8+bN/9//9//dddddhYWFBoOBTjI57jK9uToURamtreX+on6/n2y8AAAAAAQhAD1Hu9nMeqwlABBcGol2MC5CmpqatmzZUldXt2rVqmHDhjHGAoGAwWCYOHFifn7+tm3bnnrqqRkzZkycONFoNIoKRAylUykT0SW1d+95ahup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hg0bfvnLX65Zs2bJkiUOh2NwcPDRRx8dGRn56Ec/2traWlNTQ8dTVCFtT58+/brrrtu7d++GDRtuv/32j370o01NTYyxoaGhJ554gjF29tlnt7a2kgkxHo97PB6v1zsyMmJy1BgMBumZkdpuOz5pkPrOjBua35HX66UfAj9mfCsFwJgjWQjVUzMAAJA7EITAKoj6AaSFRglchPj9/oULF86YMWPDhg133HGH0+mMx+Nut/uUU05ZsWIFncL1CR83UxBgRUXFeeedd9JJJ/3jH//46U9/Wl5eHo/Hg8Hg+vXrly1bxs+ljfLyctr42c9+VldXd+zYsRkzZkydOnX//v3t7e2BQCAUCtHBXq+XxGF2flMm3YZ9Ph+XBHQ3jh07ZrfbSVY5HA7RfGfgNaoZOMeO14SMsWPHju3bt2/KlClTpkxJJBLPPfecx+NpbW3lmlAsn4QoN5mmUqnS0tIFCxYsWLDghRdeePbZZx955JFAIBCNRltaWq655prS0lLxdClPaUlJyZIlS+bPn79jx44nnngiEokkEomKiooVK1a0traSjGdC8K3P50srCPk3ReugMJVPJtP5SRYkcFQzc09JSQk/YJyrBMA4oGchBACAPAJBCKyC9KozyAkB2PGrn1PGRbvdHggEzj777AcffPC3v/0tY+yRRx7hapAyzTidTjqeTE82m40vdldXV3fNNddceeWV999/f1lZ2d///neuBhOJBPfD7OnpoZ1z5swJBAK1tbW9vb2vvvrqokWLli1bduDAgbKyMrqc2+2WrIVZN5M3QdygYh0OR01NzZNPPqk+/sknn7zgggsM3Aj1ssjwnep/V65cmUgk7rzzzquuumrlypXxePypp54677zz5syZw6UvvyJfFZOgFR1I461du3ZoaOhjH/sYY+zyyy//7ne/y4+hHDNs9LbTfnKFpdykixcv3rx583XXXccY+/73v3/iiSfyc8VGkSeqsRclHexyufhqhJIMVps9C4WeLrVC3QAYOzR9v/HYAwDyCwQhAEVJKBRio0kvuVT717/+1d3d/b3vfe/OO+9kjL388ss/+MEPli9fvnbtWqfTSYfFYrFYLMYFIemTzs7OBx98MBqN3njjjX/961+Hhob+/ve///jHP161atWaNWtIn5BI2LRp07nnnnvttddefvnl3d3dZWVlV1555SOPPPLd73730ksvLdz9OI7t27cvXLhw/fr1Ka0lCtUYjK64IiK9Z7fbTz/99P7+/r/+9a8f//jHV69e7ff7n3zyyYsuumjWrFl2uz2RSHCTIP07ODhIJfD9L7/88ksvvbRkyRKqz/vvv3/zzTfPnTv3rLPOqqqqomNSqVQ8HqdvmTFG5rtIJPLUU08NDAwsW7aMzt2zZ8/f//53xti6desotwpPZWFehLvdbjISSjdENMqlrJFllB3/ZVGgLG0XvGIA5Bd61MVUSXjIQR7BtAIQgSAEoMigTpzUBWm83t7eTZs2dXZ2BgKBM888s7GxkY487bTTGGP79u2744475syZs2rVqrKystLS0mnTppEdjzF26NChDRs27Nu3r7m5+ZRTTpk7dy5jrKys7KKLLnr77bffeeedjRs3nnbaacuWLSPpGAqFpk2bdt5557HRpKbf/OY3H3nkkcsuu+xnP/vZI488Qh6nZtJ7mHwb8cNI54jrCtAlkslkIBBYtGjR0NDQ0aNHA4EAhdVpXijTVyCPPKRFJkgTnn/++U8++eQDDzzwiU984qSTTnK5XI8++ujll18+depUWgqSziVzX2NjI110aGjorbfeamtri0QiH/rQh1atWkWHLV68mDG2a9eue++9t6mp6YwzzqipqbHZbLNmzeKJXo4dO7Z169adO3f6/f4lS5YsXbqU9s+ePTuVSu3atev555+vq6tbvHhxIBCgOpM+NHmHQ6GQtDqFpoleUxOO56hCfWnxeUBSGTDxsFruXADAhASCEFgFxBBmBAlCj8czNDT0yiuvRCKRNWvWUDrKZDJJksztdp955plnnHHG008//c477/j9/tNPP91ms1VXV9MwOhQKPfnkk8PDw2vXrj355JMZY6lUitbHq6qqWrdu3amnnvrwww+/8sorNptt+fLljLGamprDhw8PDw+XlpZGIhGv17tixYra2lrKVipm+BhnuNcoUV9ff/fddzOd2DMzj5k6hpDkByXXueiii5544om77rrrC1/4wqJFi0Kh0D333PPpT3+6ublZPGvatGnV1dW0/e677z7//POnnHLK+eefT9lfYrFYMpn0eDyLFy9evHjxhg0b/vnPfzqdzrVr15aUlPh8Pu5x+sorr3R2di5btuz000+nPaTfXC7XnDlz5syZs3fv3s2bNyeTyZUrV1J6GBKEZjRSZWVlVVUVN05q3gHJTmiR36nT6VRXG4CJhCQIkVQGADAWQBACUGSQluvo6BgaGtq1a9eWLVvWrl1LUpCw2+20GgFhs9kuuOCCCy644KWXXvre9743depUWs7+0KFDR48eXbRo0Zo1a8SDxXPLyso+/elPK4ry85///MUXX2xubn722WcXLlxImTwcDgd5SPJV1K0G3SsxkM/kQEqanhDDAml85nA4PvKRjzz66KO/+93v/u3f/m3lypVbtmx55ZVXrrrqKvIUZYxVVVUlEol77713ZGRkeHi4ubn51ltvFa8iemkyxlauXLly5cpt27b95Cc/mTlzZkdHx+uvv07mu7q6ussuu8zg3NbW1tbW1oMHD77yyivNzc1z586NRCLMnI9ZTU3N1KlTKQltSlhjw6S1rYBGOY/HU1dXV6irAzAORKNRvm2c6gkAALIGDjbAilDiE6fTSUkjLPKUjvM7WH052uN2u8kQV1ZW9rGPfaylpWXBggW1tbXJZLK/vz8YDJIVi5aCcLlcfr+/tLR0eHi4vb1948aNDzzwAJVWXV19zTXX1NbWLly4MBaLDQwMDA4OkuGR7rndbq+urg4EAgMDA5s3b3755Zfff/99OvfQoUNTp06lq5hMBzr+2EZhWksLpj1XM3zONrqEPS/5ySef7Ovru/DCCysqKv7xj38cOXLk05/+NEnQtrY2WtqRMXbeeeedcsopU6dOLSsrC4VCg4ODkUiEr4dhs9lKSkoqKyvtdvuBAwdeeeUVbvB0Op3XXHPN1KlTFy5cSElc+/v77Xa7w+Gw2+1Op5O+4srKSsZYd3f3wYMHd+zY8cILL+zduzdtYx0Oh6Iop59++qJFi/7v//5Pnf6HV08U0tKe8fx5ill2XC7Xd77znR/96EewloAJCcUt/+AHP7jhhht49mAAABgLYCEE1sLKY7tx1qV6l+NumdXV1XPnzvX5fNu3b9++ffvIyAitsuDxeBRFGRkZIek4NDTkcDiqqqrmzp17wgknTJkypaOjgzG2fPnyqqqqXbt2Pfnkk+FwmDKL8EvbbLZYLEaFtLS0zJkzZ+3atVwQ0tCEpx615kiFizdxDzP3PfLQQVEKchVEGpiWhTjvvPOefPLJhx9++Nprrz333HOfeOKJRx999Nxzzw0EAjNnzqTSWlpazjjjDMbYq6++OjQ0FIlE/H4/zzHDGCMNH41G6+rqWlpazjrrrIaGhtdee83pdJ544olLliwJh8NPPfXUyMiI1+v1eDxut5umS0gQstEFGFpbW0888cSGhga73W5GEJKSf+2113bv3n3KKaewTDy3C2usoIuSA+3nPvc5Nipu055FQtqaTywATMid6/F4+vv7//nPf95www30kZj+lx9vkQlTUHRYdqwFCoJVbC8ASKFKNNo2YyGkA1pbW/fs2WP+crRqHP9rUHgikfB4PHv37v3Od77zxS9+cfXq1T09PZRiRLNYzXIMBqDcSY/+pcUGEokE3QRFURRFSSQSyijBYNDv90+fPr2+vr6/v//gwYOUIpLMqtx+xVevIsdORVEikYjT6ayvr58yZUokEunp6Wlvb08kEjwKi9eBZ9S02Wy0RsXIyEhDQ0NjY2NXV5fL5ZoyZYrH4ymisM+0iUb10Iyjo4/o6yAP26eeeqqjo+Paa691OBz33Xef3++/5JJLGGOdnZ3l5eU+n6+9vT0YDJKWo4UlpEeF6kZRhalUqra2lnw4+/v7BwYGUqmU2+2mpJq8AmQn5JlmuWWYrIXXX3/9r3/9a6fTKa5jJsGXyrj11lu/+MUvBgIB+kWoDYCSjTSje5hfqCbcYPL666/v3Lnzs5/9rHFLAShSPv/5z//mN7/hy5yOv1keTFSK4t0Nxg0IQmBFMhKENKi96KKLHn300TH1q3nhhRfWrl07RoUXF6K+KrqXilR5zUl36Uj1tmh+pEfu0UcfHRwcvPzyy30+3z333ONwOK6++urxa5UA/QoOHTo0ffp0t9stpQ8VIavaSSed9O6779Ie9T1JKwjHRyKqa8KOt1KanDn66U9/+rWvfa2zszMej1N0Fk24JJPJWCymKAppcppDSWqhV76x47S6X7Kmo7X1Md/Dj9EdTlsB8QDaFmvCsyXTDI747EWj0Xg8TssCxWKxI0eOLF68+Prrr6fZN/EnUMBMvwCACQkEIbAW/LXHBSE3YuhBg1qyEIZCoVAoJA4Z+V/JGMi3ucFBr3xFUUpLS3t6ev7xj39cf/31ZIUruMtZFiMAzRFz1qN5Kb5uAmNgXZRUyuOPPz4yMnLJJZd4vd5Dhw498cQTmzdvnjZt2syZM4PBYDgcjkQiekY2fj/5CDKRSJBJkFxD6QDu8UgLS9JS9Ywxl8vlcrnq6+t7e3vnz5/f0tJy5MiR5uZmY0FIVrW1a9c+//zzoVDI5/NJ7WJaX7RFvnQS5KFQqKSkxKSPqzpIEgDrw5NjGfwqGcyGIEOs0I0D64AYQmAtstM5jLGhoSHGGGVWZKODxdToOnV8LEj+eOK40NhflHwmo9GooigdHR2xWIxc/izSk2Y0AtC0jGU9hpBMNOqhyZjeouzKz+4szYl5/kRx/16Xy/WRj3zkqaee+stf/nLttdc2NTVdf/31jDGn07ly5crXXntt9erVtbW1XV1dbrdbXQ3K18pNjqT36HHlpnKXy0Vq0OVyOZ1Op9PpcDgontDv91N22TfffPO88877yle+0t/fb7KB27dvZ6MLmRhjqREn3ROebdWkhZAx1tfXRxoSg2lgZegRFScfuQ5MqVI6Sc8zAABkBAQhKHroLXjqqacyxioqKsbIdtfQ0LBkyZLxMQzqjU1FLaf2eBQP4+VIXp2SsNEzBKndk9J6h0ofjfXQJLvyc6yVnnMp2ajp/qxfv/6ll1566KGHtm/f/pGPfGTp0qXf//73t27d+rvf/e6Xv/wlY4yWMcylGsY8+uij5AlZWlpq8hQ6Uh2hJDZTdM60iJ2NqsR/kuZt3X6/n+yuY1g5AHJG3Tkzw57WCr9KUESgDwQiEITAKmi+7TT3aB4wMjLCGItEItztzfxF00KTr8FgkBbDkM7Ne68qFSgqMc2PxFZIToyahUjX0tR7vEzJ8zaHZhUrmiMwSS2TxqPts846a/fu3VVVVatXr6aUM83NzYsXL6bT86IGpW+cCd9vY2MjBQTmEkBloPos9QyIlTFfMQyDQLGg2b1DBAIA8g4EIbAKOZqYdu3axRijxJi0x4x/oJmrcL00PDysHoiPA2ZaoSenpZ2SeEgJ6+npXUvTFGl8RTV5GbXk8YanrY/YXs15eqk022gkKsW+zpkzZ/r06fv379+/fz8dz1dE4NkC84Xo/EwOpWlXX5BQzx1In1p20JnRnVTPqmTdLkhKkCnmJx/TTnNIU4SW/XkCAIoICEJgLfirjr/wqqqqwuEwBVPxJKJkvqAEG16vt6enR4yYUg/lM0JztJdKpWhBCM2PsrhK7qj9iNQizTjST73TwOypVuzFa5MxUx+DaXh127m0poSBbrfb4/H09vZ2dHQMDg4ODAz09fXxc42vrnmttBXmxwSDwfw6Nk+84WbuT+PEuyfAIkhRynrb6hhCAADIBQhCYC3UY7Xu7m7jU4LBIGOMlufmC6abvJyxU5xUDmWiNzhxPDE20KlHEnrxYJo7RXdBUcBoGsdya4fV0VPXepqQexRTrGBJSQktJU++o3pINljNwpkgDg2iiSgDDTOXJIYoeMrcjBgjk4immVT69q02rwGKEYMHSfyZmzwXzyQAIC9AEAKLQu+5q6666pxzzjn33HNffvnlm2666Ywzzrjxxhsjkcjvfve77du3X3XVVSeddNLBgwcfeuihdevWMWFoa9InMK2tRjwgHo/n2qr8Yaz02PG6zowPkt4BE17yGaP3kKhvi1rR2UYTkJJx2/j07OrGLyfupP1jukp7oYahBhZs82hOiOgdY7AHgCww/9RxG6BoD8TEBABgLIAgBNYlHA5fddVV5513HmPsiiuuOOuss+rq6uijm266iR/W0tLyoQ99iFLn00pNZNQyjvdTKyVNRO/TeDwuLmNYWKWUtv4GXo4GzpDAAMlHy/gZkBSg8SgwrbYXjzdppx3TUWPBH5tchsW5xxACMNaY9AHBMwyyBjMLQASCEFiXaDS6ffv2devWUe7Qxx9//IwzzmhtbU2lUh988MHRo0eXLl0aCARcLtfmzZuPHTu2YMECzaFe2vG0hN5An7L56xUyDuPvHC+heXp2UZGT5EWiNpzqedtqRvWIp6tzfur5KJoJImKG3xGCi0wySR5jUKRkNE/E8JMHAOQABCGwLk6nk1Iy0koS4grULpcrHo97PB7aKUb38WP0is1uFJhKpWituVwKyZqJfTnLIsk/aXxmJsyMHuC0alCzfL3DND8Sn8xcFpxQl2xB9KY2TA6I1bfO+k0GkxCDR9r87B4AAJgBghBYBbXWSqVSsViMHxCNRnkUn6IolOKf/lULQpazVU1tbBQvYYVBZO7qtFD6tnjRzLXD9G8gz0AzbneY/yhylIWTBzz8wILkxSsEAABMAkEIrIKmA4w4P0oiUNzmn4rikJ8rbaS9nOanYjmihZBZQE3lft20ASpAT/WZf67oydR8PnN0+jKelcBQMi14zoGVMfgJ49EFuYN3BBCBIASWRjTKiWYWSvHCPyK1Jp5opqfT9ACUShATfhTQZXSc0QxCm9hNzpRxi+fUIzW6/oTaAZLyi2LIKIHEoWDCgEcXAJBfIAiBdZFknuQyyo535lS7jKbFIEBLrzI8t+dkeB9PhjaOHRTLl1+XUfWDp2mQpDU5Jyq5//rwYAMAAAAiEITAuthsNnEtNdHpTnLgTCaTkiCUsozmxVrCx/d6Fxp/xkhmADVZ2Ev5Y5lIJPKyKqCZqEW+5uFEtRCacdxNi/jM4/kHAAAwyYEgBNZCGqiJ2fzFoEHGmCgIpWhDEW6iybQa6j1ipOJYCM4syNd1Re/ZiSok8oumryZTaTa73e50Op1OJ2XKZWN5e6lKtBRnRifqxd9anNxVnGZIMAAATAYwEQZEIAiBtRB7qEQiIQpCMamMZCHMzmU0UzQd9iZkLjgD61MB1a/VML4PqVTK4XC4XC632+10Orm3sxQKqxfCmjV+v582HA5HdiVY/GHO/Uapn+EJ+SsGAAAATAJBCKyLw+FIJBKSwZC2yVoo6kMDj74sXMLUbmncXMkPmHiDSLXBRL0+3sRrdaaYvwMulyscDjPGPB6P0/n/d7Z6bp/5uqXxeJyKytpJddIK/knbcADAJGQyv8eBGghCYF246iNbBxkM6SPRcsi0BKE4as99mT5NJmRnamY1jkk+bjaOYeOfut3uRCLxxBNPlJSUDAwMPPXUU2eccUZNTc3+/fu9Xq/49OoZXWm/3W5no3ZFgn4ODofDbrfb7Xb61+v1Op3OWCz2xhtvVFZWsuMz9GbdQAAAAABMeCAIgXUR8zSy41UfbYtrcGsuw51H6UKVUZc8AUbPmstvSPZAfvMnQHvzi8ENURTlzTffTCQSDofjhRdeeOyxx6qrqzs6OjweD91Mg7XjKRSQ1KDdbicdSH8Jl8tFAYoul8tmswUCAbfbHQ6Ht2/ffuaZZ7JJr9vNgAkOAAAAgEEQAisjZfWUFKAZG8s4MElGk3phV4AdPzvAt8lj83/+538++9nP9vX1nX766V/72tcYY8lk0m63mzffcdEiLoxpYPquqanZunUrYyzrxSeK5ZvNb1IZAAAAYNICQQisCxnlaADN9/BPRaugnoUwv0hpTicqkgJhWlFzk+E+pMV4SUBFUWw2W0tLC2OsoqJi6tSptJ8e5qwzvqgvxKGvrKqqKsffwuQxAk+elgIAAAAGQBACSyMaCaVVH6RsjdKJalWTNcYLWkxOJlvb9SSxnnstG02JtH///p6enr6+vi1btlx22WVMZzXLfFXSZrN1d3eLOyfbNwUAAACATIEgBNbF2AJjvHiapBjHum4TCb18PJM5htBkq9WHeb3eQCAQi8VKSkr4MWNxD8WAQ9oYB5s5AAAAACYAEITAukgumhl5bE5O3ZJ3JrMINIOUlUR6PikxTHIUMwXmbtOeSOmOAAAAADAOQBACq6MpAml4LcYQZlqCMZN5MI21B/OCKMzMu4lqBnAanGvw1SDOEwAAAABmgCAERYPaR1TMMiqNiXMcDZuXQBNj2G2QP0YEylDCIIYwo0LEs9LeXuMj+U6nE907AAAAANKDEQOwCjmKDbWRMHfXO4ORveZKA8WIuMYgE5oj3j1pW1Q+xd588+S3pZJ6FEvW26NXiN4BtO5F1nWzPnnMF4U5DgAAAJMZCEJgFdRjMmkt+EwHbXkZ1+rJAM3a5n658UdThxsnVpWWfyzShmeK1FK1bZBlIhrFe5hLldQX1ZT0k4Hc7yQAAEweJts7AhgDQQiKCa4P1XFZ0pBurHs6yWFVXYFiIQtlq277ZEDd0hx1V472VYM1V4z3my95UjE5Ww0AAAAwCEJQpFghpT4f0Be126TeEo4GYOgsoelSm9FZentMllC8j19hMZhRAgCAiQ1e5UAEghCAbJBMZJO2Y53Aw2jj75SbhXM0TeflySnqKQmLMGl/wgAAAAAEIZiY5O7OZ/6AyTyUnJxtN46xHM9qaLor52g/n7RxoQAAAMDkBIIQTExyHOel9SXDOHJSYTBBkN2TkJeHSsruk0U1jIud8EyelgIAAAAGQBACAEB6NFeKl1xG9QSG3W7X8yw1vwa9Ghi4AAAAAJA7EISgaJDSikpgZAzGAmk9QGPxpt6pt5ql5NIsOX+af5jHIqdRsYQj5nEdQgAAmGxg1AREIAjBRMAKSUfBREV6a0o5RQ1OtNvtaY9Rl2ZepcBlNEcmT0sBAAAAAyAIwcREXCs8xxLGqPyJhHnfRcvaZNSWPSmO1GazccFG23pr04tnMa0mqy2NYsmaFdBE72aSEM0ay35HErAQAgBA1mD0AkQgCMFEQD0CznGFMT5G1zt9kvSk5m+dsULOe1KWvKMOBTSos6gJuXLTXFfQbrdTAKGmSDNzW4y/gkyNimawyDcyDkyelgIAAAAGQBCCCYI0Jhb1SR7zQGp+OoGHlZk2TS9kLrvSCoumM6dxMhjpqUgkEgbli+F/op1QXY5BCQZ3W1EUg6sbVyy7E8cZWAgBACBriuuNDMYaCEIwMcm9p4OFkEg7aNYLscslf+b4o2lS1nQKZULMnrg8vej5KZasuXh9WrufVAcAAAAAgDECghAAYEQWwYEG1rNMHUoLgpishTa4NU90ENU0SounOBwOxpjD4XC5XAaXELWf+tImUd9DunoWmPRWLSD5mlywfksBAACAcQCCEACQHjORbGmzcWraytQnFhYxE4woZSVNqNkQCTpMUZR4PK6+BD/AWCTr3Zw8Oi3rfbmW+l7Ggkni+A0AAAAYA0EIgDbGK7xNYJOC3sjYjDIxjrKT9I9eEk4roKdm1TlF1S0iFEVRFMVutzscjrRpP9Wy0Iw+yZe5dTJrocncdgAAAICAIAQTmRzFhoEmnMDOZprBcuJHahdQyZzFZZLkYGmchYWN4+jcwCaml6lF/Ei8LWI8oWhCdLvdDocjEolEIhFJ72ne1UwxuFeZ3sZJu4wn1CAAAADAIAjBRCVfOi2thXACjynVbVTbzdjxBjSmUoNqLST9zV0a5R0pwYwU76f+xsVkobwJdru9vr7+wIEDjDFFUYwlaF6qzetG2U0n/JOZlyyjE/guAQAAACaBIARFA63nZvLgPI7zDC6ax9G81eA5MwlNgxg7fmiuFk7iX368ZF4bvyalQzO3p3HyGOl43sxgMPjMM8/s3Lnz9NNPLy8v7+vr8/l8Usma27m70TqdzkwXnNBsoJUZn183AABMYCz1/gUFB4IQTExylxzqkaLdbpdKy5elwvpo2gaZqu16tkEDmyGzjK6WxK06UFBdSbW4HRkZ2bNnTzgc/sc//vHaa6+dccYZjLFAIOB2u8Wz8lJVzcq73W6v15tj+VZ+pEVbdI5FWbmZAAAAwLgBQQgmJnkcLBrHEE4G1IFzTEcmaeZikWyDaU8cNwxS4DBV0CA/S7QN0l8+U/DOO+/cddddsVjsxz/+8U033XTdddc9+eSTq1ev9vv9fX19dHraBDNm0HRbpY2hoSG/388Yi8ViWZdvBX0+DkySZgIAgJpJNYwBaYEgBACkQTOGkAnGNKZlt5GkoGamGVaIGEJ1ThdNWag+UjyMS0HGWCwWe+CBB956663W1tb/9//+X1NTE2Ps/fff/+c///nYY4/deuutdNYNN9xQX19/9OhRMxZRuhZlKLXZbLSooMvlcjqdTqfT7Xa7XC766/F4vF6vz+cLBAKhUOjFF1/87//+b8aYx+PJy/0BAAAAwMQGghBMTHJ0Kks7IJ4kI2a1mdQ4hlDTnqaZb0YqX/PfMcXg0gZKlStGkoLRaPT111//4IMPysrKrr766pkzZ1ZUVPT19b311luMsQcffPDhhx/u7+9vampKJBKDg4N9fX12u11tJBTzfPJPuYp2Op2kCe12u9PppL8kCB0Oh8fjoX8DgUBVVdUnPvEJ8lPNxUI4SWaOjb0AAAAAgEkCBCGYIORXWqgzoKRSKXEcP0lGzByTMYRMa1lC9fHGZ401kj1Qcm1lKjuhiPgYxOPxhx9++O233161atXll19OO//yl7889dRTM2bM+OxnP9vS0nLOOeeMbWP0iUaj2Z2oZxTNQ51yQHNuIscyC94oAAAAwApAEAKgy2RTfZqIdj9N26BxKKDaNijZCfUk4nii1hiSJkylUslk0uFwkOvm/v37f/e73+3Zs+fiiy/+3//9X8ZYLBa7++6733vvvfPOO+9Pf/oTHZZMJhOJRO4NNBComk2IRqOBQIAWn8gCzWtZ57eQx5pIX3G+igUAAACKCwhCUJSone6kPWM9vCt4QpSxRp0/hmViJzR5bmFvnaYdWBIJiqKQkydpvJdffvnNN9+MRCIXX3zxKaecwhjr6OjYtGnTvn37qqqqvvrVr86ePZuOpKJcLteYhuRp3kBadmJCPpZjB24XAACASQsEIShKyHNPjOySxtxm3P+My5f22EYxc3C+sFR6j1xqYpA5ZvwbaOAOyg9IjeJ0OhljsVjs6NGj77zzzqFDh2bPnn3iiSfOnTuXMdbZ2fnAAw90dnauWbPm3HPPdblcbPRpFJ8WiA0AAAAAWBYIQlCUqJWS3pg7l7G4OrmIZrFjJ2kKqAaziMnU097G5xZQLKkrzL/xZDLJs78kEom77rrrjTfemDVr1pe//OXKykrG2JtvvvnTn/60qanpE5/4xIoVK+j0ZDIpppwxWHIjl0pq7hT35PeWWmdKgkFaAwAAAGMABCEoSrKz+5nHQAqqK5DFKH9CYibOzYJ3SUyRmkwmU6kUjxUcGhq67777Nm7cuG7duj/96U90/LPPPvvuu+/W19ffdtttLS0ttFNRFLUeS2uKVB9jnM/GoBB1apyskSIqrfaVjUVSGau1EQAAABhPIAgB0EWShVKW0XFwfUyrS62AZiX1nF1NHjamaGowcV1BxtjevXvfeeed/fv3z549+8Ybb2xubmaMbd++fdOmTYcPH16yZMmpp55aVVXFjl+AUZ1uR600zNhL9cx9Bjlv8ijeLJ5qZSySyliwmQAAMKZgIgyIQBCCYkKdS0ZCU6eNUa+np9ZyvJwFx6ZmrE960k4ac6vFRqa3ayy+ULEm4XD4vffee/XVVxVFWb58+XnnnccYGxoa+sMf/rBt27b58+d//vOfJ69R0b5kHDGYo1pTr+QhbY+Fj6g1zYNEdk+OXjkAAADAJAeCEBQNBqM3g1wvYz2izXv5NtXq7dJOm87C7sbehmqzmLryGWkt47yjmv/mZfw9FgYivvHCCy/cfffdJSUlX/7yl+fPn88YC4VCd9xxx86dO88999yvfvWrdBgPMuSn8ySlUuFq/WZmBiHtrVOXORa3xbLkq4bWbykAAAAwDkAQgolAIpGIxWJsdERukNMyC/iYOx6PJ5NJzavkHekS4r/ZZew048BpXEIWx6ctoYAmGuk2BoPB2267zeVy/fGPf6RkoR988MHzzz/f29u7aNGiT3/60+Qgqrmig+bzIH136m1pp4E4MdB7mgZYGL4AAAAAYB4IQjARcLvdFOVFjMXEv8fjmTp1KvkKjjNj0Zy8mE+zKCQvaTxyr7wkn2w2W2lpqdPpnDdvHqnBXbt2bdu2rb6+fuXKlTyJaCqVstvtUqBg1nXglxb1ZFpZqA5T1Cswl1oZ16SwjEVSGQAAmGxYtpMHBQGCEEwEvF7vwMAAG5sOTnQspG1KQVnUnWnes49Y/LoGJfDtz3/+8+++++5TTz21adOmQCBw5ZVXNjQ0pD0r92qYNOupQwfJc5WeRiKRSKSNszWJxcVSUf/6AAAAAEsBQQgmAkNDQ7fddpvf7y8pKRkYGHC73bSfrwvH/zUuhw+m+WjY4XCEw+Hm5uaDBw/+/Oc/b25uPumkkzo6OioqKkpKSkpKShhjiqLQcgV0is1mczgcdrs9kUgkk0la2ZyP4GknMxFTR+XQcD8YDA4PD/f393s8ntLSUp/PpyjK0NBQNBrlNisikUgw/ew75Pjq8/kqKioURYlEIiMjI2T40jyeqip9SjUvKytzu93xeDwcDkejUdrpdrv5PefWKrvdTuX4fL5AIJBMJiORSDAYdLlcttFV++LxOG3w1f8YY/F43OVy8YC9VCrlcDjKysq8Xm84HB4eHk4kEg6HI5VKOZ3ORCLBb6mk3MQbToVXVVXF4/HBwcFwOGy3251OZ0lJyeHDh++4445XX331m9/85po1aw4cOHDgwIHh4WGbzRYKhTweD50eCoUqKirKysoYY0NDQ5FIRMwokxabzRYOh+l7tNvtiqI0NTW1tLSIz4Oea65oTiTo8Thy5Eg4HG5tbXU6nclkMu1zPgEYu2RRAAAAwGQDghBMEDo7O3t6elwuV1dXl9frJRVBQ0ZpfKwebZPYkPbw7Wg0Wl1d3dvbOzQ0dPDgwQULFjgcjmg0um3btvb2drvdXl5e7na76Vput3t4eDgWi4XDYbfbTTUhRkZG/H4/SRqKeBRRj25TqVQ4HO7v7w8EAiUlJdOnT6+oqLDZbI899tjmzZvXrl07bdo0xlgkEjEoh8bNdCtIz5SUlOzbt++99947ePDgOeecc8IJJ/T29pofXlMhfr//6NGjv/nNb1atWrV+/fr+/n5+AEXZMWFxdpI9U6ZM2blz5+OPPz579uzFixeXlpYyxsLhMKkpLvwURaHK2O12l8sVj8dJ8qVSKa/XqyjK22+//dxzzy1evPiCCy7o7+8nHSgqJS7F6bp0Ot0Er9fLGGtvb9+wYUNjY+MFF1wQDAYjkYjH46H7/OlPf3r9+vWLFi1yu92Dg4M9PT2xWMzhcIg3R1GUkpKSP/3pT1u3bv23f/s3l8sVDAbpKurbpam0k8lkfX39e++99/TTT0+ZMqW0tPSaa6456aSTUjpZQ1OqVSj4LWKMXXbZZQ899NCKFSumT5/+wAMPqB/mTJk8QmvytBQAAAAwAIIQWBcDy5WE1+u9/PLLL774YpfLNX/+fLIQch2oHvZJEpHG0FLGTv5RLBarrq5uaWlZu3btRz7ykRUrVvT29v7zn/88evRoWVlZY2NjIpEIBoOKotjt9kgk4na76+rqkslkd3d3JBJxuVykx6ZNm+Z2u0OhUDgcFt386NKigYvT0NBQWVkZi8Xa29tra2vPOuusioqKY8eOvf3226effvoJJ5zgcDgikYhYmuZtpPLJkub3+48dO9bf3x+LxdauXbto0aKenh7Nu6RXmt1u93g8iqL87ne/mz179oc//OGjR4+KVjKxIfQNJhKJ+vr6bdu2/fOf/5w/f/6ZZ55ZX18fjUYpYM82uii80+n0+XyMsVgsRneSbKpk+HK73YqiHD58uLu7+6yzzjrrrLNCoZB4OdpwOBzxeNzr9dJZ0WiUxGEikXC5XHa7ff/+/du2bWtpaTnnnHN6e3vpi1MUxe12U4zo8PBwX1/f1KlTXS4Xv7e8Rclksq6u7t13392+ffv69evpEsYPqviAUYsaGhqqq6vffvvtk08++ZVXXtm1axcJQuM7z28v/7tjx46HHnroiiuuuP766//93//9e9/73ve+971AIGD+CwXM8v6xAACQd/COACIQhMAqpE1loXZcFBXIqlWryIGzsbFxLKrX1NS0atUqyi8yMjLy1ltvLVy4cP369dFo9NChQ0eOHInH47FYLJVKlZSUzJ8/v7KyMhKJ9PX1hUIhp9NJToZDQ0P79u3r6Ojw+Xzk26kXluZ0OmOx2Jw5c+bMmRMKhd588819+/bt2rVrxYoV69atGxgYOPXUU+nI8vLyTNsyY8aM9evXL1myZOnSpYyx+vr67O7JJz/5ybPPPtt8CQsXLrz00kuXLVvW0tLCGCPtp4nb7eZ+vyIul6u1tfXaa6+dPn06Y8zv92ue7vF4aMNut6uvMnfu3CuvvJK0X3V1tfr00tJSMmAacP7551dVVZHjaHYsXbr04x//+CmnnOL3+2tra8WP9PSJ9OuIRCIXXHDBPffc88lPfpIxtn379vr6+unTp3/mM58xKCQt4om5p6jJLzadNVeyQ2ppjqUBAAAARQoEIbAKuQzIksnk8PAwGzX95XdsRzaxVCpFl2CMvfjiix/5yEdWr17NGHvrrbfuvPPOqqqqpUuXjoyMJJPJDRs2bNiw4eqrr160aBHpFqKzs/PRRx89cOBAU1NTU1NTLBbT82glc9Y777zz2muvXXvttatWrZo6deru3bvvvffeFStWJBKJ3t7ekZERisfLNMkntWVkZKS3tzccDlM4YkaZSGgYbbfbu7q6gsEgY4xi+QxOodwnsVhscHCQ0v8QO3bsOHr0qMfjsdls5eXlzz///Fe+8hXG2C9/+cuLL76YzHe8BFLRvb29f/nLX04++eTzzz+/t7eXp1Hh5kG73R6NRu+4444//vGPJ5100g033DB//vze3l6KFaytrZ0+fXoymQyHw4yxTNvOGItGo16vl0I6qYSMYgj53YhGo93d3QMDA+QWm/Ysde6ZVCp15MiRP//5zyQII5HIsWPHcp8QkdpiNaWUx/pYrWkAAABAQYAgBFZHc7xOO7mUovwo7HhvukwRU3qoDXexWGxkZIQxFgwG+/v7ly1bxhj74IMP9u3b9/GPf7y1tbW6ujoWi9nt9nPOOeeDDz7417/+NTw8fNppp1Eh27Zte/zxx+fNm3fBBRdUVVW53W7yEdWsCQmMtWvX9vb2Hj58+L777rvqqqtmzpzZ29vLGEskEuFwOBKJBAIBdWiZWEhKZxX7aDQaDAZHRka4lVKzydJtkarHGOvr66PbLiW20WwRYywej0ciEcofwxh7/PHH29vb6+vrnU6n0+kcGhoi51Wfz3f06NFt27YNDQ0pikLhhalUKhAIjIyMbNu27ZlnnrHb7YsXL+7s7CQtGo/Hye3T6XQqihIKhQYHBxljDoejr6/v2LFjfX19FJO5e/fu3bt3t7W1rVy5Ul1z9bIN6naReKPwTjb6KBo0PyWsHS8uHRGLxYaHh4eHh0maqm+XWIJoP+c19Pl827dvnz179nnnnfcf//EfF1xwwe23375u3TpykTX4OgAAAAAAOBCEwNLwoTA73kdUwmaz8aUgNDM0qveLyTk0P2LHqyx+iZKSkrq6ung8/sc//vG99967/vrrTzjhBPH0mpqa1tbWt9566yc/+UlPT89FF120Z8+eW2+99fTTT7/kkkvMt53cCA8ePPiZz3ymsbGxqalp5syZvCZ6lWTHB5tpOuLabDbSYNwwZSws9cr3+/0G6Uw1vyzuC3r06NGnn376+uuvX7hwYTgcpgC/c84553/+53/oyJGRERJ4lD2FAiAVRfnQhz7k9/tXrVq1atWqUCjEr0K5TClCz+fzXXvttbwmwWDQZrNRgp8dO3Z8//vfb25uvuqqq6QKSxviv+q2uFwuA5dXUf6Jt1GELJYU1qhXjniuVBMqvLW19Tvf+c4Pf/jDZ599durUqddffz3durQurwZYykfUgPy6jAIAwKQCLhJABIIQWBdxBQK+R/NfvcyKeqN8pqVY1MY0vfFiIpF4+eWX+/r6/u3f/o3UYDweF09xuVwrVqz43Oc+t2/fPsbYxo0b169ff/nll7PRZSHEYb1UB7GGdrt9+vTpt99++4EDB1588UVaFo+8KDP1FNU0OnGNYdNf88AgAako1zVP5I3iJSSTSUokE4lEWltbFy5cyFTBhHRFyowi4XQ6GxoaPvShDxnHEIpQUfxRWbRoUTQaHRgYoGqoq8p01C87/lZQFhy99koV4Ofqmf7Mu4zybcrI6nQ6b7755ptvvpl/RIlV05YGAAAAAEBAEALrohZLfEzscDicTqeoYfgiB9IpmsUaWBoNjAbc5uPz+TZv3lxWVkYmO1KDtN4glR+NRj0eT21t7ebNmxlj7e3t5GJK/o2SGtT8V6xGS0vLjh073n///QsuuEBsrOaNMnD+VO/U06V6H0mF8yYbo2lv9Pv9U6dO7enpicfj9913X0NDA4VEiksOkj+nzWajJDFTpkzx+Xx9fX179uxpbm5mjLW1tQ0NDSUSib6+PkVRaLUJ/iXS92Kz2RRF8fl8GzZsuPLKKxcsWNDU1GRSTmt6EWsa/fQeG/V3Kj7DZPwkH2DGmElXT1F5Uh4jUoAkUMmmykanHoABajcBTJkDAACYhEAQAktj4JHIhNGbwdprmvJPUzXxMiXDlxqfzxeLxfx+fyQSKS8vt9vtNCIn44wYJEaee06nU4o0U5ukuJlOfWlKPyN6eBrLD81bZNI7TnNYrGcGlKSpntAV93CrL63x8MYbb/T395eUlEybNo1CIlOplNvtDgaDAwMDFBbIGBsaGhoeHh4YGAiHw21tba+88kp/f/8ZZ5yxb9++gYEBp9NJnqher9fj8ZCM9Pl8lKuGwgu9Xu8tt9zi8/lo8Y+SkpJ4PM4tkwaa3KRCMBbeegckEomRkZGampo5c+YwxkgPZ6RJ+CKN/BIUT+vz+UgzZ8FkE0W2HAKPAQAAgAkABCGwOuqIODbqsCeO4/Wko3qcJw3T1eN+yXeUb/PV5CjjJVehDodDUZSdO3emUqkFCxZwQchNNz6fj6c/VYuEgwcP9vX1zZo1q6ysTNNESeFzHo8nNbr2OkkdvTZqKhljJ1i9JmveQP6p5DNpBlIvdKLD4di/f/+ZZ565aNEik6dHIpHt27fv2LGjr6+voaFh6tSpTqfT5MIb99xzT3t7e2dnp6IotI6ium56dU5buNrKJM4v2LRS+1Cu0aqqqq6uLkpgy1fLyBFaUeP1119nWX1H1gfWPAAAACCPQBAC6yIalNjxaor2i1Itl6toakLjU2w2m9vt5nFou3fv/vnPf75w4UKbzTZnzhzypbSN5qHhJkQ18Xj897//fU9Pz6c+9alFixZpBsVR3hEyH1Fp8XhcM4DNwLInYV4/G5Svh/FhZEQlPe9yucRYPr1L8wK9Xu/ChQuvu+665cuXZ5o3ZWhoaGhoaMaMGbTcvKYB06AVaR8JpvMI2VRJXIlYLFZTUzNr1qyvfOUrzz77bEZt0YOa1tTUtHjx4ocffphN0Lwp+ZWCBj7kAAAAwGQAghBYC7Uzp6j6xEE2yUXxX4NyzFzX+AC1POAKjTHmdDrb2treffddt9vd1NRUUVEhFquuHoe8Iv/+979XV1dPmzaNC0K1OZRrJ7Is8bYbezmalIjcimXg7WlwunlIxlM5yWSyrKzM6/UyxkZGRr7zne/88pe/9Pl8FFBXVVXV19f3ox/96Fvf+hZjLBgM0vGkjXfu3HnyySczxqLR6NDQEGVkPXDgwCWXXLJ582ZaqYKC6CorKx977LHVq1enUiny7xWjT/Xuhvhv1mqBP4TSpIM4r+FwOF588UXG2N/+9rdoNJpIJMjxODW62CMbTTnD50eoCdyL2OVy0QblLKVpiMWLFy9ZsuT999/PruaTCqhBAAAAkxwIQmAtJDEjqT5JHIr/SiavjAZ5xgeLzn48dQ25g3K73+zZs2+88cann3560aJFpaWlXAlIhkG1DnE4HJ///OfdbvcJJ5xQV1endyQ1kKcJ0Qw11Iv002uUQeAlM2cS1MxtoxaTHNsoXBZWVFR4PJ6+vr4vfvGLDzzwAGOML8rX19fHGPv2t7/d0tJyxRVX3H333f/6179uuOGGOXPmbN269d5777355pvXrVt31113Pfjgg0888UQqlfroRz9KWXz4UoeMsf7+/jVr1uzbt8/r9VZUVITDYVouUtTbou+xyYiytEsvMkFF680IOByOoaGh0tLSuXPnXnrppcalZcq//vUv0s/5LRYAAAAAEwyMFYB1kUQLT5/IVFpxnJ2+3G43yVGyENLfNWvWfOc73znttNMcDgcpN54ThdsSuWVMURS+c/r06d/61rcuvfRSPcsVaQ9KocmEFDUEFxtcbvH9TFheQtKQkp7RLEEqn6lMnZqhm+rLaVopaaff71cUZePGjQ888MAVV1yRSqXuvvtuOqynp4eOvPLKKxljr7322oMPPnj06FGv11tVVbVx48a3336bMfbqq6/+85//jMfjv/jFLzZt2tTc3JxKpegUirp86qmnGGPf//73h4eHKdqQ+/Hy6mVh+TQjuY1FO9WQllJsb29njB07diwWi8XjcbIT8r+0YR6KSDx48KD65gMAAAAASMBCCKyCWj+QaBEH7uK2GAYmGuuk0ozJaLgsJpVRFEU0S9L+srIysdhUKkXBhGKCUKZlzyS3SbHONtXCgNxlVFK/Us4Scb+ZFhkfr94pXlqyMZq5mVLwp8PhoJvJGOvs7Gxubj5y5Ah9VFtb+/e//52N3pzq6mrGGC1OWFJSwv+Sd25lZaXdbvf7/alUasGCBR988AFjLBqN+nw+SuBZXl5OltvUaB4g6fYa2PEMGqL5EVe8xh68JKfJa5SKKikpcbvdTGW0ZBk+qFSIOmuOHpNWNObuAg0AAEXKpO35gSYQhMAqqKPUSFBpul+qbVlquxZLZznkSsBM9Wj4LkpQ22jOGLE08ercpJlMJvm1+FKEvb29GzdubG1tnTFjhtq10lieqf0VTXq98oMJAzlnRoeIEl19Fc1qSDKJFFFZWVkgEBgYGCA12NDQ0NXVlUqlrrjiCsbY2rVrGWNlZWXz5s3jC0WUl5c3NTUxxurr62fMmMEY27Fjx6JFi9ra2kgN0oUikciWLVsWLVq0b98+m83m8/m4Sjf2pdRri55DrJ4gN1DU/O55vV5xzUDNE9WTBZpfjVpJZkGxyCSMZgAAAIC8AEEIrIWk8UTVR2kz+EeihVAywTHVkuKiCFFvm6yYaLpMJBJp1ZTb7aaBfjQa5flgyN00Fou99tpr3/72ty+55JKbb75ZPcQXq+d0OhVFGRkZIcuPpmNnRm3h1jBNh0/uPpq2HE2/U00lyXeSAuSXoG9tYGBgZGSktLSUEsnMnz9/YGAgEomUlZUNDQ0dPnyYMTY0NJRKpWKxGBU4NDQ0MjLCGAsGg9FolDH21ltvNTU1NTc3Hzt2zGazLVmyZNeuXaFQiOxv7777biKR4Os6iFZK8eabb75097ITJzxtLFlB1YXY9JcD0asVE8S2yWrkEn9b1EyelgIAAAAGQBACCyFpCckEJ6og+kgcH6vXdTAzpmeZ6Cg+bg6Hw6WlpaFQiPSeoiiSZYbKjMfjVCu3201pTqgJiUTisccea2xsvP7668nMRd59kriicmiRQ4fDUVFRwUMTNdVg2vZKTrmaSWUyGiJLulQqXzOGkKsa7n9rs9nI+fMTn/jEE0888cwzz7z00kt0sNfr7enpIQOgx+MJh8MkiZ1Op8/n42bY7u5uxtg555zT39+/fPnyjRs3plKpTZs2USE1NTXxePyaa65xOp0jIyOkzG1aAagZWcbMJJVJWwLVgeeq5XLOQFSbIVNBWCwmwTEFNwEAMKnAjBgQQVIZYF0kQSgGCoqGJqYVQ0iMJjdJif+qt22GiMfwq69Zs6a3t/edd95ho4u/8SUBaCUAxtjmzZvJojV16tQ33niDMeZ2u5PJ5Ouvv97Y2NjY2PjRj350/fr1vP52AVIs1KjnnntOUZQVK1ZQ4k36VLMrF9ubEmAq/0ayr+b4PpBW8+M3ih2vBsVtHkNIC2nY7XaPx9PT08MYe+KJJ55++ulbbrmFDn733Xcp1cojjzzCGDt48ODBgwePHj3KGOvr6wuFQnv37mWMtbW1xePxoaGhZDL5l7/8hXyMzz77bN7Sr3zlK9u3b+/v7+eWQMrKI36zdJcyuiHSw5kF3Ejr9XrVS9LbtFYByf0r06tJ3sssIvhNBgCAyUOhu15gLSAIgXWhBff4v6LFg8b0fI9ehg/b8SPpXLpCElG0rSjK7NmzTz311MOHD+/atYvkDSV4jMfjZDA8ePCg3+//0Ic+xBhbvXr1rFmzNmzYwBh79dVX3W736aeffuzYsba2NkpJGo1G6fTkKFRIMpns7Oz817/+tXjx4hUrVvT39zNBzqlbKjaNb+t9JJlYs0DM+ypewiC4jo4hPeZyuYaGhhRFWbNmzfLly5955pn77rvvsssuq66u9vv94XD42LFjbDSRzA9+8INnnnlmzZo1jLHGxsabb77529/+NmPse9/73mOPPVZWVnbttdcyxp5++mnG2KxZszwez6JFixhjzz33HGPsuuuu8/v9ZNQl7a35DGjqZ02Mn6KUPuIx9NDaVNrSdryK1qxhWrDghEkwMAIAADDJgcsosBDSyIwsSPxfj8fDYwhTqZTT6SQHQsaY0+nkH2mS0knFmVHdREEYiUTOOuusurq6O++80+Px1NfXk1+ozWYjaReJRC699NITTjiBMRYIBNavX3/TTTfdeeedXq/3V7/6FWPs0Ucfffnll2+99daDBw+OjIzwZJu8wn6/v729PZlMrlmzpqWlZXh4OBKJsNHVzDWH+5L3o1qeiUiqUk+BSAdoKkB1Iex410e+QRflLR0eHg6FQjNnznznnXdmzJhx9dVXM8a8Xq/P51u9ejUZTu+55x7G2Lx58+bNm0dnNTY2fvvb36ZLz58/f/78+Yyx5cuXv/vuuxdccAHtnzp16pYtW2j7V7/61fLly9va2jo6OhoaGlKpFK1cL1ZVXW3N+yaKavGRy+LR4nfP4Om1jVo11V+K3hX5wVkLwmJxnsxdyBVLSwEAIO9gLgyIQBAC6xKPx2lZNrJEjYyMkCJijJFVbXh4mNYbCIfDPBBLQk8UGSgZvXJEQdjf39/Q0LBw4cKf/exnXV1dFC6oKAoZvrq7u2+//fZHH330y1/+MhmmHnvssWPHjl1yySWvvPLKD3/4w3Xr1v31r39tb29/9dVXr7rqqsrKypGREalKiqL4fL7a2lraPzQ0xIf4elpOanJKlStFFGYGVjLjW8FxuVx6bxSbatkMdnx2UzLqVlZWvvnmm7fffntzc/OiRYsOHDjg9/tLSkp8Pp/H40kkEpWVlW+//bbf73e73WVlZYODg1u2bHnqqafWrVv34Q9/+ODBg06ns7KyMhgMDg0Nbdu2LZlM2my2yspKj8cTCAQo8Ux7e/tzzz33+9///sILL1y5cqXL5QqFQuTWq26yyebbVAGuTEszpy3Bbre73W61eDP4fk1i/mUPWyIAAAAwmYEgBFZB00K1aNEil8sVjUY9Hs9pp51GToCMsXnz5tXV1VVXV8fjcbvdvmzZsq1bt4ql8UL0BtPq6CzjiokCoL+/X1wnoKGhQTqlvr6+paXl8OHDdIrf7z948ODUqVMvvPDCk08+ecOGDfX19Xfcccf999+/fPnyWbNmMcaqqqr0KpBMJu12e0lJCelh0g+SYOBCi4Sx1HxJFZMek1SlGQuqdJfUhkrj207OrtxIaLPZzjzzTEVRli1bVl9f//Wvf13zojQRQPlCGxsbKysr+/v7Fy5cOHv27MrKSopFVBSltLT0/PPP/+53v6sO7QuFQrFYrKmpae7cuYwxv98fDAalthtUW/MmSGGr5iWl+MjxoFMqSq8aGVWPA5kHAAAAADNAEAKrYFMtvVBeXh4OhxljlHKjt7eXf8RHxmTnIb3EGCOZwb3m1HovrWLRlFIEz/wxe/bs7u7uWCzGfVbVrFixYmhoiGuGNWvWUEqY+vr6devW+Xy+adOmTZs2japtDI3su7q6+OVEZ1ox0pIaTlGImmsVGlgIUybylEoH87Q36k81z6JTSI4mk8ktW7asXLnS4XBwX1BNAoFAIBCghekZY83NzU6nc8GCBU6nk8IL0+L3+/1+Py1hzxjbs2fP1KlTxe9O/K7Vz6Emdrtd9PM0Y9BTfx30JbpcLsll1MDuanAVM7MbE4MJ30AAAABgPIEgBBZCPc67+uqrKa4sLb/61a9OPPFEKaxL7bVo0nqjlgQ0fCehdcYZZ7z00ktPPvnkvHnzYrGYx+PhdjlKDFNSUjJ79uxUKrV3795QKFRSUjJ9+vSmpqYDBw4kEgluYiotLU0mk3v27KHgQ72gtVQqtW/fvm3btp166qls1JWUDlYUhZr8yCOPfOYzn7n++ut/8IMfUD0N2kttMSlCDKDUPuIePZXCFRetGEk7H3jggSlTppx55pldXV1UGSnUk6ckZYwlk0m6z4cPH3766ac7OjpWr17d19eXEpL9kL+oGIoplkbLTrz33nu7d+/mpmap7dI8ggF6iW2NTxefK24hdLvdov+qSdJWMuskqJNHbk2elgIAAAAGQBACqyBZ5PjQubS0NBKJ8CSNokskneLz+cLh8B//+McvfelLjLHf/va3Z5999qxZs9QSy3ygl2bkocfjicfjHo/H7Xafc845GzduPHDggNvtdjgcZKYjQZJMJgcGBsrLy20228DAgKIow8PDZWVlFAZJRrxYLOZyubxebzKZDAaDdCIbHcSTpOHbpD0+9rGPzZkzhzFGXrJUJTrmG9/4xsMPP3z++ec/+OCDBw4cuOeee3hlpGbydCnSuh3qxhrfGYLW29A7TDM1i91upyUZq6qqvv/970cike3bt5MepohEWrSDakgpW5PJJH3vJSUl0Wj00KFDHR0dR44cOXbsWH9/P7/nbDS00m63u1wuOosS/NAGYywajdbW1t52223Dw8NdXV1qX1/z0FUyPUv6OkhRu91uydSckbVWjxxXxZgkZBT2CQAAAExIIAiB1YnH4yQhRESZQWKATEw7duz44he/+PnPf/7nP/85CQwz+UXVyTA1jyftx0YF1bJly4aGhijhDV2FakLbsVjMZrNNmzbN6XSSLOEOk/wSJCPFNTPUkpUsiqRC6ZhEIsHTkNhstkgkctttt917771XX311f3//9OnTb7jhhltuuUVqhe34lQxId2nG0ZmHWwgNPHLV1+X/nn766YlEIhwOizk/1V67dInU6CINU6dOdTqdc+bMmTlzJgUWsuOfB82i2KjF2Ofz2e32d999t6+vL1NBKBZIQi6j0yW4y6iYPpd/lGPJbFQQIpGmMZCCAAAAAAQhsBbqxJhqNShBxp/58+dv3br1yJEjP/3pT4PB4Je//OWbbrqppqbGwNgijZWN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', + crossOrigin: null, + filters: [], + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 776.561, + top: 172.6152, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: 'f772494d-01de-4a9e-b21d-67faed778e60', + selectable: true, + hasControls: true, + userProperty: { + modelId: '987', + status: '0', + }, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(44,246,72,0.99)', + stroke: 'rgba(45,240,230,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: true, + hasControls: true, + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -16.7824, + top: -8.9323, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '正常', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: true, + hasControls: true, + }, + ], + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 384.136, + top: 152.891, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: '3fea9335-b7a3-4b01-bf7b-7d15b4ca6b62', + selectable: true, + hasControls: true, + userProperty: { + modelId: '123', + status: '0', + }, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(44,246,72,0.99)', + stroke: 'rgba(45,240,230,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: true, + hasControls: true, + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -15.8708, + top: -8.9298, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '正常', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: true, + hasControls: true, + }, + ], + }, + ], + clipPath: { + type: 'rect', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0, + top: 0, + width: 1200, + height: 900, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + selectable: true, + hasControls: true, + }, +}; + +// TODO mock数据替换成真实数据展示 +function fetchFabricModelsById(req: Request, res: Response) { + const { id = 1 } = req.query; + console.log(req, 'fetchFabricModelsById_req'); + const data: Record<string, any> = + id === 1 + ? { + ...currJson1, + } + : { ...currJson1 }; + const result = { + data, + success: true, + msg: '获取成功', + }; + + return res.json(result); +} + +function fetchFabricModelsById2(req: Request, res: Response) { + const { id = 1 } = req.query; + console.log(req, 'fetchFabricModelsById_req'); + const data: Record<string, any> = currJson2 + const result = { + data, + success: true, + msg: '获取成功', + }; + + return res.json(result); +} + +export default { + 'GET /api/v1/mock/fabricModels': fetchFabricModelsById, + 'GET /api/v1/mock/fabricModels2': fetchFabricModelsById2, +}; diff --git a/mock/listTableList.ts b/mock/listTableList.ts new file mode 100644 index 0000000..35ec3ce --- /dev/null +++ b/mock/listTableList.ts @@ -0,0 +1,176 @@ +import { Request, Response } from 'express'; +import moment from 'moment'; +import { parse } from 'url'; + +// mock tableListDataSource +const genList = (current: number, pageSize: number) => { + const tableListDataSource: API.RuleListItem[] = []; + + for (let i = 0; i < pageSize; i += 1) { + const index = (current - 1) * 10 + i; + tableListDataSource.push({ + key: index, + disabled: i % 6 === 0, + href: 'https://ant.design', + avatar: [ + 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + ][i % 2], + name: `TradeCode ${index}`, + owner: '曲丽丽', + desc: '这是一段描述', + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 4, + updatedAt: moment().format('YYYY-MM-DD'), + createdAt: moment().format('YYYY-MM-DD'), + progress: Math.ceil(Math.random() * 100), + }); + } + tableListDataSource.reverse(); + return tableListDataSource; +}; + +let tableListDataSource = genList(1, 100); + +function getRule(req: Request, res: Response, u: string) { + let realUrl = u; + if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') { + realUrl = req.url; + } + const { current = 1, pageSize = 10 } = req.query; + const params = parse(realUrl, true).query as unknown as API.PageParams & + API.RuleListItem & { + sorter: any; + filter: any; + }; + + let dataSource = [...tableListDataSource].slice( + ((current as number) - 1) * (pageSize as number), + (current as number) * (pageSize as number), + ); + if (params.sorter) { + const sorter = JSON.parse(params.sorter); + dataSource = dataSource.sort((prev, next) => { + let sortNumber = 0; + (Object.keys(sorter) as Array<keyof API.RuleListItem>).forEach((key) => { + let nextSort = next?.[key] as number; + let preSort = prev?.[key] as number; + if (sorter[key] === 'descend') { + if (preSort - nextSort > 0) { + sortNumber += -1; + } else { + sortNumber += 1; + } + return; + } + if (preSort - nextSort > 0) { + sortNumber += 1; + } else { + sortNumber += -1; + } + }); + return sortNumber; + }); + } + if (params.filter) { + const filter = JSON.parse(params.filter as any) as { + [key: string]: string[]; + }; + if (Object.keys(filter).length > 0) { + dataSource = dataSource.filter((item) => { + return (Object.keys(filter) as Array<keyof API.RuleListItem>).some((key) => { + if (!filter[key]) { + return true; + } + if (filter[key].includes(`${item[key]}`)) { + return true; + } + return false; + }); + }); + } + } + + if (params.name) { + dataSource = dataSource.filter((data) => data?.name?.includes(params.name || '')); + } + const result = { + data: dataSource, + total: tableListDataSource.length, + success: true, + pageSize, + current: parseInt(`${params.current}`, 10) || 1, + }; + + return res.json(result); +} + +function postRule(req: Request, res: Response, u: string, b: Request) { + let realUrl = u; + if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') { + realUrl = req.url; + } + + const body = (b && b.body) || req.body; + const { method, name, desc, key } = body; + + switch (method) { + /* eslint no-case-declarations:0 */ + case 'delete': + tableListDataSource = tableListDataSource.filter((item) => key.indexOf(item.key) === -1); + break; + case 'post': + (() => { + const i = Math.ceil(Math.random() * 10000); + const newRule: API.RuleListItem = { + key: tableListDataSource.length, + href: 'https://ant.design', + avatar: [ + 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + ][i % 2], + name, + owner: '曲丽丽', + desc, + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 2, + updatedAt: moment().format('YYYY-MM-DD'), + createdAt: moment().format('YYYY-MM-DD'), + progress: Math.ceil(Math.random() * 100), + }; + tableListDataSource.unshift(newRule); + return res.json(newRule); + })(); + return; + + case 'update': + (() => { + let newRule = {}; + tableListDataSource = tableListDataSource.map((item) => { + if (item.key === key) { + newRule = { ...item, desc, name }; + return { ...item, desc, name }; + } + return item; + }); + return res.json(newRule); + })(); + return; + default: + break; + } + + const result = { + list: tableListDataSource, + pagination: { + total: tableListDataSource.length, + }, + }; + + res.json(result); +} + +export default { + 'GET /api/rule': getRule, + 'POST /api/rule': postRule, +}; diff --git a/mock/modelDetail.ts b/mock/modelDetail.ts new file mode 100644 index 0000000..1a3a9e4 --- /dev/null +++ b/mock/modelDetail.ts @@ -0,0 +1,68 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-09 14:29:49 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-09 15:34:50 + * @FilePath: \general-ai-platform-web\mock\modelDetail.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { Request, Response } from 'express'; +import { parse } from 'url'; + +// mock tableListDataSource +const genData = (params: Record<string, any>): Record<string, any> => { + const data: Record<string, any> = { + categoryFkId: 2, + createTime: '2023-10-20T06:23:56.158622Z', + defaultVersionFkId: null, + id: params.id, + name: '离岗', + remark: '', + updateTime: '2023-10-20T06:23:56.158622Z', + }; + + // key: index, + // disabled: i % 6 === 0, + // href: 'https://ant.design', + // avatar: [ + // 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + // 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + // ][i % 2], + // name: `TradeCode ${index}`, + // owner: '曲丽丽', + // desc: '这是一段描述', + // callNo: Math.floor(Math.random() * 1000), + // status: Math.floor(Math.random() * 10) % 4, + // updatedAt: moment().format('YYYY-MM-DD'), + // createdAt: moment().format('YYYY-MM-DD'), + // progress: Math.ceil(Math.random() * 100), + + return data; +}; + +function getModelDetail(req: Request, res: Response, u: string, b: Request) { +// let realUrl = u; +// if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') { +// realUrl = req.url; +// } + +// const body = (b && b.body) || req.body; +// const { method, name, desc, key } = body; +// const params = parse(realUrl, true).query as unknown as API.PageParams & +// API.RuleListItem & { +// sorter: any; +// filter: any; +// }; +// console.log(req, 'getModelDetailApi'); + const result = { + data: genData({id: 2}), + success: true, + msg: '获取成功', + }; + + return res.json(result); +} + +export default { + 'GET /api/v1/mock/model/detail': getModelDetail, +}; diff --git a/mock/notices.ts b/mock/notices.ts new file mode 100644 index 0000000..616c921 --- /dev/null +++ b/mock/notices.ts @@ -0,0 +1,115 @@ +import { Request, Response } from 'express'; + +const getNotices = (req: Request, res: Response) => { + res.json({ + data: [ + { + id: '000000001', + avatar: + 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/MSbDR4FR2MUAAAAAAAAAAAAAFl94AQBr', + title: '你收到了 14 份新周报', + datetime: '2017-08-09', + type: 'notification', + }, + { + id: '000000002', + avatar: + 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/hX-PTavYIq4AAAAAAAAAAAAAFl94AQBr', + title: '你推荐的 曲妮妮 已通过第三轮面试', + datetime: '2017-08-08', + type: 'notification', + }, + { + id: '000000003', + avatar: + 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/jHX5R5l3QjQAAAAAAAAAAAAAFl94AQBr', + title: '这种模板可以区分多种通知类型', + datetime: '2017-08-07', + read: true, + type: 'notification', + }, + { + id: '000000004', + avatar: + 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/Wr4mQqx6jfwAAAAAAAAAAAAAFl94AQBr', + title: '左侧图标用于区分不同的类型', + datetime: '2017-08-07', + type: 'notification', + }, + { + id: '000000005', + avatar: + 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/Mzj_TbcWUj4AAAAAAAAAAAAAFl94AQBr', + title: '内容不要超过两行字,超出时自动截断', + datetime: '2017-08-07', + type: 'notification', + }, + { + id: '000000006', + avatar: + 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/eXLzRbPqQE4AAAAAAAAAAAAAFl94AQBr', + title: '曲丽丽 评论了你', + description: '描述信息描述信息描述信息', + datetime: '2017-08-07', + type: 'message', + clickClose: true, + }, + { + id: '000000007', + avatar: + 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/w5mRQY2AmEEAAAAAAAAAAAAAFl94AQBr', + title: '朱偏右 回复了你', + description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像', + datetime: '2017-08-07', + type: 'message', + clickClose: true, + }, + { + id: '000000008', + avatar: + 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/wPadR5M9918AAAAAAAAAAAAAFl94AQBr', + title: '标题', + description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像', + datetime: '2017-08-07', + type: 'message', + clickClose: true, + }, + { + id: '000000009', + title: '任务名称', + description: '任务需要在 2017-01-12 20:00 前启动', + extra: '未开始', + status: 'todo', + type: 'event', + }, + { + id: '000000010', + title: '第三方紧急代码变更', + description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', + extra: '马上到期', + status: 'urgent', + type: 'event', + }, + { + id: '000000011', + title: '信息安全考试', + description: '指派竹尔于 2017-01-09 前完成更新并发布', + extra: '已耗时 8 天', + status: 'doing', + type: 'event', + }, + { + id: '000000012', + title: 'ABCD 版本发布', + description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', + extra: '进行中', + status: 'processing', + type: 'event', + }, + ], + }); +}; + +export default { + 'GET /api/notices': getNotices, +}; diff --git a/mock/requestRecord.mock.js b/mock/requestRecord.mock.js new file mode 100644 index 0000000..6c59e19 --- /dev/null +++ b/mock/requestRecord.mock.js @@ -0,0 +1,324 @@ +module.exports = { + 'GET /api/currentUser': { + data: { + name: 'Serati Ma', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png', + userid: '00000001', + email: 'antdesign@alipay.com', + signature: '海纳百川,有容乃大', + title: '交互专家', + group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED', + tags: [ + { key: '0', label: '很有想法的' }, + { key: '1', label: '专注设计' }, + { key: '2', label: '辣~' }, + { key: '3', label: '大长腿' }, + { key: '4', label: '川妹子' }, + { key: '5', label: '海纳百川' }, + ], + notifyCount: 12, + unreadCount: 11, + country: 'China', + geographic: { + province: { label: '浙江省', key: '330000' }, + city: { label: '杭州市', key: '330100' }, + }, + address: '西湖区工专路 77 号', + phone: '0752-268888888', + }, + }, + 'GET /api/rule': { + data: [ + { + key: 99, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 99', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 503, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 81, + }, + { + key: 98, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 98', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 164, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 12, + }, + { + key: 97, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 97', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 174, + status: '1', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 81, + }, + { + key: 96, + disabled: true, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 96', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 914, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 7, + }, + { + key: 95, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 95', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 698, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 82, + }, + { + key: 94, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 94', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 488, + status: '1', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 14, + }, + { + key: 93, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 93', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 580, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 77, + }, + { + key: 92, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 92', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 244, + status: '3', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 58, + }, + { + key: 91, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 91', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 959, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 66, + }, + { + key: 90, + disabled: true, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 90', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 958, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 72, + }, + { + key: 89, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 89', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 301, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 2, + }, + { + key: 88, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 88', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 277, + status: '1', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 12, + }, + { + key: 87, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 87', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 810, + status: '1', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 82, + }, + { + key: 86, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 86', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 780, + status: '3', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 22, + }, + { + key: 85, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 85', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 705, + status: '3', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 12, + }, + { + key: 84, + disabled: true, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 84', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 203, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 79, + }, + { + key: 83, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 83', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 491, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 59, + }, + { + key: 82, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 82', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 73, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 100, + }, + { + key: 81, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 81', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 406, + status: '3', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 61, + }, + { + key: 80, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 80', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 112, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 20, + }, + ], + total: 100, + success: true, + pageSize: 20, + current: 1, + }, + 'POST /api/login/outLogin': { data: {}, success: true }, + 'POST /api/login/account': { + status: 'ok', + type: 'account', + currentAuthority: 'admin', + }, +}; diff --git a/mock/route.ts b/mock/route.ts new file mode 100644 index 0000000..418d10f --- /dev/null +++ b/mock/route.ts @@ -0,0 +1,5 @@ +export default { + '/api/auth_routes': { + '/form/advanced-form': { authority: ['admin', 'user'] }, + }, +}; diff --git a/mock/user.ts b/mock/user.ts new file mode 100644 index 0000000..75edd34 --- /dev/null +++ b/mock/user.ts @@ -0,0 +1,203 @@ +import { Request, Response } from 'express'; + +const waitTime = (time: number = 100) => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(true); + }, time); + }); +}; + +async function getFakeCaptcha(req: Request, res: Response) { + await waitTime(2000); + return res.json('captcha-xxx'); +} + +const { ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION } = process.env; + +/** + * 当前用户的权限,如果为空代表没登录 + * current user access, if is '', user need login + * 如果是 pro 的预览,默认是有权限的 + */ +let access = ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site' ? 'admin' : ''; + +const getAccess = () => { + return access; +}; + +// 代码中会兼容本地 service mock 以及部署站点的静态数据 +export default { + // 支持值为 Object 和 Array + 'GET /api/currentUser': (req: Request, res: Response) => { + if (!getAccess()) { + res.status(401).send({ + data: { + isLogin: false, + }, + errorCode: '401', + errorMessage: '请先登录!', + success: true, + }); + return; + } + res.send({ + success: true, + data: { + name: 'Serati Ma', + avatar: 'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png', + userid: '00000001', + email: 'antdesign@alipay.com', + signature: '海纳百川,有容乃大', + title: '交互专家', + group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED', + tags: [ + { + key: '0', + label: '很有想法的', + }, + { + key: '1', + label: '专注设计', + }, + { + key: '2', + label: '辣~', + }, + { + key: '3', + label: '大长腿', + }, + { + key: '4', + label: '川妹子', + }, + { + key: '5', + label: '海纳百川', + }, + ], + notifyCount: 12, + unreadCount: 11, + country: 'China', + access: getAccess(), + geographic: { + province: { + label: '浙江省', + key: '330000', + }, + city: { + label: '杭州市', + key: '330100', + }, + }, + address: '西湖区工专路 77 号', + phone: '0752-268888888', + }, + }); + }, + // GET POST 可省略 + 'GET /api/users': [ + { + key: '1', + name: 'John Brown', + age: 32, + address: 'New York No. 1 Lake Park', + }, + { + key: '2', + name: 'Jim Green', + age: 42, + address: 'London No. 1 Lake Park', + }, + { + key: '3', + name: 'Joe Black', + age: 32, + address: 'Sidney No. 1 Lake Park', + }, + ], + 'POST /api/login/account': async (req: Request, res: Response) => { + const { password, username, type } = req.body; + await waitTime(2000); + if (password === 'ant.design' && username === 'admin') { + res.send({ + status: 'ok', + type, + currentAuthority: 'admin', + }); + access = 'admin'; + return; + } + if (password === 'ant.design' && username === 'user') { + res.send({ + status: 'ok', + type, + currentAuthority: 'user', + }); + access = 'user'; + return; + } + if (type === 'mobile') { + res.send({ + status: 'ok', + type, + currentAuthority: 'admin', + }); + access = 'admin'; + return; + } + + res.send({ + status: 'error', + type, + currentAuthority: 'guest', + }); + access = 'guest'; + }, + 'POST /api/login/outLogin': (req: Request, res: Response) => { + access = ''; + res.send({ data: {}, success: true }); + }, + 'POST /api/register': (req: Request, res: Response) => { + res.send({ status: 'ok', currentAuthority: 'user', success: true }); + }, + 'GET /api/500': (req: Request, res: Response) => { + res.status(500).send({ + timestamp: 1513932555104, + status: 500, + error: 'error', + message: 'error', + path: '/base/category/list', + }); + }, + 'GET /api/404': (req: Request, res: Response) => { + res.status(404).send({ + timestamp: 1513932643431, + status: 404, + error: 'Not Found', + message: 'No message available', + path: '/base/category/list/2121212', + }); + }, + 'GET /api/403': (req: Request, res: Response) => { + res.status(403).send({ + timestamp: 1513932555104, + status: 403, + error: 'Forbidden', + message: 'Forbidden', + path: '/base/category/list', + }); + }, + 'GET /api/401': (req: Request, res: Response) => { + res.status(401).send({ + timestamp: 1513932555104, + status: 401, + error: 'Unauthorized', + message: 'Unauthorized', + path: '/base/category/list', + }); + }, + + 'GET /api/login/captcha': getFakeCaptcha, +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..3ac4c0a --- /dev/null +++ b/package.json @@ -0,0 +1,140 @@ +{ + "name": "ant-design-pro", + "version": "6.0.0", + "private": true, + "description": "An out-of-box UI solution for enterprise applications", + "scripts": { + "analyze": "cross-env ANALYZE=1 max build", + "build": "cross-env API_ENV=production max build", + "deploy": "npm run build && npm run gh-pages", + "dev": "npm run start:dev --port 8080", + "gh-pages": "gh-pages -d dist", + "i18n-remove": "pro i18n-remove --locale=zh-CN --write", + "postinstall": "max setup", + "jest": "jest", + "lint": "npm run lint:js && npm run lint:prettier && npm run tsc", + "lint-staged": "lint-staged", + "lint-staged:js": "eslint --ext .js,.jsx,.ts,.tsx ", + "lint:fix": "eslint --fix --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src ", + "lint:js": "eslint --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src", + "lint:prettier": "prettier -c --write \"**/**.{js,jsx,tsx,ts,less,md,json}\" --end-of-line auto", + "openapi": "max openapi", + "prepare": "husky install", + "prettier": "prettier -c --write \"**/**.{js,jsx,tsx,ts,less,md,json}\"", + "preview": "npm run build && max preview --port 8080", + "record": "cross-env NODE_ENV=development REACT_APP_ENV=test max record --scene=login", + "serve": "umi-serve", + "start": "cross-env UMI_ENV=dev max dev", + "start:dev": "cross-env REACT_APP_ENV=dev MOCK=none UMI_ENV=dev max dev", + "start:no-mock": "cross-env MOCK=none UMI_ENV=dev max dev", + "start:pre": "cross-env REACT_APP_ENV=pre UMI_ENV=dev max dev", + "start:test": "cross-env REACT_APP_ENV=test MOCK=none UMI_ENV=dev max dev", + "test": "jest", + "test:coverage": "npm run jest -- --coverage", + "test:update": "npm run jest -- -u", + "tsc": "tsc --noEmit" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx}": "npm run lint-staged:js", + "**/*.{js,jsx,tsx,ts,less,md,json}": [ + "prettier --write" + ] + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 10" + ], + "dependencies": { + "@ant-design/charts": "^1.4.2", + "@ant-design/icons": "^4.8.0", + "@ant-design/pro-components": "^2.6.29", + "@ant-design/use-emotion-css": "1.0.4", + "@umijs/route-utils": "^2.2.2", + "antd": "^5.5.1", + "classnames": "^2.3.2", + "echarts": "^5.4.3", + "echarts-for-react": "^3.0.2", + "fabric": "^5.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "omit.js": "^2.0.2", + "prop-types": "^15.8.1", + "querystring": "^0.2.1", + "rc-menu": "^9.9.2", + "rc-util": "^5.32.2", + "react": "^18.2.0", + "react-cookies": "^0.1.1", + "react-dev-inspector": "^1.8.4", + "react-dom": "^18.2.0", + "react-fabricjs": "^0.1.6", + "react-helmet-async": "^1.3.0", + "uuid": "^9.0.1", + "video.js": "^8.5.2", + "webrtc-streamer": "^0.8.3-4-g2d0afce" + }, + "devDependencies": { + "@ant-design/pro-cli": "^2.1.5", + "@testing-library/react": "^13.4.0", + "@types/classnames": "^2.3.1", + "@types/express": "^4.17.17", + "@types/fabric": "^5.3.6", + "@types/history": "^4.7.11", + "@types/jest": "^29.5.1", + "@types/js-yaml": "^4.0.8", + "@types/lodash": "^4.14.195", + "@types/react": "^18.2.7", + "@types/react-dom": "^18.2.4", + "@types/react-helmet": "^6.1.6", + "@umijs/fabric": "^2.14.1", + "@umijs/lint": "^4.0.69", + "@umijs/max": "^4.0.69", + "cross-env": "^7.0.3", + "eslint": "^8.41.0", + "express": "^4.18.2", + "gh-pages": "^3.2.3", + "husky": "^7.0.4", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "lint-staged": "^10.5.4", + "mockjs": "^1.1.0", + "prettier": "^2.8.8", + "swagger-ui-dist": "^4.19.0", + "ts-node": "^10.9.1", + "typescript": "^5.0.0", + "umi-presets-pro": "^2.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "create-umi": { + "ignoreScript": [ + "docker*", + "functions*", + "site", + "generateMock" + ], + "ignoreDependencies": [ + "netlify*", + "serverless" + ], + "ignore": [ + ".dockerignore", + ".git", + ".github", + ".gitpod.yml", + "CODE_OF_CONDUCT.md", + "Dockerfile", + "Dockerfile.*", + "lambda", + "LICENSE", + "netlify.toml", + "README.*.md", + "azure-pipelines.yml", + "docker", + "CNAME", + "create-umi" + ] + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..955c880 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,17463 @@ +lockfileVersion: '6.0' + +dependencies: + '@ant-design/icons': + specifier: ^4.8.0 + version: 4.8.0(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-components': + specifier: ^2.4.16 + version: 2.4.16(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/use-emotion-css': + specifier: 1.0.4 + version: 1.0.4(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@umijs/route-utils': + specifier: ^2.2.2 + version: 2.2.2 + antd: + specifier: ^5.5.1 + version: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + classnames: + specifier: ^2.3.2 + version: 2.3.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + moment: + specifier: ^2.29.4 + version: 2.29.4 + omit.js: + specifier: ^2.0.2 + version: 2.0.2 + querystring: + specifier: ^0.2.1 + version: 0.2.1 + rc-menu: + specifier: ^9.9.2 + version: 9.9.2(react-dom@18.2.0)(react@18.2.0) + rc-util: + specifier: ^5.32.2 + version: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dev-inspector: + specifier: ^1.8.4 + version: 1.8.4(eslint@8.41.0)(react@18.2.0)(typescript@5.0.2)(webpack@5.84.1) + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-helmet-async: + specifier: ^1.3.0 + version: 1.3.0(react-dom@18.2.0)(react@18.2.0) + +devDependencies: + '@ant-design/pro-cli': + specifier: ^2.1.5 + version: 2.1.5 + '@testing-library/react': + specifier: ^13.4.0 + version: 13.4.0(react-dom@18.2.0)(react@18.2.0) + '@types/classnames': + specifier: ^2.3.1 + version: 2.3.1 + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + '@types/history': + specifier: ^4.7.11 + version: 4.7.11 + '@types/jest': + specifier: ^29.5.1 + version: 29.5.1 + '@types/lodash': + specifier: ^4.14.195 + version: 4.14.195 + '@types/react': + specifier: ^18.2.7 + version: 18.2.7 + '@types/react-dom': + specifier: ^18.2.4 + version: 18.2.4 + '@types/react-helmet': + specifier: ^6.1.6 + version: 6.1.6 + '@umijs/fabric': + specifier: ^2.14.1 + version: 2.14.1 + '@umijs/lint': + specifier: ^4.0.69 + version: 4.0.69(eslint@8.41.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2) + '@umijs/max': + specifier: ^4.0.69 + version: 4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react-dom@18.2.4)(@types/react@18.2.7)(dva@2.5.0-beta.2)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.41.0 + version: 8.41.0 + express: + specifier: ^4.18.2 + version: 4.18.2 + gh-pages: + specifier: ^3.2.3 + version: 3.2.3 + husky: + specifier: ^7.0.4 + version: 7.0.4 + jest: + specifier: ^29.5.0 + version: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1) + jest-environment-jsdom: + specifier: ^29.5.0 + version: 29.5.0 + lint-staged: + specifier: ^10.5.4 + version: 10.5.4 + mockjs: + specifier: ^1.1.0 + version: 1.1.0 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + swagger-ui-dist: + specifier: ^4.19.0 + version: 4.19.0 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.2.5)(typescript@5.0.2) + typescript: + specifier: ^5.0.0 + version: 5.0.2 + umi-presets-pro: + specifier: ^2.0.3 + version: 2.0.3(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)(umi@4.0.69) + +packages: + + /@ahooksjs/use-request@2.8.15(react@18.2.0): + resolution: {integrity: sha512-xhVaM4fyIiAMdVFuuU5i3CFUdFa/IblF+fvITVMFaUEO3w/V5tVCAF6WIA3T03n1/RPuzRkA7Ao1PFtSGtGelw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + lodash.debounce: 4.0.8 + lodash.throttle: 4.1.1 + react: 18.2.0 + dev: true + + /@alita/babel-transform-jsx-class@0.0.2: + resolution: {integrity: sha512-TW4KukvBsmMcebUWfquhFQ36Uo+wFrRB4NiimXhtQ+QXrYBmHoVm5GgVojQ3AJKIAjTVicYsz4lEo/MPN+ZgNw==} + dev: true + + /@alita/inspx@0.0.2(react@18.2.0): + resolution: {integrity: sha512-NylAZjHY1jIyO5a58WaPSzZbR39idg8tGyUl4YLBiSmU0lvkl/K9C77TexPQMUHhzauelmmhBht2FRoA77U0tQ==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16' + dependencies: + '@radix-ui/popper': 0.0.10 + react: 18.2.0 + dev: true + + /@alita/plugins@3.2.22(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6u2G48dsBj5s+BM2KhtyVDUqUhXkrOpSaqccSfA+HSJO9B4QeyjCpFZFNSL1pXBEd/M+f+e9bxQvipsuAmR+yg==} + dependencies: + '@alita/babel-transform-jsx-class': 0.0.2 + '@alita/inspx': 0.0.2(react@18.2.0) + '@alita/request': 3.1.1 + '@alita/types': 3.1.1 + '@umijs/bundler-utils': 4.0.59 + '@umijs/plugins': 4.0.59(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@umijs/utils': 4.0.59 + ahooks: 3.7.7(react@18.2.0) + antd-mobile-alita: 2.3.4(react-dom@18.2.0)(react@18.2.0) + antd-mobile-icons: 0.2.2 + babel-plugin-import: 1.13.6 + babel-runtime-jsx-plus: 0.1.5 + classnames: 2.3.2 + dva-core: 2.0.4(redux@3.7.2) + dva-immer: 1.0.1(dva@2.5.0-beta.2) + dva-loading: 3.0.24(dva-core@2.0.4) + history: 5.3.0 + react-redux: 7.2.9(react-dom@18.2.0)(react@18.2.0) + react-router-dom: 6.11.2(react-dom@18.2.0)(react@18.2.0) + redux: 4.2.1 + semver: 7.3.5 + transitivePeerDependencies: + - '@types/lodash.merge' + - '@types/react' + - '@types/react-dom' + - antd + - babel-plugin-styled-components + - debug + - dva + - prop-types + - rc-field-form + - react + - react-dom + - react-native + - shallowequal + - stylis + - supports-color + dev: true + + /@alita/request@3.1.1: + resolution: {integrity: sha512-edz76AKAanJo7u2V4seomF4chlHi4rfl9T1hTNbothmd786lEgdDGOnItqilc/twTiLZjECJS43Un4/pttalyQ==} + dependencies: + umi-request: 1.4.0 + dev: true + + /@alita/types@3.1.1: + resolution: {integrity: sha512-yxejISI2ZwHI1iQCTTXz2axNji3i4Wgfvg3u0c7HtjGpG3JKql0iTVGVHDXtEhIs2CKLb4+TBWcRhEDxW+mECg==} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + + /@ant-design/antd-theme-variable@1.0.0: + resolution: {integrity: sha512-0vr5GCwM7xlAl6NxG1lPbABO+SYioNJL3HVy2FA8wTlsIMoZvQwcwsxTw6eLQCiN9V2UQ8kBtfz8DW8utVVE5w==} + dev: true + + /@ant-design/colors@6.0.0: + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + dependencies: + '@ctrl/tinycolor': 3.6.0 + + /@ant-design/colors@7.0.0: + resolution: {integrity: sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==} + dependencies: + '@ctrl/tinycolor': 3.6.0 + + /@ant-design/cssinjs@1.9.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CZt1vCMs/sY7RoacYuIkZwQmb8Bhp99ReNNE9Y8lnUzik8fmCdKAQA7ecvVOFwmNFdcBHga7ye/XIRrsbkiqWw==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.22.3 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + classnames: 2.3.2 + csstype: 3.1.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + stylis: 4.2.0 + + /@ant-design/icons-svg@4.2.1: + resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==} + + /@ant-design/icons@4.8.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.2.1 + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@ant-design/icons@5.1.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vajYXDkzRQevAJwXgbFzVJ3970nKYqGjX+0+L5/FJcPbItSco32U1k06K9wC0OochLfL/z0U13JN1BsniqMYsA==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@ant-design/colors': 7.0.0 + '@ant-design/icons-svg': 4.2.1 + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@ant-design/moment-webpack-plugin@0.0.3: + resolution: {integrity: sha512-MLm1FUpg02fP615ShQnCUN9la2E4RylDxKyolkGqAWTIHO4HyGM0A5x71AMALEyP/bC+UEEWBGSQ+D4/8hQ+ww==} + dev: true + + /@ant-design/pro-card@2.4.9(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vWISREOB0eZgFQlTxc3ulmGBfG9Ivymw6eHpVL/BWGVlgviIwtXA0iHi3jlQrlC020MapvXJ/h7ZfK7onVDGhQ==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + omit.js: 2.0.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: true + + /@ant-design/pro-card@2.4.9(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vWISREOB0eZgFQlTxc3ulmGBfG9Ivymw6eHpVL/BWGVlgviIwtXA0iHi3jlQrlC020MapvXJ/h7ZfK7onVDGhQ==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + omit.js: 2.0.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + + /@ant-design/pro-cli@2.1.5: + resolution: {integrity: sha512-nFdVRlKRFh6UcjKmkEnpImCz3mOCMz1u6lo9IIVo2lwlbNInc5EZxXfJJm4tAXUSrOfsiIl/Iwc2bsQ5xJBLeA==} + hasBin: true + dependencies: + '@babel/core': 7.22.1 + '@babel/generator': 7.22.3 + '@babel/parser': 7.22.3 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + '@umijs/fabric': 2.14.1 + babel-types: 6.26.0 + blink-diff: 1.0.13 + carlo: 0.9.46 + chalk: 4.1.2 + cross-port-killer: 1.4.0 + eslint: 7.32.0 + execa: 5.1.1 + getnpmregistry: 1.0.1 + glob: 7.2.3 + import-fresh: 3.3.0 + intl-messageformat: 9.13.0 + lodash.groupby: 4.6.0 + node-fetch: 2.6.11 + node-import-ts: 1.0.6 + ora: 5.4.1 + pngjs-image: 0.11.7 + prettier: 2.8.8 + rimraf: 3.0.2 + semver: 7.5.1 + typescript: 4.9.5 + umi-utils: 1.7.3 + yargs-parser: 20.2.9 + transitivePeerDependencies: + - bufferutil + - encoding + - postcss-jsx + - postcss-markdown + - supports-color + - utf-8-validate + dev: true + + /@ant-design/pro-components@2.4.16(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BfB4cZV2kRDYLFjWfHuwxjl2YbDYFeX1NC0kHjs4DnY14+nMPak6sTkLC/xJhTb7MlHFMm+QsBeYnr+gcJUtog==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/pro-card': 2.4.9(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-descriptions': 2.2.13(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.12.1(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-layout': 7.13.5(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-list': 2.3.14(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-skeleton': 2.1.3(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-table': 3.6.11(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/lodash.merge' + - prop-types + - rc-field-form + dev: true + + /@ant-design/pro-components@2.4.16(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BfB4cZV2kRDYLFjWfHuwxjl2YbDYFeX1NC0kHjs4DnY14+nMPak6sTkLC/xJhTb7MlHFMm+QsBeYnr+gcJUtog==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/pro-card': 2.4.9(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-descriptions': 2.2.13(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.12.1(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-layout': 7.13.5(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-list': 2.3.14(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-skeleton': 2.1.3(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-table': 3.6.11(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/lodash.merge' + - prop-types + - rc-field-form + + /@ant-design/pro-descriptions@2.2.13(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qBSJ60dNe2MKOgA4CkJYuSIepVsqvhicWgXdlALlz/m+RrI54RJl0r5rzw9KjmKjv03fnWOn31B8p8gEk+/5Bw==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + dependencies: + '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.12.1(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-skeleton': 2.1.3(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 0.2.6(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + use-json-comparison: 1.0.6(react@18.2.0) + transitivePeerDependencies: + - '@types/lodash.merge' + - rc-field-form + - react-dom + dev: true + + /@ant-design/pro-descriptions@2.2.13(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qBSJ60dNe2MKOgA4CkJYuSIepVsqvhicWgXdlALlz/m+RrI54RJl0r5rzw9KjmKjv03fnWOn31B8p8gEk+/5Bw==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + dependencies: + '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.12.1(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-skeleton': 2.1.3(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 0.2.6(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + use-json-comparison: 1.0.6(react@18.2.0) + transitivePeerDependencies: + - '@types/lodash.merge' + - rc-field-form + - react-dom + + /@ant-design/pro-field@2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Itie+CqjiS9AfcDhTFdFOMXFAcwBa+w+On6KAcZiYfs9swE54ydAmkTqoJNADNbRihQ3p3575KVeBo/XgYexUA==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0) + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + lodash.tonumber: 4.0.3 + omit.js: 2.0.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + swr: 2.1.5(react@18.2.0) + transitivePeerDependencies: + - react-dom + dev: true + + /@ant-design/pro-field@2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Itie+CqjiS9AfcDhTFdFOMXFAcwBa+w+On6KAcZiYfs9swE54ydAmkTqoJNADNbRihQ3p3575KVeBo/XgYexUA==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0) + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + lodash.tonumber: 4.0.3 + omit.js: 2.0.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + swr: 2.1.5(react@18.2.0) + transitivePeerDependencies: + - react-dom + + /@ant-design/pro-form@2.12.1(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MgIsJEf136jHPWZr341ukSrhW5geWp/LSazEafS/tT/AxPoZ4YCAd6c/ca/H99LmDBkO0NDFvRcLmndIrkR79Q==} + peerDependencies: + '@types/lodash.merge': ^4.6.7 + antd: '>=4.23.0' + rc-field-form: ^1.22.0 + react: '>=17.0.0' + react-dom: '>=17.0.0' + peerDependenciesMeta: + '@types/lodash.merge': + optional: true + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0) + '@umijs/use-params': 1.0.9(react@18.2.0) + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + lodash.merge: 4.6.2 + omit.js: 2.0.2 + rc-field-form: 1.32.0(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-json-comparison: 1.0.6(react@18.2.0) + use-media-antd-query: 1.1.0(react@18.2.0) + dev: true + + /@ant-design/pro-form@2.12.1(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MgIsJEf136jHPWZr341ukSrhW5geWp/LSazEafS/tT/AxPoZ4YCAd6c/ca/H99LmDBkO0NDFvRcLmndIrkR79Q==} + peerDependencies: + '@types/lodash.merge': ^4.6.7 + antd: '>=4.23.0' + rc-field-form: ^1.22.0 + react: '>=17.0.0' + react-dom: '>=17.0.0' + peerDependenciesMeta: + '@types/lodash.merge': + optional: true + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0) + '@umijs/use-params': 1.0.9(react@18.2.0) + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + lodash.merge: 4.6.2 + omit.js: 2.0.2 + rc-field-form: 1.32.0(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-json-comparison: 1.0.6(react@18.2.0) + use-media-antd-query: 1.1.0(react@18.2.0) + + /@ant-design/pro-layout@7.13.5(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-bSjCMwRn7eQJkzl7SiStL6+OXWJuAKyA06/iN0nJN9YR4ntryMGnBWYgYTxqaOisl5vhqPnJMmYRsEBv+dnzsQ==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + '@umijs/route-utils': 4.0.1 + '@umijs/use-params': 1.0.9(react@18.2.0) + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + lodash.merge: 4.6.2 + omit.js: 2.0.2 + path-to-regexp: 2.4.0 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + swr: 2.1.5(react@18.2.0) + use-json-comparison: 1.0.6(react@18.2.0) + use-media-antd-query: 1.1.0(react@18.2.0) + warning: 4.0.3 + dev: true + + /@ant-design/pro-layout@7.13.5(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-bSjCMwRn7eQJkzl7SiStL6+OXWJuAKyA06/iN0nJN9YR4ntryMGnBWYgYTxqaOisl5vhqPnJMmYRsEBv+dnzsQ==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + '@umijs/route-utils': 4.0.1 + '@umijs/use-params': 1.0.9(react@18.2.0) + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + lodash.merge: 4.6.2 + omit.js: 2.0.2 + path-to-regexp: 2.4.0 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + swr: 2.1.5(react@18.2.0) + use-json-comparison: 1.0.6(react@18.2.0) + use-media-antd-query: 1.1.0(react@18.2.0) + warning: 4.0.3 + + /@ant-design/pro-list@2.3.14(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-V5PeWCUzIiyefPeNMCE96QVY+rY/yY4rXmtQe+3rugM3CO0rdejLq/IBpkntozGWqS4a9/tXzlwtj1UzgWrZ9Q==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-card': 2.4.9(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-table': 3.6.11(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 4.21.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-media-antd-query: 1.1.0(react@18.2.0) + transitivePeerDependencies: + - '@types/lodash.merge' + - prop-types + - rc-field-form + dev: true + + /@ant-design/pro-list@2.3.14(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-V5PeWCUzIiyefPeNMCE96QVY+rY/yY4rXmtQe+3rugM3CO0rdejLq/IBpkntozGWqS4a9/tXzlwtj1UzgWrZ9Q==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-card': 2.4.9(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-table': 3.6.11(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 4.21.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-media-antd-query: 1.1.0(react@18.2.0) + transitivePeerDependencies: + - '@types/lodash.merge' + - prop-types + - rc-field-form + + /@ant-design/pro-provider@2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ocUVpXLdzkCL23R1b6No5oBzD/6izrE27VRtxEwaGFDIkH83BfaOxyP76QjMpKWXc0UKwuOW4mfWdBFuRstj7Q==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/cssinjs': 1.9.1(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + '@ctrl/tinycolor': 3.6.0 + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + swr: 2.1.5(react@18.2.0) + dev: true + + /@ant-design/pro-provider@2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ocUVpXLdzkCL23R1b6No5oBzD/6izrE27VRtxEwaGFDIkH83BfaOxyP76QjMpKWXc0UKwuOW4mfWdBFuRstj7Q==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/cssinjs': 1.9.1(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + '@ctrl/tinycolor': 3.6.0 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + swr: 2.1.5(react@18.2.0) + + /@ant-design/pro-skeleton@2.1.3(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Vp1PW9E6DVBa9Udf6la/8Kgk+rVTjTybZLk4y0CyNLa7hx+tqGiNSgQtk6Ps8ssyurY78OvTc2Cs8GHMFIVY3Q==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@babel/runtime': 7.22.3 + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-media-antd-query: 1.1.0(react@18.2.0) + dev: true + + /@ant-design/pro-skeleton@2.1.3(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Vp1PW9E6DVBa9Udf6la/8Kgk+rVTjTybZLk4y0CyNLa7hx+tqGiNSgQtk6Ps8ssyurY78OvTc2Cs8GHMFIVY3Q==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@babel/runtime': 7.22.3 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-media-antd-query: 1.1.0(react@18.2.0) + + /@ant-design/pro-table@3.6.11(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9FDMkggZ1xgTsK5KawECnD1XxJB7CmLcCu2fNNdK0XH+YIO1LapXVOuspRlGKrdJi4BXB73t2HG+KLGIAayfyg==} + peerDependencies: + antd: '>=4.23.0' + rc-field-form: ^1.22.0 + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-card': 2.4.9(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.12.1(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + omit.js: 2.0.2 + rc-field-form: 1.32.0(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-sortable-hoc: 2.0.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + use-json-comparison: 1.0.6(react@18.2.0) + transitivePeerDependencies: + - '@types/lodash.merge' + - prop-types + dev: true + + /@ant-design/pro-table@3.6.11(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9FDMkggZ1xgTsK5KawECnD1XxJB7CmLcCu2fNNdK0XH+YIO1LapXVOuspRlGKrdJi4BXB73t2HG+KLGIAayfyg==} + peerDependencies: + antd: '>=4.23.0' + rc-field-form: ^1.22.0 + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-card': 2.4.9(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.12.1(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + omit.js: 2.0.2 + rc-field-form: 1.32.0(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-sortable-hoc: 2.0.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + use-json-comparison: 1.0.6(react@18.2.0) + transitivePeerDependencies: + - '@types/lodash.merge' + - prop-types + + /@ant-design/pro-utils@2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-gS3dPoSMFA9iKazpSokRjpXP2babnTn4Sr52q/NREzKZMltmHnow82u9/GeRXEzKRwD3fdQJBUOgVuVDpQ4skw==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + swr: 2.1.5(react@18.2.0) + dev: true + + /@ant-design/pro-utils@2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-gS3dPoSMFA9iKazpSokRjpXP2babnTn4Sr52q/NREzKZMltmHnow82u9/GeRXEzKRwD3fdQJBUOgVuVDpQ4skw==} + peerDependencies: + antd: '>=4.23.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.3 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + swr: 2.1.5(react@18.2.0) + + /@ant-design/react-slick@0.29.2(react@18.2.0): + resolution: {integrity: sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==} + peerDependencies: + react: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + json2mq: 0.2.0 + lodash: 4.17.21 + react: 18.2.0 + resize-observer-polyfill: 1.5.1 + dev: true + + /@ant-design/react-slick@1.0.1(react@18.2.0): + resolution: {integrity: sha512-ARM0TmpGdDuUVE10NwUCENQlJSInNKo5NiBjL5szu5BxWNEHNwQMcDrlVCqFbkvFLy+2CvywW8Y59QJtC0YDag==} + peerDependencies: + react: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + json2mq: 0.2.0 + react: 18.2.0 + resize-observer-polyfill: 1.5.1 + throttle-debounce: 5.0.0 + + /@ant-design/use-emotion-css@1.0.4(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PekXeeHCpSNi6ziV62gy2Yy2MijssiVMaCJbbyOmPbeZJYQmB4FecJwlB+e2WuIbSHQdM3O9pyN4Cx3GJKxJkA==} + peerDependencies: + antd: '>=5.0.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@emotion/css': 11.11.0 + antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@antfu/install-pkg@0.1.1: + resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + dev: true + + /@antfu/utils@0.7.2: + resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==} + dev: true + + /@babel/cli@7.21.5(@babel/core@7.22.1): + resolution: {integrity: sha512-TOKytQ9uQW9c4np8F+P7ZfPINy5Kv+pizDIUwSVH8X5zHgYHV4AA8HE5LA450xXeu4jEfmUckTYvv1I4S26M/g==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@jridgewell/trace-mapping': 0.3.18 + commander: 4.1.1 + convert-source-map: 1.9.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.5.3 + dev: true + + /@babel/code-frame@7.12.11: + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + + /@babel/compat-data@7.22.3: + resolution: {integrity: sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.21.0: + resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.22.3 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.21.0) + '@babel/helper-module-transforms': 7.22.1 + '@babel/helpers': 7.22.3 + '@babel/parser': 7.22.3 + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.22.1: + resolution: {integrity: sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.22.3 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-module-transforms': 7.22.1 + '@babel/helpers': 7.22.3 + '@babel/parser': 7.22.3 + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + /@babel/eslint-parser@7.19.1(@babel/core@7.21.0)(eslint@8.35.0): + resolution: {integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.21.0 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.35.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.0 + dev: true + + /@babel/eslint-parser@7.19.1(@babel/core@7.21.0)(eslint@8.41.0): + resolution: {integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.21.0 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.41.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.0 + dev: true + + /@babel/eslint-parser@7.21.8(@babel/core@7.22.1)(eslint@7.32.0): + resolution: {integrity: sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.22.1 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 7.32.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.0 + dev: true + + /@babel/generator@7.22.3: + resolution: {integrity: sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.3: + resolution: {integrity: sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + dev: true + + /@babel/helper-compilation-targets@7.22.1(@babel/core@7.21.0): + resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.3 + '@babel/core': 7.21.0 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.6 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1): + resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.3 + '@babel/core': 7.22.1 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.6 + lru-cache: 5.1.1 + semver: 6.3.0 + + /@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.22.1): + resolution: {integrity: sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.22.1 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.22.3 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.22.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.1(@babel/core@7.22.1): + resolution: {integrity: sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.3.2 + semver: 6.3.0 + dev: true + + /@babel/helper-define-polyfill-provider@0.4.0(@babel/core@7.22.1): + resolution: {integrity: sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + debug: 4.3.4(supports-color@5.5.0) + lodash.debounce: 4.0.8 + resolve: 1.22.2 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.1: + resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.21.9 + '@babel/types': 7.22.3 + + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + + /@babel/helper-member-expression-to-functions@7.22.3: + resolution: {integrity: sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + dev: true + + /@babel/helper-module-imports@7.21.4: + resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + + /@babel/helper-module-transforms@7.22.1: + resolution: {integrity: sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.22.1 + '@babel/helper-module-imports': 7.21.4 + '@babel/helper-simple-access': 7.21.5 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + transitivePeerDependencies: + - supports-color + + /@babel/helper-optimise-call-expression@7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + dev: true + + /@babel/helper-plugin-utils@7.21.5: + resolution: {integrity: sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.22.1): + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.22.1 + '@babel/helper-wrap-function': 7.20.5 + '@babel/types': 7.22.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers@7.22.1: + resolution: {integrity: sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.22.1 + '@babel/helper-member-expression-to-functions': 7.22.3 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access@7.21.5: + resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + dev: true + + /@babel/helper-split-export-declaration@7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.3 + + /@babel/helper-string-parser@7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.20.5: + resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.21.0 + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.22.3: + resolution: {integrity: sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.22.3: + resolution: {integrity: sha512-vrukxyW/ep8UD1UDzOYpTKQ6abgjFoeG6L+4ar9+c5TN9QnlqiOi6QK7LSR5ewm/ERyGkT/Ai6VboNrxhbr9Uw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.3 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-transform-optional-chaining': 7.22.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-external-helpers@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-wNqc87qjLvsD1PIMQBzLn1bMuTlGzqLzM/1VGQ22Wm51cbCWS9k71ydp5iZS4hjwQNuTWSn/xbZkkusNENwtZg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-decorators@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-replace-supers': 7.22.1 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/plugin-syntax-decorators': 7.22.3(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.1): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.3 + '@babel/core': 7.22.1 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.22.1): + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.1): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.1): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.1): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.1): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-decorators@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.1): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.1): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.22.1): + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-import-attributes@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.1): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.1): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.1): + resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.1): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.1): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.1): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.1): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.1): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.1): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.1): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.1): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.1): + resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.22.1): + resolution: {integrity: sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-environment-visitor': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.1) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.22.1): + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-module-imports': 7.21.4 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.22.1): + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-class-properties@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-class-static-block@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.22.1): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-environment-visitor': 7.22.1 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-replace-supers': 7.22.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.22.1): + resolution: {integrity: sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/template': 7.21.9 + dev: true + + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.22.1): + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.22.1): + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.22.1(@babel/core@7.22.1): + resolution: {integrity: sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.3 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-for-of@7.21.5(@babel/core@7.22.1): + resolution: {integrity: sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.22.1): + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-json-strings@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.22.1): + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.22.1): + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-module-transforms': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.22.1): + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-module-transforms': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-simple-access': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.22.1): + resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-module-transforms': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-simple-access': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-module-transforms': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-new-target@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-numeric-separator@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.3 + '@babel/core': 7.22.1 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-replace-supers': 7.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-optional-chaining@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-parameters@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-private-methods@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-private-property-in-object@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/plugin-transform-react-jsx': 7.22.3(@babel/core@7.22.1) + dev: true + + /@babel/plugin-transform-react-jsx-self@7.21.0(@babel/core@7.22.1): + resolution: {integrity: sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.22.1): + resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-react-jsx@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.21.4 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1) + '@babel/types': 7.22.3 + dev: true + + /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-regenerator@7.21.5(@babel/core@7.22.1): + resolution: {integrity: sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + regenerator-transform: 0.15.1 + dev: true + + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.22.1): + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + dev: true + + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.22.1): + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.22.1): + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-typescript@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-unicode-escapes@7.21.5(@babel/core@7.22.1): + resolution: {integrity: sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.22.1): + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + + /@babel/preset-env@7.22.2(@babel/core@7.22.1): + resolution: {integrity: sha512-UPNK9pgphMULvA2EMKIWHU90C47PKyuvQ8pE1MzH7l9PgFcRabdrHhlePpBuWxYZQ+TziP2nycKoI5C1Yhdm9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.3 + '@babel/core': 7.22.1 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.22.1) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.1) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.1) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.1) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.22.1) + '@babel/plugin-syntax-import-attributes': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.1) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.1) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.1) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.1) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.1) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-arrow-functions': 7.21.5(@babel/core@7.22.1) + '@babel/plugin-transform-async-generator-functions': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.22.1) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.22.1) + '@babel/plugin-transform-class-properties': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-class-static-block': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.22.1) + '@babel/plugin-transform-computed-properties': 7.21.5(@babel/core@7.22.1) + '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.22.1) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.22.1) + '@babel/plugin-transform-dynamic-import': 7.22.1(@babel/core@7.22.1) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-export-namespace-from': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-for-of': 7.21.5(@babel/core@7.22.1) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.22.1) + '@babel/plugin-transform-json-strings': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.22.1) + '@babel/plugin-transform-logical-assignment-operators': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.22.1) + '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.22.1) + '@babel/plugin-transform-modules-systemjs': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-new-target': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-numeric-separator': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-object-rest-spread': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-optional-catch-binding': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-optional-chaining': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-private-methods': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-private-property-in-object': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-regenerator': 7.21.5(@babel/core@7.22.1) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.22.1) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.22.1) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.22.1) + '@babel/plugin-transform-unicode-escapes': 7.21.5(@babel/core@7.22.1) + '@babel/plugin-transform-unicode-property-regex': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-unicode-sets-regex': 7.22.3(@babel/core@7.22.1) + '@babel/preset-modules': 0.1.5(@babel/core@7.22.1) + '@babel/types': 7.22.3 + babel-plugin-polyfill-corejs2: 0.4.3(@babel/core@7.22.1) + babel-plugin-polyfill-corejs3: 0.8.1(@babel/core@7.22.1) + babel-plugin-polyfill-regenerator: 0.5.0(@babel/core@7.22.1) + core-js-compat: 3.30.2 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.5(@babel/core@7.22.1): + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.1) + '@babel/types': 7.22.3 + esutils: 2.0.3 + dev: true + + /@babel/preset-react@7.22.3(@babel/core@7.22.1): + resolution: {integrity: sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-react-jsx': 7.22.3(@babel/core@7.22.1) + '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.22.1) + dev: true + + /@babel/preset-typescript@7.21.5(@babel/core@7.22.1): + resolution: {integrity: sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1) + '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.22.1) + '@babel/plugin-transform-typescript': 7.22.3(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + + /@babel/runtime@7.22.3: + resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template@7.21.9: + resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.22.3 + '@babel/types': 7.22.3 + + /@babel/traverse@7.22.1(supports-color@5.5.0): + resolution: {integrity: sha512-lAWkdCoUFnmwLBhIRLciFntGYsIIoC6vIbN8zrLPqBnJmPu7Z6nzqnKd7FsxQUNAvZfVZ0x6KdNvNp8zWIOHSQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.22.3 + '@babel/helper-environment-visitor': 7.22.1 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.22.3 + '@babel/types': 7.22.3 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.22.3: + resolution: {integrity: sha512-P3na3xIQHTKY4L0YOG7pM8M8uoUIB910WQaSiiMCZUC2Cy8XFEQONGABFnHWBa2gpGKODTAJcNhi5Zk0sLRrzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@bloomberg/record-tuple-polyfill@0.0.4: + resolution: {integrity: sha512-h0OYmPR3A5Dfbetra/GzxBAzQk8sH7LhRkRUTdagX6nrtlUgJGYCTv4bBK33jsTQw9HDd8PE2x1Ma+iRKEDUsw==} + dev: true + + /@chenshuai2144/sketch-color@1.0.9(react@18.2.0): + resolution: {integrity: sha512-obzSy26cb7Pm7OprWyVpgMpIlrZpZ0B7vbrU0RMbvRg0YAI890S5Xy02Aj1Nhl4+KTbi1lVYHt6HQP8Hm9s+1w==} + peerDependencies: + react: '>=16.12.0' + dependencies: + react: 18.2.0 + reactcss: 1.2.3(react@18.2.0) + tinycolor2: 1.6.0 + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@csstools/postcss-color-function@1.1.1(postcss@8.4.24): + resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.24): + resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.24): + resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.24): + resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.24): + resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.24): + resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.24): + resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.24): + resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.24): + resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-unset-value@1.0.2(postcss@8.4.24): + resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + dev: true + + /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.13): + resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.10 + dependencies: + postcss-selector-parser: 6.0.13 + dev: true + + /@ctrl/tinycolor@3.6.0: + resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==} + engines: {node: '>=10'} + + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.21.4 + '@babel/runtime': 7.22.3 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/css@11.11.0: + resolution: {integrity: sha512-m4g6nKzZyiKyJ3WOfdwrBdcujVcpaScIWHAnyNKPm/A/xJKwfXPfQAbEVi1kgexWTDakmg+r2aDj0KvnMTo4oQ==} + dependencies: + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.2 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + dev: false + + /@emotion/hash@0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: true + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + /@emotion/serialize@1.1.2: + resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.2 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/stylis@0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + dev: true + + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild-kit/cjs-loader@2.4.2: + resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.5.0 + dev: true + + /@esbuild-kit/core-utils@3.1.0: + resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + dependencies: + esbuild: 0.17.19 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader@2.5.5: + resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.5.0 + dev: true + + /@esbuild/android-arm64@0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.16.17: + resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.16.17: + resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.16.17: + resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.16.17: + resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.16.17: + resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.16.17: + resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.16.17: + resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.16.17: + resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.16.17: + resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.16.17: + resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.16.17: + resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.16.17: + resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.16.17: + resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.16.17: + resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.16.17: + resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.16.17: + resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.16.17: + resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.16.17: + resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@7.32.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.35.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.35.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.41.0 + eslint-visitor-keys: 3.4.1 + + /@eslint-community/regexpp@4.5.1: + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@0.4.3: + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + espree: 7.3.1 + globals: 13.20.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/eslintrc@2.0.3: + resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.5.2 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.35.0: + resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@eslint/js@8.41.0: + resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@exodus/schemasafe@1.0.1: + resolution: {integrity: sha512-PQdbF8dGd4LnbwBlcc4ML8RKYdplm+e9sUeWBTr4zgF13/Shiuov9XznvM4T8cb1CfyKK21yTUkuAIIh/DAH/g==} + dev: true + + /@floating-ui/core@0.6.2: + resolution: {integrity: sha512-jktYRmZwmau63adUG3GKOAVCofBXkk55S/zQ94XOorAHhwqFIOFAy1rSp2N0Wp6/tGbe9V3u/ExlGZypyY17rg==} + dev: true + + /@floating-ui/dom@0.4.5: + resolution: {integrity: sha512-b+prvQgJt8pieaKYMSJBXHxX/DYwdLsAWxKYqnO5dO2V4oo/TYBZJAUQCVNjTWWsrs6o4VDrNcP9+E70HAhJdw==} + dependencies: + '@floating-ui/core': 0.6.2 + dev: true + + /@floating-ui/react-dom-interactions@0.3.1(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0): + resolution: {integrity: sha512-tP2KEh7EHJr5hokSBHcPGojb+AorDNUf0NYfZGg/M+FsMvCOOsSEeEF0O1NDfETIzDnpbHnCs0DuvCFhSMSStg==} + deprecated: Package renamed to @floating-ui/react + dependencies: + '@floating-ui/react-dom': 0.6.3(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0) + aria-hidden: 1.2.3 + point-in-polygon: 1.1.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.7)(react@18.1.0) + transitivePeerDependencies: + - '@types/react' + - react + - react-dom + dev: true + + /@floating-ui/react-dom@0.6.3(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0): + resolution: {integrity: sha512-hC+pS5D6AgS2wWjbmSQ6UR6Kpy+drvWGJIri6e1EDGADTPsCaa4KzCgmCczHrQeInx9tqs81EyDmbKJYY2swKg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 0.4.5 + react: 18.1.0 + react-dom: 18.1.0(react@18.1.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.7)(react@18.1.0) + transitivePeerDependencies: + - '@types/react' + dev: true + + /@formatjs/ecma402-abstract@1.11.4: + resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} + dependencies: + '@formatjs/intl-localematcher': 0.2.25 + tslib: 2.5.2 + dev: true + + /@formatjs/fast-memoize@1.2.1: + resolution: {integrity: sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==} + dependencies: + tslib: 2.5.2 + dev: true + + /@formatjs/icu-messageformat-parser@2.1.0: + resolution: {integrity: sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==} + dependencies: + '@formatjs/ecma402-abstract': 1.11.4 + '@formatjs/icu-skeleton-parser': 1.3.6 + tslib: 2.5.2 + dev: true + + /@formatjs/icu-skeleton-parser@1.3.6: + resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==} + dependencies: + '@formatjs/ecma402-abstract': 1.11.4 + tslib: 2.5.2 + dev: true + + /@formatjs/intl-displaynames@1.2.10: + resolution: {integrity: sha512-GROA2RP6+7Ouu0WnHFF78O5XIU7pBfI19WM1qm93l6MFWibUk67nCfVCK3VAYJkLy8L8ZxjkYT11VIAfvSz8wg==} + dependencies: + '@formatjs/intl-utils': 2.3.0 + dev: true + + /@formatjs/intl-listformat@1.4.8: + resolution: {integrity: sha512-WNMQlEg0e50VZrGIkgD5n7+DAMGt3boKi1GJALfhFMymslJb5i+5WzWxyj/3a929Z6MAFsmzRIJjKuv+BxKAOQ==} + dependencies: + '@formatjs/intl-utils': 2.3.0 + dev: true + + /@formatjs/intl-localematcher@0.2.25: + resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} + dependencies: + tslib: 2.5.2 + dev: true + + /@formatjs/intl-relativetimeformat@4.5.16: + resolution: {integrity: sha512-IQ0haY97oHAH5OYUdykNiepdyEWj3SAT+Fp9ZpR85ov2JNiFx+12WWlxlVS8ehdyncC2ZMt/SwFIy2huK2+6/A==} + dependencies: + '@formatjs/intl-utils': 2.3.0 + dev: true + + /@formatjs/intl-unified-numberformat@3.3.7: + resolution: {integrity: sha512-KnWgLRHzCAgT9eyt3OS34RHoyD7dPDYhRcuKn+/6Kv2knDF8Im43J6vlSW6Hm1w63fNq3ZIT1cFk7RuVO3Psag==} + deprecated: We have renamed the package to @formatjs/intl-numberformat + dependencies: + '@formatjs/intl-utils': 2.3.0 + dev: true + + /@formatjs/intl-utils@2.3.0: + resolution: {integrity: sha512-KWk80UPIzPmUg+P0rKh6TqspRw0G6eux1PuJr+zz47ftMaZ9QDwbGzHZbtzWkl5hgayM/qrKRutllRC7D/vVXQ==} + deprecated: the package is rather renamed to @formatjs/ecma-abstract with some changes in functionality (primarily selectUnit is removed and we don't plan to make any further changes to this package + dev: true + + /@humanwhocodes/config-array@0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/config-array@0.5.0: + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: true + + /@iconify/utils@2.1.1: + resolution: {integrity: sha512-H8xz74JDzDw8f0qLxwIaxFMnFkbXTZNWEufOk3WxaLFHV4h0A2FjIDgNk5LzC0am4jssnjdeJJdRs3UFu3582Q==} + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.2 + '@iconify/types': 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + kolorist: 1.8.0 + local-pkg: 0.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@29.5.0: + resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + chalk: 4.1.2 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + slash: 3.0.0 + dev: true + + /@jest/core@29.5.0(ts-node@10.9.1): + resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1) + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + jest-watcher: 29.5.0 + micromatch: 4.0.5 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment@29.5.0: + resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + jest-mock: 29.5.0 + dev: true + + /@jest/expect-utils@29.5.0: + resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + dev: true + + /@jest/expect@29.5.0: + resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.5.0 + jest-snapshot: 29.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.5.0: + resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@sinonjs/fake-timers': 10.2.0 + '@types/node': 20.2.5 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 + jest-util: 29.5.0 + dev: true + + /@jest/globals@29.5.0: + resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/types': 29.5.0 + jest-mock: 29.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.5.0: + resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 20.2.5 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + jest-worker: 29.5.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.4.3: + resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.25.24 + dev: true + + /@jest/source-map@29.4.3: + resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.5.0: + resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.5.0 + '@jest/types': 29.5.0 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + + /@jest/test-sequencer@29.5.0: + resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.5.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + slash: 3.0.0 + dev: true + + /@jest/transform@29.5.0: + resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.22.1 + '@jest/types': 29.5.0 + '@jridgewell/trace-mapping': 0.3.18 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + jest-regex-util: 29.4.3 + jest-util: 29.5.0 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 20.2.5 + '@types/yargs': 16.0.5 + chalk: 4.1.2 + dev: true + + /@jest/types@29.5.0: + resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 20.2.5 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.3: + resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@loadable/component@5.15.2(react@18.1.0): + resolution: {integrity: sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.21.0 + hoist-non-react-statics: 3.3.2 + react: 18.1.0 + react-is: 16.13.1 + dev: true + + /@loadable/component@5.15.2(react@18.2.0): + resolution: {integrity: sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.21.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-is: 16.13.1 + dev: true + + /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + requiresBuild: true + dev: true + optional: true + + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + dependencies: + eslint-scope: 5.1.1 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@pkgr/utils@2.4.1: + resolution: {integrity: sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.2.12 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.5.2 + dev: true + + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.14.0)(webpack@5.84.1): + resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <4.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + dependencies: + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.30.2 + error-stack-parser: 2.1.4 + find-up: 5.0.0 + html-entities: 2.3.3 + loader-utils: 2.0.4 + react-refresh: 0.14.0 + schema-utils: 3.1.2 + source-map: 0.7.4 + webpack: 5.84.1 + dev: true + + /@qixian.cs/path-to-regexp@6.1.0: + resolution: {integrity: sha512-2jIiLiVZB1jnY7IIRQKtoV8Gnr7XIhk4mC88ONGunZE3hYt5IHUG4BE/6+JiTBjjEWQLBeWnZB8hGpppkufiVw==} + dev: false + + /@radix-ui/popper@0.0.10: + resolution: {integrity: sha512-YFKuPqQPKscreQid7NuB4it3PMzSwGg03vgrud6sVliHkI43QNAOHyrHyMNo015jg6QK5GVDn+7J2W5uygqSGA==} + dependencies: + '@babel/runtime': 7.22.3 + csstype: 3.1.2 + dev: true + + /@rc-component/color-picker@1.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MKYqgEncpISQiZIaj8ykcdzZewgjslEfDo2iHg627jPnt+DbWIKG1T8MS55qXjuxkokgL0cNueyGnOndfaaNKw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@ctrl/tinycolor': 3.6.0 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@rc-component/context@1.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@rc-component/mini-decimal@1.0.1: + resolution: {integrity: sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==} + engines: {node: '>=8.x'} + dependencies: + '@babel/runtime': 7.22.3 + + /@rc-component/mutate-observer@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@rc-component/portal@1.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-m8w3dFXX0H6UkJ4wtfrSwhe2/6M08uz24HHrF8pWfAXPwA9hwCuTE5per/C86KwNLouRpwFGcr7LfpHaa1F38g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@rc-component/tour@1.8.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rrRGioHTLQlGca27G2+lw7QpRb3uuMYCUIJjj31/B44VCJS0P2tqYhOgtzvWQmaLMlWH3ZlpzotkKX13NT4XEA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@rc-component/trigger@1.13.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CA4s8QGj2kagp8dmYRVcSIW5IErw/YBxSeFEsQmt6SB0oaj9pj+akkB6O0S/Y6ww5JrIDu9Bukq89se1oW9F3w==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@remix-run/router@1.6.2: + resolution: {integrity: sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==} + engines: {node: '>=14'} + dev: true + + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: true + + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.2.0: + resolution: {integrity: sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@stylelint/postcss-css-in-js@0.37.3(postcss-syntax@0.36.2)(postcss@7.0.39): + resolution: {integrity: sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + postcss: '>=7.0.0' + postcss-syntax: '>=0.36.2' + dependencies: + '@babel/core': 7.22.1 + postcss: 7.0.39 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + transitivePeerDependencies: + - supports-color + dev: true + + /@stylelint/postcss-css-in-js@0.38.0(postcss-syntax@0.36.2)(postcss@8.4.24): + resolution: {integrity: sha512-XOz5CAe49kS95p5yRd+DAIWDojTjfmyAQ4bbDlXMdbZTQ5t0ThjSLvWI6JI2uiS7MFurVBkZ6zUqcimzcLTBoQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + postcss: '>=7.0.0' + postcss-syntax: '>=0.36.2' + dependencies: + '@babel/core': 7.21.0 + postcss: 8.4.24 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + transitivePeerDependencies: + - supports-color + dev: true + + /@stylelint/postcss-markdown@0.36.2(postcss-syntax@0.36.2)(postcss@7.0.39): + resolution: {integrity: sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==} + deprecated: 'Use the original unforked package instead: postcss-markdown' + peerDependencies: + postcss: '>=7.0.0' + postcss-syntax: '>=0.36.2' + dependencies: + postcss: 7.0.39 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + remark: 13.0.0 + unist-util-find-all-after: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.22.1): + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + dev: true + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.22.1): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + dev: true + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.22.1): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + dev: true + + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.22.1): + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + dev: true + + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.22.1): + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + dev: true + + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.22.1): + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + dev: true + + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.22.1): + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + dev: true + + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.22.1): + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + dev: true + + /@svgr/babel-preset@6.5.1(@babel/core@7.22.1): + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.22.1) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.22.1) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.22.1) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.22.1) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.22.1) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.22.1) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.22.1) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.22.1) + dev: true + + /@svgr/core@6.5.1: + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.22.1 + '@svgr/babel-preset': 6.5.1(@babel/core@7.22.1) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@svgr/hast-util-to-babel-ast@6.5.1: + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.22.3 + entities: 4.5.0 + dev: true + + /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + dependencies: + '@babel/core': 7.22.1 + '@svgr/babel-preset': 6.5.1(@babel/core@7.22.1) + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 6.5.1 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 2.8.0 + dev: true + + /@tanstack/match-sorter-utils@8.8.4: + resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} + engines: {node: '>=12'} + dependencies: + remove-accents: 0.4.2 + dev: true + + /@tanstack/query-core@4.29.11: + resolution: {integrity: sha512-8C+hF6SFAb/TlFZyS9FItgNwrw4PMa7YeX+KQYe2ZAiEz6uzg6yIr+QBzPkUwZ/L0bXvGd1sufTm3wotoz+GwQ==} + dev: true + + /@tanstack/react-query-devtools@4.29.11(@tanstack/react-query@4.29.11)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-paOSRfNtUbeo3anTtKgRSaMGplAN2VilmzLR9a3lbVZVCF4EzvL1Xmp4Xv9cDN8kGuv2CZTvUP6lvyxPlKSpew==} + peerDependencies: + '@tanstack/react-query': 4.29.11 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/match-sorter-utils': 8.8.4 + '@tanstack/react-query': 4.29.11(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + superjson: 1.12.3 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: true + + /@tanstack/react-query@4.29.11(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aLaOAhBnCr12YKPjDsZOc0fAtkyaW7f9KfVfw49oYpfe0H9EPXBUgDBIKJ8qdHF3uGzTVSMcmpiw1Za41BLZlw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.29.11 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: true + + /@testing-library/dom@8.20.0: + resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==} + engines: {node: '>=12'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/runtime': 7.22.3 + '@types/aria-query': 5.0.1 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + + /@testing-library/react@13.4.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} + engines: {node: '>=12'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/runtime': 7.22.3 + '@testing-library/dom': 8.20.0 + '@types/react-dom': 18.2.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@types/aria-query@5.0.1: + resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} + dev: true + + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + dependencies: + '@babel/parser': 7.22.3 + '@babel/types': 7.22.3 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.0 + dev: true + + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.22.3 + dev: true + + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.22.3 + '@babel/types': 7.22.3 + dev: true + + /@types/babel__traverse@7.20.0: + resolution: {integrity: sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==} + dependencies: + '@babel/types': 7.22.3 + dev: true + + /@types/body-parser@1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 20.2.5 + dev: true + + /@types/classnames@2.3.1: + resolution: {integrity: sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==} + deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed. + dependencies: + classnames: 2.3.2 + dev: true + + /@types/connect@3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 20.2.5 + dev: true + + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.40.0 + '@types/estree': 1.0.1 + + /@types/eslint@7.29.0: + resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/eslint@8.40.0: + resolution: {integrity: sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + + /@types/express-serve-static-core@4.17.35: + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + dependencies: + '@types/node': 20.2.5 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + '@types/send': 0.17.1 + dev: true + + /@types/express@4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.35 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.1 + dev: true + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.2.5 + dev: true + + /@types/graceful-fs@4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 20.2.5 + dev: true + + /@types/hapi__joi@17.1.9: + resolution: {integrity: sha512-oOMFT8vmCTFncsF1engrs04jatz8/Anwx3De9uxnOK4chgSEgWBvFtpSoJo8u3784JNO+ql5tzRR6phHoRnscQ==} + dev: true + + /@types/history@4.7.11: + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + dev: true + + /@types/hoist-non-react-statics@3.3.1: + resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} + dependencies: + '@types/react': 18.2.7 + hoist-non-react-statics: 3.3.2 + dev: true + + /@types/html-minifier-terser@6.1.0: + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + dev: true + + /@types/invariant@2.2.35: + resolution: {integrity: sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==} + dev: true + + /@types/isomorphic-fetch@0.0.34: + resolution: {integrity: sha512-BmJKuPCZCR6pbYYgi5nKFJrPC4pLoBgsi/B1nFN64Ba+hLLGUcKPIh7eVlR2xG763Ap08hgQafq/Wx4RFb0omQ==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/jest@29.5.1: + resolution: {integrity: sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==} + dependencies: + expect: 29.5.0 + pretty-format: 29.5.0 + dev: true + + /@types/js-cookie@2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: true + + /@types/jsdom@20.0.1: + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + dependencies: + '@types/node': 20.2.5 + '@types/tough-cookie': 4.0.2 + parse5: 7.1.2 + dev: true + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + + /@types/lodash@4.14.195: + resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} + dev: true + + /@types/mdast@3.0.11: + resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /@types/mime@1.3.2: + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + dev: true + + /@types/mime@3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: true + + /@types/node@20.2.5: + resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + + /@types/prettier@2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: true + + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/range-parser@1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: true + + /@types/react-dom@18.2.4: + resolution: {integrity: sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==} + dependencies: + '@types/react': 18.2.7 + dev: true + + /@types/react-helmet@6.1.6: + resolution: {integrity: sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==} + dependencies: + '@types/react': 18.2.7 + dev: true + + /@types/react-redux@7.1.25: + resolution: {integrity: sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==} + dependencies: + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.2.7 + hoist-non-react-statics: 3.3.2 + redux: 4.2.1 + dev: true + + /@types/react-router-dom@4.3.5: + resolution: {integrity: sha512-eFajSUASYbPHg2BDM1G8Btx+YqGgvROPIg6sBhl3O4kbDdYXdFdfrgQFf/pcBuQVObjfT9AL/dd15jilR5DIEA==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.7 + '@types/react-router': 5.1.20 + dev: true + + /@types/react-router-redux@5.0.22: + resolution: {integrity: sha512-0Vcr0HzpZTC+PQVY6vGJ57yv1hFZSPFs/QHqYPbn2uEDKUYBV3dAZQtoTYhsa1bGqRE91yedgX29AM68FlxfmA==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.7 + '@types/react-router': 5.1.20 + redux: 4.2.1 + dev: true + + /@types/react-router@5.1.20: + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.7 + dev: true + + /@types/react@18.2.7: + resolution: {integrity: sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + dev: true + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + dev: true + + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true + + /@types/send@0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + dependencies: + '@types/mime': 1.3.2 + '@types/node': 20.2.5 + dev: true + + /@types/serve-static@1.15.1: + resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + dependencies: + '@types/mime': 3.0.1 + '@types/node': 20.2.5 + dev: true + + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/tough-cookie@4.0.2: + resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} + dev: true + + /@types/unist@2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: true + + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: true + + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs@16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@types/yargs@17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@typescript-eslint/eslint-plugin@5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.48.1(eslint@8.35.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 5.48.1 + '@typescript-eslint/type-utils': 5.48.1(eslint@8.35.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.48.1(eslint@8.35.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.35.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.5.1 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin@5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.41.0)(typescript@5.0.2): + resolution: {integrity: sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.48.1(eslint@8.41.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 5.48.1 + '@typescript-eslint/type-utils': 5.48.1(eslint@8.41.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.48.1(eslint@8.41.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.41.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.5.1 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7)(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.5.1 + '@typescript-eslint/parser': 5.59.7(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.59.7 + '@typescript-eslint/type-utils': 5.59.7(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.59.7(eslint@7.32.0)(typescript@4.9.5) + debug: 4.3.4(supports-color@5.5.0) + eslint: 7.32.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.1 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils@4.33.0(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.12 + '@typescript-eslint/scope-manager': 4.33.0 + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5) + eslint: 7.32.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@7.32.0) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/parser@5.48.1(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.48.1 + '@typescript-eslint/types': 5.48.1 + '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.35.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.48.1(eslint@8.41.0)(typescript@5.0.2): + resolution: {integrity: sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.48.1 + '@typescript-eslint/types': 5.48.1 + '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.41.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.59.7(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.59.7 + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.9.5) + debug: 4.3.4(supports-color@5.5.0) + eslint: 7.32.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@4.33.0: + resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dependencies: + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/visitor-keys': 4.33.0 + dev: true + + /@typescript-eslint/scope-manager@5.48.1: + resolution: {integrity: sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.48.1 + '@typescript-eslint/visitor-keys': 5.48.1 + dev: true + + /@typescript-eslint/scope-manager@5.59.7: + resolution: {integrity: sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/visitor-keys': 5.59.7 + dev: true + + /@typescript-eslint/type-utils@5.48.1(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2) + '@typescript-eslint/utils': 5.48.1(eslint@8.35.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.35.0 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/type-utils@5.48.1(eslint@8.41.0)(typescript@5.0.2): + resolution: {integrity: sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2) + '@typescript-eslint/utils': 5.48.1(eslint@8.41.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.41.0 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/type-utils@5.59.7(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.9.5) + '@typescript-eslint/utils': 5.59.7(eslint@7.32.0)(typescript@4.9.5) + debug: 4.3.4(supports-color@5.5.0) + eslint: 7.32.0 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@4.33.0: + resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dev: true + + /@typescript-eslint/types@5.48.1: + resolution: {integrity: sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@5.59.7: + resolution: {integrity: sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@4.33.0(typescript@4.9.5): + resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/visitor-keys': 4.33.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.1 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.48.1(typescript@5.0.2): + resolution: {integrity: sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.48.1 + '@typescript-eslint/visitor-keys': 5.48.1 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.1 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.59.7(typescript@4.9.5): + resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/visitor-keys': 5.59.7 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.1 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.59.7(typescript@5.0.2): + resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/visitor-keys': 5.59.7 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.1 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.48.1(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.48.1 + '@typescript-eslint/types': 5.48.1 + '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2) + eslint: 8.35.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.35.0) + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.48.1(eslint@8.41.0)(typescript@5.0.2): + resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.48.1 + '@typescript-eslint/types': 5.48.1 + '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2) + eslint: 8.41.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.41.0) + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.59.7(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@7.32.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.59.7 + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.9.5) + eslint: 7.32.0 + eslint-scope: 5.1.1 + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.59.7(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.35.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.59.7 + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/typescript-estree': 5.59.7(typescript@5.0.2) + eslint: 8.35.0 + eslint-scope: 5.1.1 + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.59.7(eslint@8.41.0)(typescript@5.0.2): + resolution: {integrity: sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.59.7 + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/typescript-estree': 5.59.7(typescript@5.0.2) + eslint: 8.41.0 + eslint-scope: 5.1.1 + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@4.33.0: + resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dependencies: + '@typescript-eslint/types': 4.33.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /@typescript-eslint/visitor-keys@5.48.1: + resolution: {integrity: sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.48.1 + eslint-visitor-keys: 3.4.1 + dev: true + + /@typescript-eslint/visitor-keys@5.59.7: + resolution: {integrity: sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.59.7 + eslint-visitor-keys: 3.4.1 + dev: true + + /@umijs/ast@4.0.69: + resolution: {integrity: sha512-Bsq9j00EHL5owk3KpfZyGB65JZ29wyd8w1WBHWjgKX1LkKmiprV73E6DgFjIyNVNw3mX2r2HNtmFPJycmJR0mw==} + dependencies: + '@umijs/bundler-utils': 4.0.69 + transitivePeerDependencies: + - supports-color + dev: true + + /@umijs/babel-preset-umi@4.0.69(styled-components@5.3.11): + resolution: {integrity: sha512-0978ONVhvUuu0c5CRcwaMZYrvNYjmNaTD0JRNZQMaT9/2H65rnj9dazY4OT07dSEN9ZKIcJb3mTalNdVw2/rHA==} + dependencies: + '@babel/runtime': 7.21.0 + '@bloomberg/record-tuple-polyfill': 0.0.4 + '@umijs/bundler-utils': 4.0.69 + '@umijs/utils': 4.0.69 + babel-plugin-styled-components: 2.1.1(styled-components@5.3.11) + core-js: 3.28.0 + transitivePeerDependencies: + - styled-components + - supports-color + dev: true + + /@umijs/bundler-esbuild@4.0.69: + resolution: {integrity: sha512-3WcjSnQT818pSZsgE+Q10ADA+e8Co1Wd1M3Hxk05hLoIpUlMXkA5E/NS/C0UY+D3g/4R9zoxd7oqSvT62VEajw==} + hasBin: true + dependencies: + '@umijs/bundler-utils': 4.0.69 + '@umijs/utils': 4.0.69 + enhanced-resolve: 5.9.3 + postcss: 8.4.24 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.24) + postcss-preset-env: 7.5.0(postcss@8.4.24) + transitivePeerDependencies: + - supports-color + dev: true + + /@umijs/bundler-utils@4.0.59: + resolution: {integrity: sha512-hgScOWi1x3vrKMAMFdZNanDN0p4Iae1avsuP8vcpLtXBNSgGbWeNJCv0fVgInyfH1EsTNd2CzhqwR8lFOhA+tg==} + dependencies: + '@umijs/utils': 4.0.59 + esbuild: 0.16.17 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + spdy: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@umijs/bundler-utils@4.0.69: + resolution: {integrity: sha512-xdKsz3q0zHpR+oeYz0nrxsHBv7++CmFsSZBh3SjQlmyOr8yrjMsqF9VaW1olh+syrkHFvxX5OdMF21oQPuIQVg==} + dependencies: + '@umijs/utils': 4.0.69 + esbuild: 0.16.17 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + spdy: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@umijs/bundler-vite@4.0.69(@types/node@20.2.5)(postcss@8.4.24): + resolution: {integrity: sha512-IZVX230PbLPlBOgecZR1O5q90g09H/DjbmedUUgmK5bdmG8tdLXnGnZYgQ1V8rp9WjAr+4TkO4kVkui3Az16Cw==} + hasBin: true + dependencies: + '@svgr/core': 6.5.1 + '@umijs/bundler-utils': 4.0.69 + '@umijs/utils': 4.0.69 + '@vitejs/plugin-react': 4.0.0(vite@4.3.1) + less: 4.1.3 + postcss-preset-env: 7.5.0(postcss@8.4.24) + rollup-plugin-visualizer: 5.9.0 + vite: 4.3.1(@types/node@20.2.5)(less@4.1.3) + transitivePeerDependencies: + - '@types/node' + - postcss + - rollup + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /@umijs/bundler-webpack@4.0.69(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-p1h3MvcYr5aecrWwLDS0UZf5GgrITQuZAEl382zC6quB2TtWrJ/5BNxxQxuMyt9/Uf5IeqSvlLJGfp0ipyaD8Q==} + hasBin: true + dependencies: + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.14.0)(webpack@5.84.1) + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) + '@types/hapi__joi': 17.1.9 + '@umijs/babel-preset-umi': 4.0.69(styled-components@5.3.11) + '@umijs/bundler-utils': 4.0.69 + '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 + '@umijs/mfsu': 4.0.69 + '@umijs/utils': 4.0.69 + cors: 2.8.5 + css-loader: 6.7.1(webpack@5.84.1) + es5-imcompatible-versions: 0.1.82 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.0.2)(webpack@5.84.1) + jest-worker: 29.4.3 + lightningcss: 1.19.0 + node-libs-browser: 2.2.1 + postcss: 8.4.24 + postcss-preset-env: 7.5.0(postcss@8.4.24) + react-error-overlay: 6.0.9 + react-refresh: 0.14.0 + transitivePeerDependencies: + - '@types/webpack' + - sockjs-client + - styled-components + - supports-color + - type-fest + - typescript + - webpack + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /@umijs/case-sensitive-paths-webpack-plugin@1.0.1: + resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==} + dev: true + + /@umijs/core@4.0.69: + resolution: {integrity: sha512-UXeEJqSY5kTf+cqrBYkTIVZ/JxPYrnoP6VAyZmHVgydv6+eoalFKhuhOcX5X5diIBK1F2Xcs9nUtJHn+OH/y+w==} + dependencies: + '@umijs/bundler-utils': 4.0.69 + '@umijs/utils': 4.0.69 + transitivePeerDependencies: + - supports-color + dev: true + + /@umijs/did-you-know@1.0.3: + resolution: {integrity: sha512-9EZ+rgY9+2HEaE+Z9dGkal2ccw8L4uuz77tCB5WpskW7NBZX5nOj82sqF/shEtA5tU3SWO/Mi4n35K3iONvDtw==} + dev: true + + /@umijs/es-module-parser-darwin-arm64@0.0.7: + resolution: {integrity: sha512-1QeNupekuVYVvL4UHyCRq4ISP2PNk4rDd9UOPONW+KpqTyP9p7RfgGpwB0VLPaFSu2ADtm0XZyIaYEGPY6zuDw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser-darwin-x64@0.0.7: + resolution: {integrity: sha512-FBFmfigmToPc9qBCW7wHiTYpqnLdPbAvoMGOydzAu2NspdPEF7TfILcr8vCPNbNe3vCobS+T/YM1dP+SagERlA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser-linux-arm-gnueabihf@0.0.7: + resolution: {integrity: sha512-AXfmg3htkadLGsXUyiyrTig4omGCWIN4l+HS7Qapqv0wlfFYSpC0KPemjyBQgzXO70tDcT+1FNhGjIy+yr2pIQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser-linux-arm64-gnu@0.0.7: + resolution: {integrity: sha512-2wSdChFc39fPJwvS8tRq+jx8qNlIwrjRk1hb3N5o0rJR+rqt+ceAyNPbYwpNBmUHW7xtmDQvJUeinvr7hIBP+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser-linux-arm64-musl@0.0.7: + resolution: {integrity: sha512-cqQffARWkmQ3n1RYNKZR3aD6X8YaP6u1maASjDgPQOpZMAlv/OSDrM/7iGujWTs0PD0haockNG9/DcP6lgPHMw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser-linux-x64-gnu@0.0.7: + resolution: {integrity: sha512-PHrKHtT665Za0Ydjch4ACrNpRU+WIIden12YyF1CtMdhuLDSoU6UfdhF3NoDbgEUcXVDX/ftOqmj0SbH3R1uew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser-linux-x64-musl@0.0.7: + resolution: {integrity: sha512-cyZvUK5lcECLWzLp/eU1lFlCETcz+LEb+wrdARQSST1dgoIGZsT4cqM1WzYmdZNk3o883tiZizLt58SieEiHBQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser-win32-arm64-msvc@0.0.7: + resolution: {integrity: sha512-V7WxnUI88RboSl0RWLNQeKBT7EDW35fW6Tn92zqtoHHxrhAIL9DtDyvC8REP4qTxeZ6Oej/Ax5I6IjsLx3yTOg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser-win32-x64-msvc@0.0.7: + resolution: {integrity: sha512-X3Pqy0l38hg6wMPquPeMHuoHU+Cx+wzyz32SVYCta+RPJQ7n9PjrEBiIuVAw5+GJZjSABN7LVr8u/n0RZT9EQA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@umijs/es-module-parser@0.0.7: + resolution: {integrity: sha512-x47CMi/Hw7Nkz3RXTUqlldH/UM+Tcmw2PziV3k+itJqTFJc8oVx3lzdUgCnG+eL3ZtmLPbOEBhPb30V0NytNDQ==} + engines: {node: '>= 10'} + optionalDependencies: + '@umijs/es-module-parser-darwin-arm64': 0.0.7 + '@umijs/es-module-parser-darwin-x64': 0.0.7 + '@umijs/es-module-parser-linux-arm-gnueabihf': 0.0.7 + '@umijs/es-module-parser-linux-arm64-gnu': 0.0.7 + '@umijs/es-module-parser-linux-arm64-musl': 0.0.7 + '@umijs/es-module-parser-linux-x64-gnu': 0.0.7 + '@umijs/es-module-parser-linux-x64-musl': 0.0.7 + '@umijs/es-module-parser-win32-arm64-msvc': 0.0.7 + '@umijs/es-module-parser-win32-x64-msvc': 0.0.7 + dev: true + + /@umijs/fabric@2.14.1: + resolution: {integrity: sha512-fOyXcbViOB+/jW+g2rCiK9XjSZVn4OzFuMZpSCriCdR/KxhxLTokvJWFm3CzBEmg9vXfrBFQ4c/ykmqoVacHtw==} + hasBin: true + dependencies: + '@babel/core': 7.22.1 + '@babel/eslint-parser': 7.21.8(@babel/core@7.22.1)(eslint@7.32.0) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-proposal-decorators': 7.22.3(@babel/core@7.22.1) + '@babel/preset-env': 7.22.2(@babel/core@7.22.1) + '@babel/preset-react': 7.22.3(@babel/core@7.22.1) + '@babel/preset-typescript': 7.21.5(@babel/core@7.22.1) + '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.59.7(eslint@7.32.0)(typescript@4.9.5) + chalk: 4.1.2 + eslint: 7.32.0 + eslint-config-prettier: 8.8.0(eslint@7.32.0) + eslint-formatter-pretty: 4.1.0 + eslint-plugin-babel: 5.3.1(eslint@7.32.0) + eslint-plugin-jest: 24.7.0(@typescript-eslint/eslint-plugin@5.59.7)(eslint@7.32.0)(typescript@4.9.5) + eslint-plugin-promise: 6.1.1(eslint@7.32.0) + eslint-plugin-react: 7.32.2(eslint@7.32.0) + eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0) + eslint-plugin-unicorn: 20.1.0(eslint@7.32.0) + fast-glob: 3.2.12 + os-locale: 5.0.0 + prettier: 2.8.8 + prettier-plugin-packagejson: 2.3.0(prettier@2.8.8) + prettier-plugin-two-style-order: 1.0.1(prettier@2.8.8) + stylelint: 13.13.1 + stylelint-config-css-modules: 2.3.0(stylelint@13.13.1) + stylelint-config-prettier: 8.0.2(stylelint@13.13.1) + stylelint-config-standard: 20.0.0(stylelint@13.13.1) + stylelint-declaration-block-no-ignored-properties: 2.7.0(stylelint@13.13.1) + typescript: 4.9.5 + transitivePeerDependencies: + - postcss-jsx + - postcss-markdown + - supports-color + dev: true + + /@umijs/history@5.3.1: + resolution: {integrity: sha512-/e0cEGrR2bIWQD7pRl3dl9dcyRGeC9hoW0OCvUTT/hjY0EfUrkd6G8ZanVghPMpDuY5usxq9GVcvrT8KNXLWvA==} + dependencies: + '@babel/runtime': 7.21.0 + query-string: 6.14.1 + dev: true + + /@umijs/lint@4.0.69(eslint@8.35.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2): + resolution: {integrity: sha512-1b5e2wKLdbDczNIPQ6brO7eYUL633HtvEm+tf+4dOQJhvczs0zm6xUZAot0LMDPl/yyliFbLV3gk12ijcNRx6Q==} + dependencies: + '@babel/core': 7.21.0 + '@babel/eslint-parser': 7.19.1(@babel/core@7.21.0)(eslint@8.35.0) + '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2)(postcss@8.4.24) + '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.35.0)(typescript@5.0.2) + '@typescript-eslint/parser': 5.48.1(eslint@8.35.0)(typescript@5.0.2) + '@umijs/babel-preset-umi': 4.0.69(styled-components@5.3.11) + eslint-plugin-jest: 27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.35.0)(jest@29.5.0)(typescript@5.0.2) + eslint-plugin-react: 7.32.2(eslint@8.35.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.35.0) + postcss: 8.4.24 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + stylelint-config-standard: 25.0.0(stylelint@14.8.2) + transitivePeerDependencies: + - eslint + - jest + - postcss-html + - postcss-jsx + - postcss-less + - postcss-markdown + - postcss-scss + - styled-components + - stylelint + - supports-color + - typescript + dev: true + + /@umijs/lint@4.0.69(eslint@8.41.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2): + resolution: {integrity: sha512-1b5e2wKLdbDczNIPQ6brO7eYUL633HtvEm+tf+4dOQJhvczs0zm6xUZAot0LMDPl/yyliFbLV3gk12ijcNRx6Q==} + dependencies: + '@babel/core': 7.21.0 + '@babel/eslint-parser': 7.19.1(@babel/core@7.21.0)(eslint@8.41.0) + '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2)(postcss@8.4.24) + '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.41.0)(typescript@5.0.2) + '@typescript-eslint/parser': 5.48.1(eslint@8.41.0)(typescript@5.0.2) + '@umijs/babel-preset-umi': 4.0.69(styled-components@5.3.11) + eslint-plugin-jest: 27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.41.0)(jest@29.5.0)(typescript@5.0.2) + eslint-plugin-react: 7.32.2(eslint@8.41.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.41.0) + postcss: 8.4.24 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + stylelint-config-standard: 25.0.0(stylelint@14.16.1) + transitivePeerDependencies: + - eslint + - jest + - postcss-html + - postcss-jsx + - postcss-less + - postcss-markdown + - postcss-scss + - styled-components + - stylelint + - supports-color + - typescript + dev: true + + /@umijs/max-plugin-openapi@2.0.3: + resolution: {integrity: sha512-pV2GLscYHdOYNbQ1jgC+s99CGYFHegT/B+uRWVomL6+2mCdm9mP/KDSzGjkLZpL7PeXDlfPMsx/vSqAvDBGE2A==} + dependencies: + '@umijs/openapi': 1.8.3 + rimraf: 4.4.1 + serve-static: 1.15.0 + swagger-ui-dist: 4.19.0 + transitivePeerDependencies: + - chokidar + - encoding + - postcss-jsx + - postcss-markdown + - supports-color + dev: true + + /@umijs/max@4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react-dom@18.2.4)(@types/react@18.2.7)(dva@2.5.0-beta.2)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-S6V27+g1NR6NjawRvAX596WwY68UBFPw76uydBv4QjdXGkMnSVIXLU8/zySf3ZWRLkchG3VcNH8PlBIIPkpgCQ==} + hasBin: true + dependencies: + '@umijs/lint': 4.0.69(eslint@8.35.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2) + '@umijs/plugins': 4.0.69(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@4.24.10)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + antd: 4.24.10(react-dom@18.2.0)(react@18.2.0) + eslint: 8.35.0 + stylelint: 14.8.2 + umi: 4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react@18.2.7)(eslint@8.35.0)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2)(webpack@5.84.1) + transitivePeerDependencies: + - '@babel/core' + - '@types/lodash.merge' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - '@types/webpack' + - '@volar/vue-language-plugin-pug' + - '@volar/vue-typescript' + - babel-plugin-styled-components + - debug + - dva + - jest + - postcss + - postcss-html + - postcss-jsx + - postcss-less + - postcss-markdown + - postcss-scss + - prettier + - prop-types + - rc-field-form + - react + - react-dom + - react-native + - rollup + - sass + - sockjs-client + - styled-components + - stylus + - sugarss + - supports-color + - terser + - type-fest + - typescript + - webpack + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /@umijs/mfsu@4.0.69: + resolution: {integrity: sha512-ITLKw1DGAOMSeiQicXXO5nQh9FLMaf0/lxaZtAPYboq9DcodfJIG+J4xHYTjE+Ns5/9TQjkqMqTsKUCGCN6SIw==} + dependencies: + '@umijs/bundler-esbuild': 4.0.69 + '@umijs/bundler-utils': 4.0.69 + '@umijs/utils': 4.0.69 + enhanced-resolve: 5.9.3 + is-equal: 1.6.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@umijs/openapi@1.8.3: + resolution: {integrity: sha512-17xgd/x2aouxl/cITy0YD3TJ+kPf/rX+zXLJYg/Cf1DavMLntoqalcUQeh5/VtVO2+rSGtEepC3Ppl54LHqSUA==} + dependencies: + '@umijs/fabric': 2.14.1 + chalk: 4.1.2 + dayjs: 1.11.7 + glob: 7.2.3 + lodash: 4.17.21 + memoizee: 0.4.15 + mock.js: 0.2.0 + mockjs: 1.1.0 + node-fetch: 2.6.11 + nunjucks: 3.2.4 + openapi3-ts: 2.0.2 + prettier: 2.8.8 + reserved-words: 0.1.2 + rimraf: 3.0.2 + swagger2openapi: 7.0.8 + tiny-pinyin: 1.3.2 + transitivePeerDependencies: + - chokidar + - encoding + - postcss-jsx + - postcss-markdown + - supports-color + dev: true + + /@umijs/plugin-run@4.0.69: + resolution: {integrity: sha512-GzdbWdTUZt4/ZtxOn7AdPffrLXIaBp6ZiT5zJIugRuWnKLwJyNSmrAy1iD3ks4ZyEGfAqRd9Ou0Q+clmLGR7FA==} + dependencies: + tsx: 3.12.7 + dev: true + + /@umijs/plugins@4.0.59(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Sa0CI09Ewu1r4p+CQxMpCf6HYjaAVf2OtvW7z3J5CLe7hDo45KQ5/9iYKCXV5GEoSVXvYkiDJyDjCerEkfU/gw==} + dependencies: + '@ahooksjs/use-request': 2.8.15(react@18.2.0) + '@ant-design/antd-theme-variable': 1.0.0 + '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-components': 2.4.16(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.29.11(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-devtools': 4.29.11(@tanstack/react-query@4.29.11)(react-dom@18.2.0)(react@18.2.0) + '@umijs/bundler-utils': 4.0.59 + '@umijs/valtio': 1.0.3(react@18.2.0) + antd-dayjs-webpack-plugin: 1.0.6(dayjs@1.11.7) + axios: 0.27.2 + babel-plugin-import: 1.13.6 + dayjs: 1.11.7 + dva-core: 2.0.4(redux@4.2.1) + dva-immer: 1.0.1(dva@2.5.0-beta.2) + dva-loading: 3.0.24(dva-core@2.0.4) + event-emitter: 0.3.5 + fast-deep-equal: 3.1.3 + intl: 1.2.5 + lodash: 4.17.21 + moment: 2.29.4 + qiankun: 2.10.8 + react-intl: 3.12.1(react@18.2.0) + react-redux: 8.0.5(@types/react-dom@18.2.4)(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + redux: 4.2.1 + styled-components: 6.0.0-beta.9(react-dom@18.2.0)(react@18.2.0)(tslib@2.5.2) + tslib: 2.5.2 + warning: 4.0.3 + transitivePeerDependencies: + - '@types/lodash.merge' + - '@types/react' + - '@types/react-dom' + - antd + - babel-plugin-styled-components + - debug + - dva + - prop-types + - rc-field-form + - react + - react-dom + - react-native + - shallowequal + - stylis + - supports-color + dev: true + + /@umijs/plugins@4.0.69(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@4.24.10)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tPDO816TFrE+UJ1293n+TytSGw53VexP6pZREPTwKZNdHgAgV/WdnKV0rsWsyUouiDXXbFCPwnoc1HNK+ve34w==} + dependencies: + '@ahooksjs/use-request': 2.8.15(react@18.2.0) + '@ant-design/antd-theme-variable': 1.0.0 + '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0) + '@ant-design/moment-webpack-plugin': 0.0.3 + '@ant-design/pro-components': 2.4.16(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.29.11(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-devtools': 4.29.11(@tanstack/react-query@4.29.11)(react-dom@18.2.0)(react@18.2.0) + '@umijs/bundler-utils': 4.0.69 + '@umijs/valtio': 1.0.3(react@18.2.0) + antd-dayjs-webpack-plugin: 1.0.6(dayjs@1.11.7) + axios: 0.27.2 + babel-plugin-import: 1.13.6 + dayjs: 1.11.7 + dva-core: 2.0.4(redux@4.2.1) + dva-immer: 1.0.1(dva@2.5.0-beta.2) + dva-loading: 3.0.24(dva-core@2.0.4) + event-emitter: 0.3.5 + fast-deep-equal: 3.1.3 + intl: 1.2.5 + lodash: 4.17.21 + moment: 2.29.4 + qiankun: 2.10.8 + react-intl: 3.12.1(react@18.2.0) + react-redux: 8.0.5(@types/react-dom@18.2.4)(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + redux: 4.2.1 + styled-components: 6.0.0-rc.0(react-dom@18.2.0)(react@18.2.0) + tslib: 2.5.2 + warning: 4.0.3 + transitivePeerDependencies: + - '@types/lodash.merge' + - '@types/react' + - '@types/react-dom' + - antd + - babel-plugin-styled-components + - debug + - dva + - prop-types + - rc-field-form + - react + - react-dom + - react-native + - supports-color + dev: true + + /@umijs/plugins@4.0.69(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tPDO816TFrE+UJ1293n+TytSGw53VexP6pZREPTwKZNdHgAgV/WdnKV0rsWsyUouiDXXbFCPwnoc1HNK+ve34w==} + dependencies: + '@ahooksjs/use-request': 2.8.15(react@18.2.0) + '@ant-design/antd-theme-variable': 1.0.0 + '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0) + '@ant-design/moment-webpack-plugin': 0.0.3 + '@ant-design/pro-components': 2.4.16(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.29.11(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-devtools': 4.29.11(@tanstack/react-query@4.29.11)(react-dom@18.2.0)(react@18.2.0) + '@umijs/bundler-utils': 4.0.69 + '@umijs/valtio': 1.0.3(react@18.2.0) + antd-dayjs-webpack-plugin: 1.0.6(dayjs@1.11.7) + axios: 0.27.2 + babel-plugin-import: 1.13.6 + dayjs: 1.11.7 + dva-core: 2.0.4(redux@4.2.1) + dva-immer: 1.0.1(dva@2.5.0-beta.2) + dva-loading: 3.0.24(dva-core@2.0.4) + event-emitter: 0.3.5 + fast-deep-equal: 3.1.3 + intl: 1.2.5 + lodash: 4.17.21 + moment: 2.29.4 + qiankun: 2.10.8 + react-intl: 3.12.1(react@18.2.0) + react-redux: 8.0.5(@types/react-dom@18.2.4)(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + redux: 4.2.1 + styled-components: 6.0.0-rc.0(react-dom@18.2.0)(react@18.2.0) + tslib: 2.5.2 + warning: 4.0.3 + transitivePeerDependencies: + - '@types/lodash.merge' + - '@types/react' + - '@types/react-dom' + - antd + - babel-plugin-styled-components + - debug + - dva + - prop-types + - rc-field-form + - react + - react-dom + - react-native + - supports-color + dev: true + + /@umijs/preset-umi@4.0.69(@types/node@20.2.5)(@types/react@18.2.7)(postcss@8.4.24)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-W/Olv2ldPtGnPa+mbsFZwoyEhykCcWTbkmowf/4AewHe0n5CJEyqjeo1cOlD7fr8RbpIqzoxdlMrlMi/bBqbNQ==} + dependencies: + '@iconify/utils': 2.1.1 + '@svgr/core': 6.5.1 + '@umijs/ast': 4.0.69 + '@umijs/babel-preset-umi': 4.0.69(styled-components@5.3.11) + '@umijs/bundler-utils': 4.0.69 + '@umijs/bundler-vite': 4.0.69(@types/node@20.2.5)(postcss@8.4.24) + '@umijs/bundler-webpack': 4.0.69(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1) + '@umijs/core': 4.0.69 + '@umijs/did-you-know': 1.0.3 + '@umijs/es-module-parser': 0.0.7 + '@umijs/history': 5.3.1 + '@umijs/mfsu': 4.0.69 + '@umijs/plugin-run': 4.0.69 + '@umijs/renderer-react': 4.0.69(react-dom@18.1.0)(react@18.1.0) + '@umijs/server': 4.0.69 + '@umijs/ui': 3.0.1 + '@umijs/utils': 4.0.69 + '@umijs/zod2ts': 4.0.69 + babel-plugin-dynamic-import-node: 2.3.3 + click-to-react-component: 1.0.8(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0) + core-js: 3.28.0 + current-script-polyfill: 1.0.0 + enhanced-resolve: 5.9.3 + fast-glob: 3.2.12 + html-webpack-plugin: 5.5.0(webpack@5.84.1) + path-to-regexp: 1.7.0 + postcss-prefix-selector: 1.16.0(postcss@8.4.24) + react: 18.1.0 + react-dom: 18.1.0(react@18.1.0) + react-router: 6.3.0(react@18.1.0) + react-router-dom: 6.3.0(react-dom@18.1.0)(react@18.1.0) + regenerator-runtime: 0.13.11 + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - '@types/webpack' + - postcss + - rollup + - sass + - sockjs-client + - styled-components + - stylus + - sugarss + - supports-color + - terser + - type-fest + - typescript + - webpack + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /@umijs/renderer-react@4.0.69(react-dom@18.1.0)(react@18.1.0): + resolution: {integrity: sha512-7jD97cXoesulvqESJipTV3KJ0eEvtp94Kk/nUH82vYysHQlCS+P/WeWXqKo7nC4fvDCDGMz4aUV16r6Is7ZL8A==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@babel/runtime': 7.21.0 + '@loadable/component': 5.15.2(react@18.1.0) + history: 5.3.0 + react: 18.1.0 + react-dom: 18.1.0(react@18.1.0) + react-helmet-async: 1.3.0(react-dom@18.1.0)(react@18.1.0) + react-router-dom: 6.3.0(react-dom@18.1.0)(react@18.1.0) + dev: true + + /@umijs/renderer-react@4.0.69(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7jD97cXoesulvqESJipTV3KJ0eEvtp94Kk/nUH82vYysHQlCS+P/WeWXqKo7nC4fvDCDGMz4aUV16r6Is7ZL8A==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@babel/runtime': 7.21.0 + '@loadable/component': 5.15.2(react@18.2.0) + history: 5.3.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + react-router-dom: 6.3.0(react-dom@18.2.0)(react@18.2.0) + dev: true + + /@umijs/request-record@1.1.4(umi@4.0.69): + resolution: {integrity: sha512-GFfAxgqbOMlhFpqGLNxizA4ywmPK+mxfJ53IdBw1IDd2Vzp5qLzlelbx0X1X+2v4dh9KE57YtjT9H7us66uw7Q==} + peerDependencies: + umi: '>=3' + dependencies: + chokidar: 3.5.3 + express: 4.18.2 + lodash: 4.17.21 + prettier: 2.8.8 + umi: 4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react@18.2.7)(eslint@8.41.0)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2)(webpack@5.84.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@umijs/route-utils@2.2.2: + resolution: {integrity: sha512-cMk6qizy0pfpiwpVCvNQB0BKBUJEH33pDv5q5k2tSleSDw2abkJkTu2Kd5hKzoESLuFK43oGeOfcplZqm2bRxw==} + dependencies: + '@qixian.cs/path-to-regexp': 6.1.0 + fast-deep-equal: 3.1.3 + lodash.isequal: 4.5.0 + memoize-one: 5.2.1 + dev: false + + /@umijs/route-utils@4.0.1: + resolution: {integrity: sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ==} + + /@umijs/server@4.0.69: + resolution: {integrity: sha512-znL4i6XC1dLmDCHk7fw3cKlehB4qKUqJeIao6j/eSzlfm6mCFzygsGqxzN8obrjCV0ohe/F/4WIRJDkEqwHleQ==} + dependencies: + '@umijs/bundler-utils': 4.0.69 + history: 5.3.0 + react: 18.1.0 + react-dom: 18.1.0(react@18.1.0) + react-router-dom: 6.3.0(react-dom@18.1.0)(react@18.1.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@umijs/test@4.0.69(@babel/core@7.22.1): + resolution: {integrity: sha512-xkTNawfhz2xC0qqR2Q+JDJPoLNosSBNDAuna86YxNZK/WCvJ7n3/jehz2l9S6wxmstDW06yrXNM+IPoipUBAmg==} + dependencies: + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.22.1) + '@jest/types': 27.5.1 + '@umijs/bundler-utils': 4.0.69 + '@umijs/utils': 4.0.69 + babel-jest: 29.5.0(@babel/core@7.22.1) + esbuild: 0.16.17 + identity-obj-proxy: 3.0.0 + isomorphic-unfetch: 4.0.2 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true + + /@umijs/ui@3.0.1: + resolution: {integrity: sha512-zcz37AJH0xt/6XVVbyO/hmsK9Hq4vH23HZ4KYVi5A8rbM9KeJkJigTS7ELOdArawZhVNGe+h3a5Oixs4a2QsWw==} + dev: true + + /@umijs/use-params@1.0.9(react@18.2.0): + resolution: {integrity: sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + + /@umijs/utils@4.0.59: + resolution: {integrity: sha512-NLRoZArsQArQyzIM/I3isWlRAYSpEh8lQ4JTqdIZQmyjRlNw1Lp80kDxlTcsmEpEa3ZkpHKKZNLJNpI99JdqTA==} + dependencies: + chokidar: 3.5.3 + pino: 7.11.0 + dev: true + + /@umijs/utils@4.0.69: + resolution: {integrity: sha512-lLUsceXtNWBFb+A6/Sw/BRBrBCJMGCurkkuwFsPjVxuiHtJrI3X7RBUMH0uFilhG78dhQdHGN2tc+NH7Z1YXKw==} + dependencies: + chokidar: 3.5.3 + pino: 7.11.0 + dev: true + + /@umijs/valtio@1.0.3(react@18.2.0): + resolution: {integrity: sha512-fjr1UMZLFOO+uy5YtLVcmvr+m2ZlU9rp04yXlCaPrKkdBg/UNPBVo6YS9TBx2v0a62gYaztLL3Put3dcNGH5tQ==} + dependencies: + valtio: 1.9.0(react@18.2.0) + transitivePeerDependencies: + - react + dev: true + + /@umijs/zod2ts@4.0.69: + resolution: {integrity: sha512-whXJSz9vm8cuU+qUSGtcacuPGUG7Vp2yv1fiJ726mukb/bJS4uG/3tcCOOlkztV5cvkRB4QtZ6IEMaqvxtt7xw==} + dev: true + + /@vitejs/plugin-react@4.0.0(vite@4.3.1): + resolution: {integrity: sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.22.1) + '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.22.1) + react-refresh: 0.14.0 + vite: 4.3.1(@types/node@20.2.5)(less@4.1.3) + transitivePeerDependencies: + - supports-color + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /a-sync-waterfall@1.0.1: + resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-globals@7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + dependencies: + acorn: 8.8.2 + acorn-walk: 8.2.0 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.8.2): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.8.2 + + /acorn-jsx@5.3.2(acorn@7.4.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + + /acorn-jsx@5.3.2(acorn@8.8.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /add-dom-event-listener@1.1.0: + resolution: {integrity: sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==} + dependencies: + object-assign: 4.1.1 + + /address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + dev: false + + /agent-base@4.3.0: + resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} + engines: {node: '>= 4.0.0'} + dependencies: + es6-promisify: 5.0.0 + dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ahooks-v3-count@1.0.0: + resolution: {integrity: sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ==} + dev: true + + /ahooks@3.7.7(react@18.2.0): + resolution: {integrity: sha512-5e5WlPq81Y84UnTLOKIQeq2cJw4aa7yj8fR2Nb/oMmXPrWMjIMCbPS1o+fpxSfCaNA3AzOnnMc8AehWRZltkJQ==} + engines: {node: '>=8.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.22.3 + '@types/js-cookie': 2.2.7 + ahooks-v3-count: 1.0.0 + dayjs: 1.11.7 + intersection-observer: 0.12.2 + js-cookie: 2.2.1 + lodash: 4.17.21 + react: 18.2.0 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.5.2 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /antd-dayjs-webpack-plugin@1.0.6(dayjs@1.11.7): + resolution: {integrity: sha512-UlK3BfA0iE2c5+Zz/Bd2iPAkT6cICtrKG4/swSik5MZweBHtgmu1aUQCHvICdiv39EAShdZy/edfP6mlkS/xXg==} + peerDependencies: + dayjs: '*' + dependencies: + dayjs: 1.11.7 + dev: true + + /antd-mobile-alita@2.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MlCFwuXQRAzifBEuhari4Jf9nbvsiyrm7HJvoGVMkjXKXk8PaaTJL6hTo7UwI3uD/CFeTxhW9X27Z8sd65J4fw==} + dependencies: + array-tree-filter: 2.1.0 + babel-runtime: 6.26.0 + classnames: 2.3.2 + normalize.css: 7.0.0 + rc-checkbox: 2.0.3 + rc-collapse: 1.9.3(react-dom@18.2.0)(react@18.2.0) + rc-slider: 8.2.0(react-dom@18.2.0)(react@18.2.0) + rc-swipeout: 2.0.11 + rmc-calendar: 1.1.4(react-dom@18.2.0)(react@18.2.0) + rmc-cascader: 5.0.3(react-dom@18.2.0)(react@18.2.0) + rmc-date-picker: 6.0.10(react-dom@18.2.0)(react@18.2.0) + rmc-dialog: 1.1.1(react-dom@18.2.0)(react@18.2.0) + rmc-drawer: 0.4.11 + rmc-feedback: 2.0.0 + rmc-input-number: 1.0.5 + rmc-list-view: 0.11.5 + rmc-notification: 1.0.0(react-dom@18.2.0)(react@18.2.0) + rmc-nuka-carousel: 3.0.1 + rmc-picker: 5.0.10(react-dom@18.2.0)(react@18.2.0) + rmc-pull-to-refresh: 1.0.13 + rmc-steps: 1.0.1 + rmc-tabs: 1.2.29 + rmc-tooltip: 1.0.1(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /antd-mobile-icons@0.2.2: + resolution: {integrity: sha512-iquIc7EsQTndk5nMv9pQQv+/OY5YnjVIPhtCFo7W7JL+Gjqzq/YJ/HO2WxUxyCgYha2NsTTNAb2vPa/M4zAi2g==} + dev: true + + /antd@4.24.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-GihdwTGFW0dUaWjcvSIfejFcT63HjEp2EbYd+ojEXayldhey230KrHDJ+C53rkrkzLvymrPBfSxlLxJzyFIZsg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0) + '@ant-design/react-slick': 0.29.2(react@18.2.0) + '@babel/runtime': 7.22.3 + '@ctrl/tinycolor': 3.6.0 + classnames: 2.3.2 + copy-to-clipboard: 3.3.3 + lodash: 4.17.21 + moment: 2.29.4 + rc-cascader: 3.7.2(react-dom@18.2.0)(react@18.2.0) + rc-checkbox: 3.0.1(react-dom@18.2.0)(react@18.2.0) + rc-collapse: 3.4.2(react-dom@18.2.0)(react@18.2.0) + rc-dialog: 9.0.2(react-dom@18.2.0)(react@18.2.0) + rc-drawer: 6.1.6(react-dom@18.2.0)(react@18.2.0) + rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0) + rc-field-form: 1.27.4(react-dom@18.2.0)(react@18.2.0) + rc-image: 5.13.0(react-dom@18.2.0)(react@18.2.0) + rc-input: 0.1.4(react-dom@18.2.0)(react@18.2.0) + rc-input-number: 7.3.11(react-dom@18.2.0)(react@18.2.0) + rc-mentions: 1.13.1(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-notification: 4.6.1(react-dom@18.2.0)(react@18.2.0) + rc-pagination: 3.2.0(react-dom@18.2.0)(react@18.2.0) + rc-picker: 2.7.2(react-dom@18.2.0)(react@18.2.0) + rc-progress: 3.4.1(react-dom@18.2.0)(react@18.2.0) + rc-rate: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-segmented: 2.1.2(react-dom@18.2.0)(react@18.2.0) + rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0) + rc-slider: 10.0.1(react-dom@18.2.0)(react@18.2.0) + rc-steps: 5.0.0(react-dom@18.2.0)(react@18.2.0) + rc-switch: 3.2.2(react-dom@18.2.0)(react@18.2.0) + rc-table: 7.26.0(react-dom@18.2.0)(react@18.2.0) + rc-tabs: 12.5.10(react-dom@18.2.0)(react@18.2.0) + rc-textarea: 0.4.7(react-dom@18.2.0)(react@18.2.0) + rc-tooltip: 5.2.2(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0) + rc-tree-select: 5.5.5(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-upload: 4.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scroll-into-view-if-needed: 2.2.31 + dev: true + + /antd@5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-H9vPVGQ/8fT9Zidl4fzMSVAOCDIe/ZQtiU2hDzrN2tqAbaxOet+1HqfoKv7dfy+e0ttKIFvs6Y2yWw/ign1MwQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@ant-design/colors': 7.0.0 + '@ant-design/cssinjs': 1.9.1(react-dom@18.2.0)(react@18.2.0) + '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0) + '@ant-design/react-slick': 1.0.1(react@18.2.0) + '@babel/runtime': 7.22.3 + '@ctrl/tinycolor': 3.6.0 + '@rc-component/color-picker': 1.1.1(react-dom@18.2.0)(react@18.2.0) + '@rc-component/mutate-observer': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@rc-component/tour': 1.8.0(react-dom@18.2.0)(react@18.2.0) + '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + copy-to-clipboard: 3.3.3 + dayjs: 1.11.7 + qrcode.react: 3.1.0(react@18.2.0) + rc-cascader: 3.12.0(react-dom@18.2.0)(react@18.2.0) + rc-checkbox: 3.0.1(react-dom@18.2.0)(react@18.2.0) + rc-collapse: 3.5.2(react-dom@18.2.0)(react@18.2.0) + rc-dialog: 9.1.0(react-dom@18.2.0)(react@18.2.0) + rc-drawer: 6.1.6(react-dom@18.2.0)(react@18.2.0) + rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0) + rc-field-form: 1.31.0(react-dom@18.2.0)(react@18.2.0) + rc-image: 5.16.0(react-dom@18.2.0)(react@18.2.0) + rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0) + rc-input-number: 7.4.2(react-dom@18.2.0)(react@18.2.0) + rc-mentions: 2.2.0(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-notification: 5.0.4(react-dom@18.2.0)(react@18.2.0) + rc-pagination: 3.4.2(react-dom@18.2.0)(react@18.2.0) + rc-picker: 3.7.6(dayjs@1.11.7)(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + rc-progress: 3.4.1(react-dom@18.2.0)(react@18.2.0) + rc-rate: 2.10.0(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-segmented: 2.2.2(react-dom@18.2.0)(react@18.2.0) + rc-select: 14.5.1(react-dom@18.2.0)(react@18.2.0) + rc-slider: 10.1.1(react-dom@18.2.0)(react@18.2.0) + rc-steps: 6.0.0(react-dom@18.2.0)(react@18.2.0) + rc-switch: 4.1.0(react-dom@18.2.0)(react@18.2.0) + rc-table: 7.32.1(react-dom@18.2.0)(react@18.2.0) + rc-tabs: 12.6.0(react-dom@18.2.0)(react@18.2.0) + rc-textarea: 1.2.3(react-dom@18.2.0)(react@18.2.0) + rc-tooltip: 6.0.1(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0) + rc-tree-select: 5.9.0(react-dom@18.2.0)(react@18.2.0) + rc-upload: 4.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scroll-into-view-if-needed: 3.0.10 + throttle-debounce: 5.0.0 + transitivePeerDependencies: + - date-fns + - luxon + - moment + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.5.2 + dev: true + + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.1 + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + + /array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + + /array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + dependencies: + array-uniq: 1.0.3 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /asap@1.0.0: + resolution: {integrity: sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true + + /asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: true + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /assert@1.5.0: + resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} + dependencies: + object-assign: 4.1.1 + util: 0.10.3 + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + dev: true + + /async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + /async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: true + + /autoprefixer@10.4.14(postcss@8.4.24): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.6 + caniuse-lite: 1.0.30001489 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /autoprefixer@9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} + hasBin: true + dependencies: + browserslist: 4.21.6 + caniuse-lite: 1.0.30001489 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + picocolors: 0.2.1 + postcss: 7.0.39 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + dev: true + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: true + + /babel-jest@29.5.0(@babel/core@7.22.1): + resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.22.1 + '@jest/transform': 29.5.0 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.5.0(@babel/core@7.22.1) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.4 + dev: true + + /babel-plugin-import@1.13.6: + resolution: {integrity: sha512-N7FYnGh0DFsvDRkAPsvFq/metVfVD7P2h1rokOPpEH4cZbdRHCW+2jbXt0nnuqowkm/xhh2ww1anIdEpfYa7ZA==} + dependencies: + '@babel/helper-module-imports': 7.21.4 + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.21.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.5.0: + resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.21.9 + '@babel/types': 7.22.3 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.0 + dev: true + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.22.3 + cosmiconfig: 7.1.0 + resolve: 1.22.2 + dev: false + + /babel-plugin-polyfill-corejs2@0.4.3(@babel/core@7.22.1): + resolution: {integrity: sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.3 + '@babel/core': 7.22.1 + '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1) + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.8.1(@babel/core@7.22.1): + resolution: {integrity: sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1) + core-js-compat: 3.30.2 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.0(@babel/core@7.22.1): + resolution: {integrity: sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-styled-components@2.1.1(styled-components@5.3.11): + resolution: {integrity: sha512-c8lJlszObVQPguHkI+akXv8+Jgb9Ccujx0EetL7oIvwU100LxO6XAGe45qry37wUL40a5U9f23SYrivro2XKhA==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.21.4 + babel-plugin-syntax-jsx: 6.18.0 + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.11(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + dev: true + + /babel-plugin-styled-components@2.1.3(styled-components@5.3.11): + resolution: {integrity: sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.21.4 + babel-plugin-syntax-jsx: 6.18.0 + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.11(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + dev: true + + /babel-plugin-syntax-jsx@6.18.0: + resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.1): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.1) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.1) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.1) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.1) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.1) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.1) + dev: true + + /babel-preset-jest@29.5.0(@babel/core@7.22.1): + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.1 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.1) + dev: true + + /babel-runtime-jsx-plus@0.1.5: + resolution: {integrity: sha512-5qjZDfUzZGxHgX8o0tkS9o0HbyBvnUuaAtqHC9IN5CgjWFGJBg6a0Xp31wiG7btiHV0dP5t1t8cthlTCYwtnig==} + dev: true + + /babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + dev: true + + /babel-types@6.26.0: + resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==} + dependencies: + babel-runtime: 6.26.0 + esutils: 2.0.3 + lodash: 4.17.21 + to-fast-properties: 1.0.3 + dev: true + + /bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /blink-diff@1.0.13: + resolution: {integrity: sha512-2hIEnGq8wruXfje9GvDV41VXo+4YdjrjL5ZMlVJT3Wi5k1jjz20fCTlVejSXoERirhEVsFYz9NmgdUYgQ41Giw==} + hasBin: true + dependencies: + pngjs-image: 0.11.7 + preceptor-core: 0.10.1 + promise: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.0.1 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: true + + /browserify-sign@4.2.1: + resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + + /browserslist@4.21.6: + resolution: {integrity: sha512-PF07dKGXKR+/bljJzCB6rAYtHEu21TthLxmJagtQizx+rwiqdRDBO5971Xu1N7MgcMLi4+mr4Cnl76x7O3DHtA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001489 + electron-to-chromium: 1.4.411 + node-releases: 2.0.12 + update-browserslist-db: 1.0.11(browserslist@4.21.6) + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + + /buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.5.2 + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: true + + /caniuse-lite@1.0.30001489: + resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} + + /carlo@0.9.46: + resolution: {integrity: sha512-FwZ/wxjqe+5RgzF2SRsPSWsVB9+McAVRWW0tRkmbh7fBjrf3HFZZbcr8vr61p1K+NBaAPv57DRjxgIyfbHmd7g==} + engines: {node: '>=7.6.0'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + puppeteer-core: 1.12.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true + + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true + + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /cjs-module-lexer@1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + + /clean-css@5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /click-to-react-component@1.0.8(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0): + resolution: {integrity: sha512-YBNYOp00udy+NBEnUmM/3Df0Yco1iHNQ8k0ltlJVcDYK9AuYt14xPoJicBh/BokLqbzkci1p+pbdY5r4JXZC4g==} + peerDependencies: + react: '>=16.8.0' + dependencies: + '@floating-ui/react-dom-interactions': 0.3.1(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0) + htm: 3.1.1 + react: 18.1.0 + react-merge-refs: 1.1.0 + transitivePeerDependencies: + - '@types/react' + - react-dom + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-regexp@2.2.0: + resolution: {integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==} + engines: {node: '>=6'} + dependencies: + is-regexp: 2.1.0 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage@1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + dev: true + + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /component-classes@1.2.6: + resolution: {integrity: sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==} + dependencies: + component-indexof: 0.0.3 + dev: true + + /component-indexof@0.0.3: + resolution: {integrity: sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==} + dev: true + + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + dev: true + + /compute-scroll-into-view@3.0.3: + resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + + /console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + dev: true + + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + dev: true + + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.11 + dev: true + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + + /core-js-compat@3.30.2: + resolution: {integrity: sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==} + dependencies: + browserslist: 4.21.6 + dev: true + + /core-js-pure@3.30.2: + resolution: {integrity: sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==} + requiresBuild: true + dev: true + + /core-js@1.2.7: + resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + dev: true + + /core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: true + + /core-js@3.28.0: + resolution: {integrity: sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==} + requiresBuild: true + dev: true + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + + /cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /create-react-class@15.7.0: + resolution: {integrity: sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-port-killer@1.4.0: + resolution: {integrity: sha512-ujqfftKsSeorFMVI6JP25xMBixHEaDWVK+NarRZAGnJjR5AhebRQU+g+k/Lj8OHwM6f+wrrs8u5kkCdI7RLtxQ==} + hasBin: true + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.1 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + + /css-animation@1.6.1: + resolution: {integrity: sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==} + dependencies: + babel-runtime: 6.26.0 + component-classes: 1.2.6 + dev: true + + /css-blank-pseudo@3.0.3(postcss@8.4.24): + resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + dev: true + + /css-functions-list@3.1.0: + resolution: {integrity: sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==} + engines: {node: '>=12.22'} + dev: true + + /css-has-pseudo@3.0.4(postcss@8.4.24): + resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /css-loader@6.7.1(webpack@5.84.1): + resolution: {integrity: sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.24) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.24) + postcss-modules-scope: 3.0.0(postcss@8.4.24) + postcss-modules-values: 4.0.0(postcss@8.4.24) + postcss-value-parser: 4.2.0 + semver: 7.5.1 + webpack: 5.84.1 + dev: true + + /css-prefers-color-scheme@6.0.3(postcss@8.4.24): + resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.24 + dev: true + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: true + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssdb@6.6.3: + resolution: {integrity: sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /current-script-polyfill@1.0.0: + resolution: {integrity: sha512-qv8s+G47V6Hq+g2kRE5th+ASzzrL7b6l+tap1DHKK25ZQJv3yIFhH96XaQ7NGL+zRW3t/RDbweJf/dJDe5Z5KA==} + dev: true + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: true + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: true + + /data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.22.3 + dev: true + + /date-format@0.0.0: + resolution: {integrity: sha512-kAmAdtsjW5nQ02FERwI1bP4xe6HQBPwy5kpAF4CRSLOMUs/vgMIEEwpy6JqUs7NitTyhZiImxwAjgPpnteycHg==} + deprecated: 0.x is no longer supported. Please upgrade to 4.x or higher. + dev: true + + /dayjs@1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + + /debug@0.7.4: + resolution: {integrity: sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4(supports-color@5.5.0): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-equal@2.2.1: + resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.1 + is-arguments: 1.1.1 + is-array-buffer: 3.0.2 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.9 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.1.1 + titleize: 3.0.0 + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /des.js@1.0.1: + resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + dev: true + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /detect-newline@4.0.0: + resolution: {integrity: sha512-1aXUEPdfGdzVPFpzGJJNgq9o81bGg1s09uxTWsqBlo9PI332uyJRQq13+LK/UN4JfxJbFdCXonUFQ9R/p7yCtw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + + /detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true + dependencies: + address: 1.2.2 + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + dev: false + + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: true + + /dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + + /dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + dev: true + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: true + + /domain-browser@1.2.0: + resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} + engines: {node: '>=0.4', npm: '>=1.2'} + dev: true + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + dependencies: + webidl-conversions: 7.0.0 + dev: true + + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.2 + dev: true + + /dotenv@8.6.0: + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} + dev: true + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: false + + /duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.1 + dev: true + + /dva-core@1.5.0-beta.2(redux@3.7.2): + resolution: {integrity: sha512-xmtr/J63EZXBdVXNBW+QCD7p9CaE8kAo2U1faRyv3PIGcy0G3Y6IBDNtoBB/Cj3nzk/jvX0dv96Hnh1kpSnI7Q==} + peerDependencies: + redux: 3.x + dependencies: + '@babel/runtime': 7.22.3 + flatten: 1.0.3 + global: 4.4.0 + invariant: 2.2.4 + is-plain-object: 2.0.4 + redux: 3.7.2 + redux-saga: 0.16.2 + warning: 3.0.0 + dev: true + + /dva-core@2.0.4(redux@3.7.2): + resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==} + peerDependencies: + redux: 4.x + dependencies: + '@babel/runtime': 7.22.3 + flatten: 1.0.3 + global: 4.4.0 + invariant: 2.2.4 + is-plain-object: 2.0.4 + redux: 3.7.2 + redux-saga: 0.16.2 + warning: 3.0.0 + dev: true + + /dva-core@2.0.4(redux@4.2.1): + resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==} + peerDependencies: + redux: 4.x + dependencies: + '@babel/runtime': 7.22.3 + flatten: 1.0.3 + global: 4.4.0 + invariant: 2.2.4 + is-plain-object: 2.0.4 + redux: 4.2.1 + redux-saga: 0.16.2 + warning: 3.0.0 + dev: true + + /dva-immer@1.0.1(dva@2.5.0-beta.2): + resolution: {integrity: sha512-Oe+yFTtu2UMNcMoBLLTa/ms1RjUry38Yf0ClN8LiHbF+gT2QAdLYLk3miu1dDtm3Sxl9nk+DH1edKX0Hy49uQg==} + peerDependencies: + dva: ^2.5.0-0 + dependencies: + '@babel/runtime': 7.22.3 + dva: 2.5.0-beta.2(react-dom@18.2.0)(react@18.2.0) + immer: 8.0.4 + dev: true + + /dva-loading@3.0.24(dva-core@2.0.4): + resolution: {integrity: sha512-3j4bmuXOYH93xe+CC//z3Si8XMx6DLJveep+UbzKy0jhA7oQrCCZTdKxu0UPYXeAMYXpCO25pG4JOnVhzmC7ug==} + peerDependencies: + dva-core: ^1.1.0 || ^1.5.0-0 || ^1.6.0-0 + dependencies: + '@babel/runtime': 7.22.3 + dva-core: 2.0.4(redux@4.2.1) + dev: true + + /dva@2.5.0-beta.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kc2+CHhF1cNIU3Rg1miMhHgOKJ/VDrq9d6ynVBZf1EN2YKWU3MVFq/uTTBqMr2qkR0m9f8VKHOFmfKLtfMI93Q==} + peerDependencies: + react: 15.x || ^16.0.0-0 + react-dom: 15.x || ^16.0.0-0 + dependencies: + '@babel/runtime': 7.22.3 + '@types/isomorphic-fetch': 0.0.34 + '@types/react-router-dom': 4.3.5 + '@types/react-router-redux': 5.0.22 + dva-core: 1.5.0-beta.2(redux@3.7.2) + global: 4.4.0 + history: 4.10.1 + invariant: 2.2.4 + isomorphic-fetch: 2.2.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-redux: 5.1.2(react@18.2.0)(redux@3.7.2) + react-router-dom: 4.3.1(react@18.2.0) + react-router-redux: 5.0.0-alpha.9(react@18.2.0) + redux: 3.7.2 + dev: true + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-to-chromium@1.4.411: + resolution: {integrity: sha512-5VXLW4Qw89vM2WTICHua/y8v7fKGDRVa2VPOtBB9IpLvW316B+xd8yD1wTmLPY2ot/00P/qt87xdolj4aG/Lzg==} + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /email-addresses@3.1.0: + resolution: {integrity: sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==} + dev: true + + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /enhanced-resolve@5.14.1: + resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /enhanced-resolve@5.9.3: + resolution: {integrity: sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: true + optional: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + dev: true + + /es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + + /es-module-lexer@1.2.1: + resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es5-imcompatible-versions@0.1.82: + resolution: {integrity: sha512-Y4vitTOiUyvIHPMcj6yrLaS2Un1SLlH9opeHZmpF68e8CFL173XeDkSA2UOVnDDB9WRi2+wztzbcIXRhIeQVnA==} + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + + /es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: true + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: true + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /esbuild@0.16.17: + resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 + dev: true + + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-ast-utils@1.1.0: + resolution: {integrity: sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==} + engines: {node: '>=4'} + dependencies: + lodash.get: 4.4.2 + lodash.zip: 4.2.0 + dev: true + + /eslint-config-prettier@8.8.0(eslint@7.32.0): + resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 7.32.0 + dev: true + + /eslint-formatter-pretty@4.1.0: + resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==} + engines: {node: '>=10'} + dependencies: + '@types/eslint': 7.29.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + eslint-rule-docs: 1.1.235 + log-symbols: 4.1.0 + plur: 4.0.0 + string-width: 4.2.3 + supports-hyperlinks: 2.3.0 + dev: true + + /eslint-plugin-babel@5.3.1(eslint@7.32.0): + resolution: {integrity: sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==} + engines: {node: '>=4'} + peerDependencies: + eslint: '>=4.0.0' + dependencies: + eslint: 7.32.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.59.7)(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==} + engines: {node: '>=10'} + peerDependencies: + '@typescript-eslint/eslint-plugin': '>= 4' + eslint: '>=5' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5) + eslint: 7.32.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.35.0)(jest@29.5.0)(typescript@5.0.2): + resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.35.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.59.7(eslint@8.35.0)(typescript@5.0.2) + eslint: 8.35.0 + jest: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.41.0)(jest@29.5.0)(typescript@5.0.2): + resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.41.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.59.7(eslint@8.41.0)(typescript@5.0.2) + eslint: 8.41.0 + jest: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-promise@6.1.1(eslint@7.32.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 7.32.0 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@7.32.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 7.32.0 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.35.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.35.0 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.41.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.41.0 + dev: true + + /eslint-plugin-react@7.32.2(eslint@7.32.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 7.32.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.0 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-plugin-react@7.32.2(eslint@8.35.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.35.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.0 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-plugin-react@7.32.2(eslint@8.41.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.41.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.0 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-plugin-unicorn@20.1.0(eslint@7.32.0): + resolution: {integrity: sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA==} + engines: {node: '>=10'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + ci-info: 2.0.0 + clean-regexp: 1.0.0 + eslint: 7.32.0 + eslint-ast-utils: 1.1.0 + eslint-template-visitor: 2.3.2(eslint@7.32.0) + eslint-utils: 2.1.0 + import-modules: 2.1.0 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + reserved-words: 0.1.2 + safe-regex: 2.1.1 + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + + /eslint-rule-docs@1.1.235: + resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-template-visitor@2.3.2(eslint@7.32.0): + resolution: {integrity: sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + '@babel/core': 7.22.1 + '@babel/eslint-parser': 7.21.8(@babel/core@7.22.1)(eslint@7.32.0) + eslint: 7.32.0 + eslint-visitor-keys: 2.1.0 + esquery: 1.5.0 + multimap: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@7.32.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.35.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.35.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.41.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.41.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@7.32.0: + resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} + engines: {node: ^10.12.0 || >=12.0.0} + hasBin: true + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.3 + '@humanwhocodes/config-array': 0.5.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + doctrine: 3.0.0 + enquirer: 2.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.1.0 + espree: 7.3.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.20.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.5.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + table: 6.8.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint@8.35.0: + resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 2.0.3 + '@eslint/js': 8.35.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-utils: 3.0.0(eslint@8.35.0) + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint@8.41.0: + resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) + '@eslint-community/regexpp': 4.5.1 + '@eslint/eslintrc': 2.0.3 + '@eslint/js': 8.41.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + dev: true + + /espree@9.5.2: + resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + eslint-visitor-keys: 3.4.1 + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /execall@2.0.0: + resolution: {integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==} + engines: {node: '>=8'} + dependencies: + clone-regexp: 2.2.0 + dev: true + + /exenv@1.2.2: + resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect@29.5.0: + resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.5.0 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + dev: true + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /extract-zip@1.7.0: + resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} + hasBin: true + dependencies: + concat-stream: 1.6.2 + debug: 2.6.9 + mkdirp: 0.5.6 + yauzl: 2.10.0 + transitivePeerDependencies: + - supports-color + dev: true + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fast-redact@3.2.0: + resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==} + engines: {node: '>=6'} + dev: true + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: true + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fbjs@0.8.18: + resolution: {integrity: sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==} + dependencies: + core-js: 1.2.7 + isomorphic-fetch: 2.2.1 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 0.7.35 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + + /filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + dev: true + + /filenamify@4.3.0: + resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} + engines: {node: '>=8'} + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + dev: true + + /filesize@8.0.7: + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + /flatten@1.0.3: + resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} + deprecated: flatten is deprecated in favor of utility frameworks such as lodash. + dev: true + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.41.0)(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.21.4 + '@types/json-schema': 7.0.12 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 6.0.0 + deepmerge: 4.3.1 + eslint: 8.41.0 + fs-extra: 9.1.0 + glob: 7.2.3 + memfs: 3.5.1 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.5.1 + tapable: 1.1.3 + typescript: 5.0.2 + webpack: 5.84.1 + dev: false + + /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + dependencies: + '@babel/code-frame': 7.21.4 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.1 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.1.2 + semver: 7.5.1 + tapable: 2.2.1 + typescript: 5.0.2 + webpack: 5.84.1 + dev: true + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-monkey@1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + + /fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + functions-have-names: 1.2.3 + dev: true + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /get-tsconfig@4.5.0: + resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} + dev: true + + /getnpmregistry@1.0.1: + resolution: {integrity: sha512-OZRQ1RmRC0JduSLlQrHAaBLLrB23D3gaREsMBtM7aV8pxKB3duPs+a7iH7662b8zu1G9H6wiOvZc814g/bcHVg==} + dependencies: + node-fetch: 2.6.11 + transitivePeerDependencies: + - encoding + dev: true + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /gh-pages@3.2.3: + resolution: {integrity: sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 2.6.4 + commander: 2.20.3 + email-addresses: 3.1.0 + filenamify: 4.3.0 + find-cache-dir: 3.3.2 + fs-extra: 8.1.0 + globby: 6.1.0 + dev: true + + /git-hooks-list@1.0.3: + resolution: {integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==} + dev: true + + /git-hooks-list@3.1.0: + resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.9.2 + dev: true + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /globby@10.0.0: + resolution: {integrity: sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + glob: 7.2.3 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + + /globby@13.1.4: + resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /globby@6.1.0: + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} + engines: {node: '>=0.10.0'} + dependencies: + array-union: 1.0.2 + glob: 7.2.3 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + dev: true + + /gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: false + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: true + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /harmony-reflect@1.6.2: + resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + dependencies: + '@babel/runtime': 7.22.3 + loose-envify: 1.4.0 + resolve-pathname: 3.0.0 + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + value-equal: 1.0.1 + dev: true + + /history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + dependencies: + '@babel/runtime': 7.22.3 + dev: true + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /hoist-non-react-statics@2.5.5: + resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==} + dev: true + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hotkeys-js@3.10.2: + resolution: {integrity: sha512-Z6vLmJTYzkbZZXlBkhrYB962Q/rZGc/WHQiyEGu9ZZVF7bAeFDjjDa31grWREuw9Ygb4zmlov2bTkPYqj0aFnQ==} + dev: false + + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: true + + /htm@3.1.1: + resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} + dev: true + + /html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + + /html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.2 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.17.6 + dev: true + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + + /html-webpack-plugin@5.5.0(webpack@5.84.1): + resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} + engines: {node: '>=10.13.0'} + peerDependencies: + webpack: ^5.20.0 + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.84.1 + dev: true + + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.17.0 + dev: true + + /http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + dev: true + + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + dev: true + + /https-proxy-agent@2.2.4: + resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} + engines: {node: '>= 4.5.0'} + dependencies: + agent-base: 4.3.0 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /husky@7.0.4: + resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} + engines: {node: '>=12'} + hasBin: true + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /icss-utils@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.24 + dev: true + + /identity-obj-proxy@3.0.0: + resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} + engines: {node: '>=4'} + dependencies: + harmony-reflect: 1.6.2 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /immer@8.0.4: + resolution: {integrity: sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ==} + dev: true + + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-html-entry@1.14.6: + resolution: {integrity: sha512-5MQkbwIr8n/bXOoE05M5/Nm0lnHO46vnb3D6svSvtVwpDqwhd/X14zjLcU31QWZ6gL8rUXNzj6vKHx4yOUL6gQ==} + dependencies: + '@babel/runtime': 7.22.3 + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /import-modules@2.1.0: + resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} + engines: {node: '>=8'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: true + + /intl-format-cache@4.3.1: + resolution: {integrity: sha512-OEUYNA7D06agqPOYhbTkl0T8HA3QKSuwWh1HiClEnpd9vw7N+3XsQt5iZ0GUEchp5CW1fQk/tary+NsbF3yQ1Q==} + dev: true + + /intl-messageformat-parser@3.6.4: + resolution: {integrity: sha512-RgPGwue0mJtoX2Ax8EmMzJzttxjnva7gx0Q7mKJ4oALrTZvtmCeAw5Msz2PcjW4dtCh/h7vN/8GJCxZO1uv+OA==} + deprecated: We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser + dependencies: + '@formatjs/intl-unified-numberformat': 3.3.7 + dev: true + + /intl-messageformat@7.8.4: + resolution: {integrity: sha512-yS0cLESCKCYjseCOGXuV4pxJm/buTfyCJ1nzQjryHmSehlptbZbn9fnlk1I9peLopZGGbjj46yHHiTAEZ1qOTA==} + dependencies: + intl-format-cache: 4.3.1 + intl-messageformat-parser: 3.6.4 + dev: true + + /intl-messageformat@9.13.0: + resolution: {integrity: sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==} + dependencies: + '@formatjs/ecma402-abstract': 1.11.4 + '@formatjs/fast-memoize': 1.2.1 + '@formatjs/icu-messageformat-parser': 2.1.0 + tslib: 2.5.2 + dev: true + + /intl@1.2.5: + resolution: {integrity: sha512-rK0KcPHeBFBcqsErKSpvZnrOmWOj+EmDkyJ57e90YWaQNqbcivcqmKDlHEeNprDWOsKzPsh1BfSpPQdDvclHVw==} + dev: true + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + + /invert-kv@3.0.1: + resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==} + engines: {node: '>=8'} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + dev: true + + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true + + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.10 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-arrow-function@2.0.3: + resolution: {integrity: sha512-iDStzcT1FJMzx+TjCOK//uDugSe/Mif/8a+T0htydQ3qkJGvSweTZpVYz4hpJH0baloSPiAFQdA8WslAgJphvQ==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-equal@1.6.4: + resolution: {integrity: sha512-NiPOTBb5ahmIOYkJ7mVTvvB1bydnTzixvfO+59AjJKBpyjPBIULL3EHGxySyZijlVpewveJyhiLQThcivkkAtw==} + engines: {node: '>= 0.4'} + dependencies: + es-get-iterator: 1.1.3 + functions-have-names: 1.2.3 + has: 1.0.3 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + is-arrow-function: 2.0.3 + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-generator-function: 1.0.10 + is-number-object: 1.0.7 + is-regex: 1.1.4 + is-string: 1.0.7 + is-symbol: 1.0.4 + isarray: 2.0.5 + object-inspect: 1.12.3 + object.entries: 1.1.6 + object.getprototypeof: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regexp@2.1.0: + resolution: {integrity: sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==} + engines: {node: '>=6'} + dev: true + + /is-root@2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} + dev: false + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + dev: true + + /is-what@4.1.11: + resolution: {integrity: sha512-gr9+qDrJvdwT4+N2TAACsZQIB4Ow9j2eefqlh3m9JUV41M1LoKhcE+/j+IVni/r6U8Jnc1PwhjdjVJr+Xmtb0A==} + engines: {node: '>=12.13'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isomorphic-fetch@2.2.1: + resolution: {integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==} + dependencies: + node-fetch: 1.7.3 + whatwg-fetch: 3.6.2 + dev: true + + /isomorphic-unfetch@4.0.2: + resolution: {integrity: sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA==} + dependencies: + node-fetch: 3.3.1 + unfetch: 5.0.0 + dev: true + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.22.1 + '@babel/parser': 7.22.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jest-changed-files@29.5.0: + resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.5.0: + resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.5.0 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + p-limit: 3.1.0 + pretty-format: 29.5.0 + pure-rand: 6.0.2 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@29.5.0(@types/node@20.2.5)(ts-node@10.9.1): + resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1) + jest-util: 29.5.0 + jest-validate: 29.5.0 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config@29.5.0(@types/node@20.2.5)(ts-node@10.9.1): + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.22.1 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + babel-jest: 29.5.0(@babel/core@7.22.1) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@20.2.5)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff@29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /jest-docblock@29.4.3: + resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.5.0: + resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + jest-util: 29.5.0 + pretty-format: 29.5.0 + dev: true + + /jest-environment-jsdom@29.5.0: + resolution: {integrity: sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/jsdom': 20.0.1 + '@types/node': 20.2.5 + jest-mock: 29.5.0 + jest-util: 29.5.0 + jsdom: 20.0.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node@29.5.0: + resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + jest-mock: 29.5.0 + jest-util: 29.5.0 + dev: true + + /jest-get-type@29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@29.5.0: + resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/graceful-fs': 4.1.6 + '@types/node': 20.2.5 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.4.3 + jest-util: 29.5.0 + jest-worker: 29.5.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector@29.5.0: + resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /jest-matcher-utils@29.5.0: + resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.5.0 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /jest-message-util@29.5.0: + resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.21.4 + '@jest/types': 29.5.0 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.5.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.5.0: + resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + jest-util: 29.5.0 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.5.0 + dev: true + + /jest-regex-util@29.4.3: + resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies@29.5.0: + resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.4.3 + jest-snapshot: 29.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.5.0: + resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) + jest-util: 29.5.0 + jest-validate: 29.5.0 + resolve: 1.22.2 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.5.0: + resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.5.0 + '@jest/environment': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.4.3 + jest-environment-node: 29.5.0 + jest-haste-map: 29.5.0 + jest-leak-detector: 29.5.0 + jest-message-util: 29.5.0 + jest-resolve: 29.5.0 + jest-runtime: 29.5.0 + jest-util: 29.5.0 + jest-watcher: 29.5.0 + jest-worker: 29.5.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.5.0: + resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/globals': 29.5.0 + '@jest/source-map': 29.4.3 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.5.0: + resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.22.1 + '@babel/generator': 7.22.3 + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1) + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.1) + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + '@jest/expect-utils': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/babel__traverse': 7.20.0 + '@types/prettier': 2.7.2 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.1) + chalk: 4.1.2 + expect: 29.5.0 + graceful-fs: 4.2.11 + jest-diff: 29.5.0 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + natural-compare: 1.4.0 + pretty-format: 29.5.0 + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.5.0: + resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.5.0: + resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + leven: 3.1.0 + pretty-format: 29.5.0 + dev: true + + /jest-watcher@29.5.0: + resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.2.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.5.0 + string-length: 4.0.2 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.2.5 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest-worker@29.4.3: + resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 20.2.5 + jest-util: 29.5.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest-worker@29.5.0: + resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 20.2.5 + jest-util: 29.5.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.5.0(@types/node@20.2.5)(ts-node@10.9.1): + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/types': 29.5.0 + import-local: 3.1.0 + jest-cli: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: true + + /js-sdsl@4.4.0: + resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /jsdom@20.0.3: + resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.8.2 + acorn-globals: 7.0.1 + cssom: 0.5.0 + cssstyle: 2.3.0 + data-urls: 3.0.2 + decimal.js: 10.4.3 + domexception: 4.0.0 + escodegen: 2.0.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.4 + parse5: 7.1.2 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.2 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + ws: 8.13.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + dependencies: + string-convert: 0.2.1 + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /jsx-ast-utils@3.3.3: + resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + object.assign: 4.1.4 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + /known-css-properties@0.21.0: + resolution: {integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==} + dev: true + + /known-css-properties@0.25.0: + resolution: {integrity: sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==} + dev: true + + /known-css-properties@0.26.0: + resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==} + dev: true + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /lcid@3.1.1: + resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==} + engines: {node: '>=8'} + dependencies: + invert-kv: 3.0.1 + dev: true + + /less@4.1.3: + resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.5.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /lightningcss-darwin-arm64@1.19.0: + resolution: {integrity: sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-darwin-x64@1.19.0: + resolution: {integrity: sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm-gnueabihf@1.19.0: + resolution: {integrity: sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-gnu@1.19.0: + resolution: {integrity: sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-musl@1.19.0: + resolution: {integrity: sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-gnu@1.19.0: + resolution: {integrity: sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-musl@1.19.0: + resolution: {integrity: sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-win32-x64-msvc@1.19.0: + resolution: {integrity: sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lightningcss@1.19.0: + resolution: {integrity: sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.19.0 + lightningcss-darwin-x64: 1.19.0 + lightningcss-linux-arm-gnueabihf: 1.19.0 + lightningcss-linux-arm64-gnu: 1.19.0 + lightningcss-linux-arm64-musl: 1.19.0 + lightningcss-linux-x64-gnu: 1.19.0 + lightningcss-linux-x64-musl: 1.19.0 + lightningcss-win32-x64-msvc: 1.19.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /lint-staged@10.5.4: + resolution: {integrity: sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==} + hasBin: true + dependencies: + chalk: 4.1.2 + cli-truncate: 2.1.0 + commander: 6.2.1 + cosmiconfig: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + dedent: 0.7.0 + enquirer: 2.3.6 + execa: 4.1.0 + listr2: 3.14.0(enquirer@2.3.6) + log-symbols: 4.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + please-upgrade-node: 3.2.0 + string-argv: 0.3.1 + stringify-object: 3.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /listr2@3.14.0(enquirer@2.3.6): + resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} + engines: {node: '>=10.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + enquirer: 2.3.6 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + /loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + dev: false + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: true + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + + /lodash.tonumber@4.0.3: + resolution: {integrity: sha512-SY0SwuPOHRwKcCNTdsntPYb+Zddz5mDUIVFABzRMqmAiL41pMeyoQFGxYAw5zdc9NnH4pbJqiqqp5ckfxa+zSA==} + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /log4js@1.1.1: + resolution: {integrity: sha512-lYb14ZSs1M/CUFuvy7Zk3VZLDtqrqOaVql9CE0tv8g6/qE1Gfq97XKdltBsjSxxvcJ+t8fAXOnvFxSsms7gGVg==} + engines: {node: '>=0.12'} + deprecated: 1.x is no longer supported. Please upgrade to 6.x or higher. + dependencies: + debug: 2.6.9 + semver: 5.7.1 + streamroller: 0.4.1 + transitivePeerDependencies: + - supports-color + dev: true + + /longest-streak@2.0.4: + resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.5.2 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@9.1.1: + resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + dev: true + + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.1 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + dependencies: + p-defer: 1.0.0 + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + dev: true + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-to-markdown@0.6.5: + resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + dependencies: + '@types/unist': 2.0.6 + longest-streak: 2.0.4 + mdast-util-to-string: 2.0.0 + parse-entities: 2.0.0 + repeat-string: 1.6.1 + zwitch: 1.0.5 + dev: true + + /mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /mem@5.1.1: + resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==} + engines: {node: '>=8'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 2.1.0 + p-is-promise: 2.1.0 + dev: true + + /memfs@3.5.1: + resolution: {integrity: sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.3 + + /memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + dev: false + + /memoizee@0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.7 + dev: true + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass@6.0.2: + resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mock.js@0.2.0: + resolution: {integrity: sha512-DKI8Rh/h7Mma+fg+6aD0uUvwn0QXAjKG6q3s+lTaCboCQ/kvQMBN9IXRBzgEaz4aPiYoRnKU9jVsfZp0mHpWrQ==} + dev: true + + /mockjs@1.1.0: + resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} + hasBin: true + dependencies: + commander: 10.0.1 + dev: true + + /moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multimap@1.1.0: + resolution: {integrity: sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /needle@3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.6.3 + sax: 1.2.4 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.5.2 + dev: true + + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: true + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true + + /node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + dependencies: + http2-client: 1.3.5 + dev: true + + /node-fetch@1.7.3: + resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + dependencies: + encoding: 0.1.13 + is-stream: 1.1.0 + dev: true + + /node-fetch@2.6.0: + resolution: {integrity: sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==} + engines: {node: 4.x || >=6.0.0} + dev: true + + /node-fetch@2.6.11: + resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: true + + /node-import-ts@1.0.6: + resolution: {integrity: sha512-zm2zxUn5KI+jjDyx80MbrIrLRUwQ3oQYGotgZ+Z6xTSaXoUgIIO7h5mks5c9v4tBBpc+VlIyyq5WkGcdCn7qfA==} + dependencies: + '@types/node': 12.20.55 + import-fresh: 3.3.0 + typescript: 3.9.10 + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-libs-browser@2.2.1: + resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} + dependencies: + assert: 1.5.0 + browserify-zlib: 0.2.0 + buffer: 4.9.2 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + domain-browser: 1.2.0 + events: 3.3.0 + https-browserify: 1.0.0 + os-browserify: 0.3.0 + path-browserify: 0.0.1 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 2.3.8 + stream-browserify: 2.0.2 + stream-http: 2.8.3 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.0 + url: 0.11.0 + util: 0.11.1 + vm-browserify: 1.1.2 + dev: true + + /node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + dependencies: + es6-promise: 3.3.1 + dev: true + + /node-releases@2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.12.1 + semver: 7.5.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-selector@0.2.0: + resolution: {integrity: sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==} + dev: true + + /normalize.css@7.0.0: + resolution: {integrity: sha512-LYaFZxj2Q1Q9e1VJ0f6laG46Rt5s9URhKyckNaA2vZnL/0gwQHWhM7ALQkp3WBQKM5sXRLQ5Ehrfkp+E/ZiCRg==} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /num2fraction@1.2.2: + resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} + dev: true + + /nunjucks@3.2.4: + resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} + engines: {node: '>= 6.9.0'} + hasBin: true + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + a-sync-waterfall: 1.0.1 + asap: 2.0.6 + commander: 5.1.0 + dev: true + + /nwsapi@2.2.4: + resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} + dev: true + + /oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + dependencies: + fast-safe-stringify: 2.1.1 + dev: true + + /oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + dependencies: + '@exodus/schemasafe': 1.0.1 + should: 13.2.3 + yaml: 1.10.2 + dev: true + + /oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + dev: true + + /oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + dev: true + + /oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.2 + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.getprototypeof@1.0.4: + resolution: {integrity: sha512-xV/FkUNM9sHa56AB5deXrlIR+jBtDAHieyfm6XZUuehqlMX+YJPh8CAYtPrXGA/mFLFttasTc9ihhpkPrH7pLw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + reflect.getprototypeof: 1.0.3 + dev: true + + /object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + + /omit.js@2.0.2: + resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} + + /on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /openapi3-ts@2.0.2: + resolution: {integrity: sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==} + dependencies: + yaml: 1.10.2 + dev: true + + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: true + + /optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + dev: true + + /os-locale@5.0.0: + resolution: {integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==} + engines: {node: '>=10'} + dependencies: + execa: 4.1.0 + lcid: 3.1.1 + mem: 5.1.1 + dev: true + + /p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: true + + /p-is-promise@2.1.0: + resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} + engines: {node: '>=6'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.5.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.21.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.2 + dev: true + + /path-browserify@0.0.1: + resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.9.2: + resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 9.1.1 + minipass: 6.0.2 + dev: true + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-to-regexp@1.7.0: + resolution: {integrity: sha512-nifX1uj4S9IrK/w3Xe7kKvNEepXivANs9ng60Iq7PU/BlouV3yL/VUhFqTuTq33ykwUqoNcTeGo5vdOBP4jS/Q==} + dependencies: + isarray: 0.0.1 + dev: true + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + + /path-to-regexp@2.4.0: + resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==} + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /picocolors@0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true + + /pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + dependencies: + duplexify: 4.1.2 + split2: 4.2.0 + dev: true + + /pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + dev: true + + /pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.2.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + dev: true + + /pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + dependencies: + find-up: 3.0.0 + dev: false + + /please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + dependencies: + semver-compare: 1.0.0 + dev: true + + /plur@4.0.0: + resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} + engines: {node: '>=10'} + dependencies: + irregular-plurals: 3.5.0 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /pngjs-image@0.11.7: + resolution: {integrity: sha512-JRyrmT+HXa1/gvdHpebus8TGqKa8WRgcsHz/DDalxRsMhvu6AOA99/enBFjZIPvmXVAzwKR051s80TuE1IiCpg==} + dependencies: + iconv-lite: 0.4.24 + pako: 0.2.9 + pngjs: 2.3.1 + request: 2.88.2 + stream-buffers: 1.0.1 + underscore: 1.7.0 + dev: true + + /pngjs@2.3.1: + resolution: {integrity: sha512-ITNPqvx+SSssNFOgHQzGG87HrqQ0g2nMSHc1jjU5Piq9xJEJ40fiFEPz0S5HSSXxBHrTnhaBHIayTO5aRfk2vw==} + engines: {iojs: '>= 1.0.0', node: '>=0.10.0'} + dev: true + + /point-in-polygon@1.1.0: + resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} + dev: true + + /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.24): + resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-clamp@4.1.0(postcss@8.4.24): + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: ^8.4.6 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-functional-notation@4.2.4(postcss@8.4.24): + resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-hex-alpha@8.0.4(postcss@8.4.24): + resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-rebeccapurple@7.1.1(postcss@8.4.24): + resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-custom-media@8.0.2(postcss@8.4.24): + resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-custom-properties@12.1.11(postcss@8.4.24): + resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-custom-selectors@6.0.3(postcss@8.4.24): + resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-dir-pseudo-class@6.0.5(postcss@8.4.24): + resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-double-position-gradients@3.1.2(postcss@8.4.24): + resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-env-function@4.0.6(postcss@8.4.24): + resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.24): + resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} + peerDependencies: + postcss: ^8.1.4 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-focus-visible@6.0.4(postcss@8.4.24): + resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-focus-within@5.0.4(postcss@8.4.24): + resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-font-variant@5.0.0(postcss@8.4.24): + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-gap-properties@3.0.5(postcss@8.4.24): + resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-html@0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39): + resolution: {integrity: sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==} + peerDependencies: + postcss: '>=5.0.0' + postcss-syntax: '>=0.36.0' + dependencies: + htmlparser2: 3.10.1 + postcss: 7.0.39 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + dev: true + + /postcss-image-set-function@4.0.7(postcss@8.4.24): + resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-initial@4.0.1(postcss@8.4.24): + resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-lab-function@4.2.1(postcss@8.4.24): + resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-less@3.1.4: + resolution: {integrity: sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==} + engines: {node: '>=6.14.4'} + dependencies: + postcss: 7.0.39 + dev: true + + /postcss-less@4.0.1: + resolution: {integrity: sha512-C92S4sHlbDpefJ2QQJjrucCcypq3+KZPstjfuvgOCNnGx0tF9h8hXgAlOIATGAxMXZXaF+nVp+/Mi8pCAWdSmw==} + engines: {node: '>=10'} + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-logical@5.0.4(postcss@8.4.24): + resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-media-minmax@5.0.0(postcss@8.4.24): + resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + dev: true + + /postcss-modules-extract-imports@3.0.0(postcss@8.4.24): + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-modules-local-by-default@4.0.3(postcss@8.4.24): + resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-modules-scope@3.0.0(postcss@8.4.24): + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-modules-values@4.0.0(postcss@8.4.24): + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.24) + postcss: 8.4.24 + dev: true + + /postcss-nesting@10.2.0(postcss@8.4.24): + resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-opacity-percentage@1.1.3(postcss@8.4.24): + resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-overflow-shorthand@3.0.4(postcss@8.4.24): + resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-page-break@3.0.4(postcss@8.4.24): + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-place@7.0.5(postcss@8.4.24): + resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-prefix-selector@1.16.0(postcss@8.4.24): + resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==} + peerDependencies: + postcss: '>4 <9' + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-preset-env@7.5.0(postcss@8.4.24): + resolution: {integrity: sha512-0BJzWEfCdTtK2R3EiKKSdkE51/DI/BwnhlnicSW482Ym6/DGHud8K0wGLcdjip1epVX0HKo4c8zzTeV/SkiejQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-color-function': 1.1.1(postcss@8.4.24) + '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.24) + '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.24) + '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.24) + '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.24) + '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.24) + '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.24) + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24) + '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.24) + '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.24) + autoprefixer: 10.4.14(postcss@8.4.24) + browserslist: 4.21.6 + css-blank-pseudo: 3.0.3(postcss@8.4.24) + css-has-pseudo: 3.0.4(postcss@8.4.24) + css-prefers-color-scheme: 6.0.3(postcss@8.4.24) + cssdb: 6.6.3 + postcss: 8.4.24 + postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.24) + postcss-clamp: 4.1.0(postcss@8.4.24) + postcss-color-functional-notation: 4.2.4(postcss@8.4.24) + postcss-color-hex-alpha: 8.0.4(postcss@8.4.24) + postcss-color-rebeccapurple: 7.1.1(postcss@8.4.24) + postcss-custom-media: 8.0.2(postcss@8.4.24) + postcss-custom-properties: 12.1.11(postcss@8.4.24) + postcss-custom-selectors: 6.0.3(postcss@8.4.24) + postcss-dir-pseudo-class: 6.0.5(postcss@8.4.24) + postcss-double-position-gradients: 3.1.2(postcss@8.4.24) + postcss-env-function: 4.0.6(postcss@8.4.24) + postcss-focus-visible: 6.0.4(postcss@8.4.24) + postcss-focus-within: 5.0.4(postcss@8.4.24) + postcss-font-variant: 5.0.0(postcss@8.4.24) + postcss-gap-properties: 3.0.5(postcss@8.4.24) + postcss-image-set-function: 4.0.7(postcss@8.4.24) + postcss-initial: 4.0.1(postcss@8.4.24) + postcss-lab-function: 4.2.1(postcss@8.4.24) + postcss-logical: 5.0.4(postcss@8.4.24) + postcss-media-minmax: 5.0.0(postcss@8.4.24) + postcss-nesting: 10.2.0(postcss@8.4.24) + postcss-opacity-percentage: 1.1.3(postcss@8.4.24) + postcss-overflow-shorthand: 3.0.4(postcss@8.4.24) + postcss-page-break: 3.0.4(postcss@8.4.24) + postcss-place: 7.0.5(postcss@8.4.24) + postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.24) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.24) + postcss-selector-not: 5.0.0(postcss@8.4.24) + postcss-value-parser: 4.2.0 + dev: true + + /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.24): + resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.24): + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + peerDependencies: + postcss: ^8.0.3 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-resolve-nested-selector@0.1.1: + resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} + dev: true + + /postcss-safe-parser@4.0.2: + resolution: {integrity: sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==} + engines: {node: '>=6.0.0'} + dependencies: + postcss: 7.0.39 + dev: true + + /postcss-safe-parser@6.0.0(postcss@8.4.24): + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-sass@0.4.4: + resolution: {integrity: sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==} + dependencies: + gonzales-pe: 4.3.0 + postcss: 7.0.39 + dev: true + + /postcss-scss@2.1.1: + resolution: {integrity: sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==} + engines: {node: '>=6.0.0'} + dependencies: + postcss: 7.0.39 + dev: true + + /postcss-selector-not@5.0.0(postcss@8.4.24): + resolution: {integrity: sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==} + peerDependencies: + postcss: ^8.1.0 + dependencies: + balanced-match: 1.0.2 + postcss: 8.4.24 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-sorting@6.0.0(postcss@8.4.24): + resolution: {integrity: sha512-bYJ0vgAiGbjCBKi7B07CzsBc9eM84nLEbavUmwNp8rAa+PNyrgdH+6PpnqTtciLuUs99c4rFQQmCaYgeBQYmSQ==} + peerDependencies: + postcss: ^8.0.4 + dependencies: + lodash: 4.17.21 + postcss: 8.4.24 + dev: true + + /postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39): + resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==} + peerDependencies: + postcss: '>=5.0.0' + postcss-html: '*' + postcss-jsx: '*' + postcss-less: '*' + postcss-markdown: '*' + postcss-scss: '*' + peerDependenciesMeta: + postcss-html: + optional: true + postcss-jsx: + optional: true + postcss-less: + optional: true + postcss-markdown: + optional: true + postcss-scss: + optional: true + dependencies: + postcss: 7.0.39 + postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39) + postcss-less: 3.1.4 + postcss-scss: 2.1.1 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + dependencies: + picocolors: 0.2.1 + source-map: 0.6.1 + dev: true + + /postcss@8.4.24: + resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /preceptor-core@0.10.1: + resolution: {integrity: sha512-WLDk+UowEESixvlhiamGOj/iqWrp8IWeCCHvBZrLh0g4/A1Fa77fDQWqQUd5S5rScT+9u49aDfa45xYRkxqmiA==} + dependencies: + log4js: 1.1.1 + underscore: 1.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier-plugin-organize-imports@3.2.2(prettier@2.8.8)(typescript@5.0.2): + resolution: {integrity: sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==} + peerDependencies: + '@volar/vue-language-plugin-pug': ^1.0.4 + '@volar/vue-typescript': ^1.0.4 + prettier: '>=2.0' + typescript: '>=2.9' + peerDependenciesMeta: + '@volar/vue-language-plugin-pug': + optional: true + '@volar/vue-typescript': + optional: true + dependencies: + prettier: 2.8.8 + typescript: 5.0.2 + dev: true + + /prettier-plugin-packagejson@2.3.0(prettier@2.8.8): + resolution: {integrity: sha512-2SAPMMk1UDkqsB7DifWKcwCm6VC52JXMrzLHfbcQHJRWhRCj9zziOy+s+2XOyPBeyqFqS+A/1IKzOrxKFTo6pw==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true + dependencies: + prettier: 2.8.8 + sort-package-json: 1.57.0 + dev: true + + /prettier-plugin-packagejson@2.4.3(prettier@2.8.8): + resolution: {integrity: sha512-kPeeviJiwy0BgOSk7No8NmzzXfW4R9FYWni6ziA5zc1kGVVrKnBzMZdu2TUhI+I7h8/5Htt3vARYOk7KKJTTNQ==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true + dependencies: + prettier: 2.8.8 + sort-package-json: 2.4.1 + synckit: 0.8.5 + dev: true + + /prettier-plugin-two-style-order@1.0.1(prettier@2.8.8): + resolution: {integrity: sha512-ETltO2FRR/Pxc7bsgz2XwuzWSPwafl7/v5+5Rria4S579CTas7dya+xsmbkix0q1tYQiuRjVVdfGnCKlH/aOuQ==} + peerDependencies: + prettier: '>= 2.0.0' + dependencies: + postcss: 8.4.24 + postcss-less: 4.0.1 + postcss-sorting: 6.0.0(postcss@8.4.24) + prettier: 2.8.8 + dev: true + + /prettier@1.15.3: + resolution: {integrity: sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-format@29.5.0: + resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /promise@6.0.0: + resolution: {integrity: sha512-PjIqIEWR8EWwP5ml3Wf5KWIP3sIdXAew9vQ6vLOLV+z4LMa/8ZQyLd7sTWe2r8OuA8A9jsIYptDfbEn/L36ogw==} + dependencies: + asap: 1.0.0 + dev: true + + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-compare@2.4.0: + resolution: {integrity: sha512-FD8KmQUQD6Mfpd0hywCOzcon/dbkFP8XBd9F1ycbKtvVsfv6TsFUKJ2eC0Iz2y+KzlkdT1Z8SY6ZSgm07zOyqg==} + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + dev: true + optional: true + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@1.3.2: + resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /puppeteer-core@1.12.2: + resolution: {integrity: sha512-M+atMV5e+MwJdR+OwQVZ1xqAIwh3Ou4nUxNuf334GwpcLG+LDj5BwIph4J9y8YAViByRtWGL+uF8qX2Ggzb+Fg==} + engines: {node: '>=6.4.0'} + requiresBuild: true + dependencies: + debug: 4.3.4(supports-color@5.5.0) + extract-zip: 1.7.0 + https-proxy-agent: 2.2.4 + mime: 2.6.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 2.7.1 + ws: 6.2.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /pure-rand@6.0.2: + resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} + dev: true + + /qiankun@2.10.8: + resolution: {integrity: sha512-5w6QeM1INFavJdIWfSoDIVv2InV8MEojauvY5tY9Biu8hhE5Rml/HM2t/Y60kZcuOpgy/HGX+tcc6NkQuzDoCg==} + dependencies: + '@babel/runtime': 7.22.3 + import-html-entry: 1.14.6 + lodash: 4.17.21 + single-spa: 5.9.4 + dev: true + + /qrcode.react@3.1.0(react@18.2.0): + resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /query-string@6.14.1: + resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: true + + /querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + dev: true + + /querystring@0.2.0: + resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /querystring@0.2.1: + resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + dependencies: + performance-now: 2.1.0 + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /rc-align@2.4.5: + resolution: {integrity: sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==} + dependencies: + babel-runtime: 6.26.0 + dom-align: 1.12.4 + prop-types: 15.8.1 + rc-util: 4.21.1 + dev: true + + /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + dom-align: 1.12.4 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + resize-observer-polyfill: 1.5.1 + + /rc-animate@2.11.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + css-animation: 1.6.1 + prop-types: 15.8.1 + raf: 3.4.1 + rc-util: 4.21.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + dev: true + + /rc-cascader@3.12.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-QTeGPTNYX33alozNy9lYg7YKpvYVwquai/mrFRR8mHlHnK7QlqJyMqbs2p7rc5eeKARKMRTUeoN5CfO+Gr9UBw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + array-tree-filter: 2.1.0 + classnames: 2.3.2 + rc-select: 14.5.1(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-cascader@3.7.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5nPEM76eMyikd0NFiy1gjwiB9m+bOzjY6Lnd5bVC6Ar3XLlOpOnlCcV3oBFWLN3f7B18tAGpaAVlT2uyEDCv9w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + array-tree-filter: 2.1.0 + classnames: 2.3.2 + rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-checkbox@2.0.3: + resolution: {integrity: sha512-sSDV5AcxK5CxBTyUNj9pb0zfhdgLLsWKHwJG18ikeGoIwklcxXvIF6cI/KGVbPLFDa8mPS5WLOlLRqbq/1/ouw==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + prop-types: 15.8.1 + rc-util: 4.21.1 + dev: true + + /rc-checkbox@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k7nxDWxYF+jDI0ZcCvuvj71xONmWRVe5+1MKcERRR9MRyP3tZ69b+yUCSXXh+sik4/Hc9P5wHr2nnUoGS2zBjA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-collapse@1.9.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-8cG+FzudmgFCC9zRGKXJZA36zoI9Dmyjp6UDi8N80sXUch0JOpsZDxgcFzw4HPpPpK/dARtTilEe9zyuspnW0w==} + dependencies: + classnames: 2.3.2 + css-animation: 1.6.1 + prop-types: 15.8.1 + rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rc-collapse@3.4.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: true + + /rc-collapse@3.5.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/TNiT3DW1t3sUCiVD/DPUYooJZ3BLA93/2rZsB3eM2bGJCCla2X9D2E4tgm7LGMQGy5Atb2lMUn2FQuvQNvavQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-dialog@9.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-dialog@9.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5ry+JABAWEbaKyYsmITtrJbZbJys8CtMyzV8Xn4LYuXMeUx5XVHNyJRoqLFE4AzBuXXzOWeaC49cg+XkxK6kHA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-drawer@6.1.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EBRFM9o3lPU5kYh8sFoXYA9KxpdT765HDqj/AbZWicXkhwEYUH7MjUH0ctenPCiHBxXQUgIUvK14+6rPuURd6w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-dropdown@4.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-dropdown@4.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-field-form@1.27.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + async-validator: 4.2.5 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-field-form@1.31.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3u6crithuSQMfHaDL3rMvzjG5oXJQIgCTxDfT0pJL9kI/C2LWuR8GrApzOvB9gKcf8VvvnejzmSPnsUJz4YGmQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + async-validator: 4.2.5 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-field-form@1.32.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vr5pA0/gWiBZf0HKdevQJcWSsAac10Z8Nj1Brs3OOCnExk7l+u8GtsW+4cRSqJLug5fxV11dOGXpxf7+aHT/2A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + async-validator: 4.2.5 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-gesture@0.0.22: + resolution: {integrity: sha512-6G6qrCE0MUTXyjh/powj91XkjRjoFL4HiJLPU5lALXHvGX+/efcUjGYUrHrrw0mwQdmrmg4POqnY/bibns+G3g==} + dependencies: + babel-runtime: 6.26.0 + dev: true + + /rc-image@5.13.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-dialog: 9.0.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-image@5.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-11DOye57IgTXh2yTsmxFNynZJG3tdx8RZnnaqb38eYWrBPPyhVHIuURxyiSZ8B68lEUAggR7SBA0Zb95KP/CyQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-dialog: 9.1.0(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-input-number@7.3.11(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-input-number@7.4.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yGturTw7WGP+M1GbJ+UTAO7L4buxeW6oilhL9Sq3DezsRS8/9qec4UiXUbeoiX9bzvRXH11JvgskBtxSp4YSNg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/mini-decimal': 1.0.1 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-input@0.1.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-input@1.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-clY4oneVHRtKHYf/HCxT/MO+4BGzCIywSNLosXWOm7fcQAS0jQW7n0an8Raa8JMB8kpxc8m28p7SNwFZmlMj6g==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-mentions@1.13.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-textarea: 0.4.7(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-mentions@2.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-R7ncCldr02uKgJBBPlXdtnOGQIjZ9C3uoIMi4fabU3CPFdmefYlNF6QM4u2AzgcGt8V0KkoHTN5T6HPdUpet8g==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-textarea: 1.2.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-menu@9.8.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-menu@9.9.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kVJwaQn5VUu6DIddxd/jz3QupTPg0tNYq+mpFP8wYsRF5JgzPA9fPVw+CfwlTPwA1w7gzEY42S8pj6M3uev5CQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /rc-motion@2.7.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2xUvo8yGHdOHeQbdI8BtBsCIrWKchEmFEIskf0nmHtJsou+meLd/JE+vnvSX2JxcBrJtXY2LuBpxAOxrbY/wMQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-notification@4.6.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-notification@5.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3535oellIRlt1LspERfK8yvCqb8Gio3R02rULciaSc1xe3H7ArTU/khlUTv1ddGzua4HhmF4D4Rwz/+mBxETvg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-overflow@1.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-p2Qt4SWPTHAYl4oAao1THy669Fm5q8pYBDBHRaFOekCvcdcrgIx0ByXQMEkyPm8wUDX4BK6aARWecvCRc/7CTA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-pagination@3.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-pagination@3.4.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-arFQKD15h26+rSXRnQNA8b/tHy98/853W/leXkas2WlViOYG5A2qgEg7CRX64GKb9TqJjdqnDzaMAvl0qF4Tig==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-picker@2.7.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-KbUKgbzgWVN5L+V9xhZDKSmseHIyFneBlmuMtMrZ9fU7Oypw6D+owS5kuUicIEV08Y17oXt8dUqauMeC5IFBPg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + date-fns: 2.30.0 + dayjs: 1.11.7 + moment: 2.29.4 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: true + + /rc-picker@3.7.6(dayjs@1.11.7)(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-v84wVXjgx5hQ5vTLjMeMMtj6+gn480Gqzwur2A2+o8+eFnhY4jKmuqzHmD8sEevrz0WT/j1pLHFxAV8/lksI2A==} + engines: {node: '>=8.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + dayjs: 1.11.7 + moment: 2.29.4 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-progress@3.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-rate@2.10.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TCjEpKPeN1m0EnGDDbb1KyxjNTJRzoReiPdtbrBJEey4Ryf/UGOQ6vqmz2yC6DJdYVDVUoZPdoz043ryh0t/nQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-rate@2.9.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-resize-observer@0.2.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + resize-observer-polyfill: 1.5.1 + + /rc-resize-observer@1.3.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + resize-observer-polyfill: 1.5.1 + + /rc-segmented@2.1.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-segmented@2.2.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-select@14.1.17(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6qQhMqtoUkkboRqXKKFRR5Nu1mrnw2mC1uxIBIczg7aiJ94qCZBg4Ww8OLT9f4xdyCgbFSGh6r3yB9EBsjoHGA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.5.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-select@14.5.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-RQ3yiguq6yJ+kbtip7/6RTq2hOotS/s00nyZL2nxyz5194C6uOtSB8Kgsw3c6ZXII1EDjuJX3zLI1pkxkNWyww==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.5.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-slider@10.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: true + + /rc-slider@10.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-slider@8.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rnO36M3VhMoPWh1kRuCeJoluT4duAW7+5aLaAn9oLu2pKEKsuOFUh5DmA2kEo88UmvPV6nr7HHDeZuC8SNM/lA==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + prop-types: 15.8.1 + rc-tooltip: 3.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 4.21.1 + shallowequal: 1.1.0 + warning: 3.0.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rc-steps@5.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-steps@6.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+KfMZIty40mYCQSDvYbZ1jwnuObLauTiIskT1hL4FFOBHP6ZOr8LK0m143yD3kEN5XKHSEX1DIwCj3AYZpoeNQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-swipeout@2.0.11: + resolution: {integrity: sha512-d37Lgn4RX4OOQyuA2BFo0rGlUwrmZk5q83srH3ixJ1Y1jidr2GKjgJDbNeGUVZPNfYBL91Elu6+xfVGftWf4Lg==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + rc-gesture: 0.0.22 + react-native-swipeout: 2.3.6 + dev: true + + /rc-switch@3.2.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-switch@4.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-table@7.26.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: true + + /rc-table@7.32.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fHMQteKMocUC9I9Vex3eBLH7QsiaMR/qtzh3B1Ty2PoNGwVTwVdDFyRL05zch+JU3KnNNczgQeVvtf/p//gdrQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/context': 1.3.0(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-tabs@12.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-tabs@12.6.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-L9yIptdrmft573MEsc+xKoGbXzfg3V6NYvgT0sNh+PSzWaeF34W7CIPi98lcWjtsYB80oFMOcAXRilUFxLHTaA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-textarea@0.4.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: true + + /rc-textarea@1.2.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YvN8IskIVBRRzcS4deT0VAMim31+T3IoVX4yoCJ+b/iVCvw7yf0usR7x8OaHiUOUoURKcn/3lfGjmtzplcy99g==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-tooltip@3.7.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dE2ibukxxkrde7wH9W8ozHKUO4aQnPZ6qBHtrTH9LoO836PjDdiaWO73fgPB05VfJs9FbZdmGPVEbXCeOP99Ww==} + dependencies: + babel-runtime: 6.26.0 + prop-types: 15.8.1 + rc-trigger: 2.6.5(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rc-tooltip@5.2.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-tooltip@6.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-tree-select@5.5.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /rc-tree-select@5.9.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-oh3blESzLfLCBPSiVDtZ2irzrWWZUMeHvnSwRvFo79br8Z+K/1OhXhXBZmROvfKwaH8YUugAQy8B2j5EGQbdyA==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-select: 14.5.1(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-tree@5.7.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7VfDq4jma+6fvlzfDXvUJ34SaO2EWkcXGBmPgeFmVKsLNNXcKGl4cRAhs6Ts1zqnX994vu/hb3f1dyTjn43RFg==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.5.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-trigger@2.6.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + prop-types: 15.8.1 + rc-align: 2.4.5 + rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 4.21.1 + react-lifecycles-compat: 3.0.4 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rc-trigger@5.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-upload@4.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /rc-util@4.21.1: + resolution: {integrity: sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==} + dependencies: + add-dom-event-listener: 1.1.0 + prop-types: 15.8.1 + react-is: 16.13.1 + react-lifecycles-compat: 3.0.4 + shallowequal: 1.1.0 + + /rc-util@5.32.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nfwctiglkgaRjJAnWp0W6BH9Am0cuLOz5HbcBrswQVeLDwnuoholdGex/vZjwug/oq5H1wBwao12DpP61FI1yA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.22.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 16.13.1 + + /rc-virtual-list@3.5.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sE2G9hTPjVmatQni8OP2Kx33+Oth6DMKm67OblBBmgMBJDJQOOFpSGH7KZ6Pm85rrI2IGxDRXZCr0QhYOH2pfQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.22.3 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /react-dev-inspector@1.8.4(eslint@8.41.0)(react@18.2.0)(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-+MpF43RHTKjkilQ4TgUfSgpVlJFKpL4uPc/0FBJAMNPICYxw27q81++AcBIThfxFmBgsFbMj3EKZwkaPZ43V7w==} + engines: {node: '>=12.0.0'} + peerDependencies: + react: '>=16.8.0' + dependencies: + '@babel/core': 7.22.1 + '@babel/generator': 7.22.3 + '@babel/parser': 7.22.3 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@babel/types': 7.22.3 + hotkeys-js: 3.10.2 + loader-utils: 2.0.4 + querystring: 0.2.1 + react: 18.2.0 + react-dev-utils: 12.0.1(eslint@8.41.0)(typescript@5.0.2)(webpack@5.84.1) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + - vue-template-compiler + - webpack + dev: false + + /react-dev-utils@12.0.1(eslint@8.41.0)(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: '>=4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/code-frame': 7.21.4 + address: 1.2.2 + browserslist: 4.21.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 4.0.0 + filesize: 8.0.7 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.41.0)(typescript@5.0.2)(webpack@5.84.1) + global-modules: 2.0.0 + globby: 11.1.0 + gzip-size: 6.0.0 + immer: 9.0.21 + is-root: 2.1.0 + loader-utils: 3.2.1 + open: 8.4.2 + pkg-up: 3.1.0 + prompts: 2.4.2 + react-error-overlay: 6.0.11 + recursive-readdir: 2.2.3 + shell-quote: 1.8.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + typescript: 5.0.2 + webpack: 5.84.1 + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + dev: false + + /react-dom@18.1.0(react@18.1.0): + resolution: {integrity: sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==} + peerDependencies: + react: ^18.1.0 + dependencies: + loose-envify: 1.4.0 + react: 18.1.0 + scheduler: 0.22.0 + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + /react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + dev: false + + /react-error-overlay@6.0.9: + resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} + dev: true + + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + /react-helmet-async@1.3.0(react-dom@18.1.0)(react@18.1.0): + resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.22.3 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 18.1.0 + react-dom: 18.1.0(react@18.1.0) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + dev: true + + /react-helmet-async@1.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.22.3 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + /react-intl@3.12.1(react@18.2.0): + resolution: {integrity: sha512-cgumW29mwROIqyp8NXStYsoIm27+8FqnxykiLSawWjOxGIBeLuN/+p2srei5SRIumcJefOkOIHP+NDck05RgHg==} + peerDependencies: + react: ^16.3.0 + dependencies: + '@formatjs/intl-displaynames': 1.2.10 + '@formatjs/intl-listformat': 1.4.8 + '@formatjs/intl-relativetimeformat': 4.5.16 + '@formatjs/intl-unified-numberformat': 3.3.7 + '@formatjs/intl-utils': 2.3.0 + '@types/hoist-non-react-statics': 3.3.1 + '@types/invariant': 2.2.35 + hoist-non-react-statics: 3.3.2 + intl-format-cache: 4.3.1 + intl-messageformat: 7.8.4 + intl-messageformat-parser: 3.6.4 + react: 18.2.0 + shallow-equal: 1.2.1 + dev: true + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + /react-merge-refs@1.1.0: + resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} + dev: true + + /react-native-swipeout@2.3.6: + resolution: {integrity: sha512-t9suUCspzck4vp2pWggWe0frS/QOtX6yYCawHnEes75A7dZCEE74bxX2A1bQzGH9cUMjq6xsdfC94RbiDKIkJg==} + deprecated: Package no longer supported. Use at your own risk or consider using https://github.com/software-mansion/react-native-gesture-handler + dependencies: + create-react-class: 15.7.0 + prop-types: 15.8.1 + react-tween-state: 0.1.5 + dev: true + + /react-redux@5.1.2(react@18.2.0)(redux@3.7.2): + resolution: {integrity: sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==} + peerDependencies: + react: ^0.14.0 || ^15.0.0-0 || ^16.0.0-0 + redux: ^2.0.0 || ^3.0.0 || ^4.0.0-0 + dependencies: + '@babel/runtime': 7.22.3 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 16.13.1 + react-lifecycles-compat: 3.0.4 + redux: 3.7.2 + dev: true + + /react-redux@7.2.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} + peerDependencies: + react: ^16.8.3 || ^17 || ^18 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.22.3 + '@types/react-redux': 7.1.25 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 17.0.2 + dev: true + + /react-redux@8.0.5(@types/react-dom@18.2.4)(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1): + resolution: {integrity: sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==} + peerDependencies: + '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: '>=0.59' + redux: ^4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + dependencies: + '@babel/runtime': 7.22.3 + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.2.7 + '@types/react-dom': 18.2.4 + '@types/use-sync-external-store': 0.0.3 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + redux: 4.2.1 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: true + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-router-dom@4.3.1(react@18.2.0): + resolution: {integrity: sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==} + peerDependencies: + react: '>=15' + dependencies: + history: 4.10.1 + invariant: 2.2.4 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-router: 4.3.1(react@18.2.0) + warning: 4.0.3 + dev: true + + /react-router-dom@6.11.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.6.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.11.2(react@18.2.0) + dev: true + + /react-router-dom@6.3.0(react-dom@18.1.0)(react@18.1.0): + resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + history: 5.3.0 + react: 18.1.0 + react-dom: 18.1.0(react@18.1.0) + react-router: 6.3.0(react@18.1.0) + dev: true + + /react-router-dom@6.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + history: 5.3.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.3.0(react@18.2.0) + dev: true + + /react-router-redux@5.0.0-alpha.9(react@18.2.0): + resolution: {integrity: sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw==} + deprecated: This project is no longer maintained. + peerDependencies: + react: '>=15' + dependencies: + history: 4.10.1 + prop-types: 15.8.1 + react: 18.2.0 + react-router: 4.3.1(react@18.2.0) + dev: true + + /react-router@4.3.1(react@18.2.0): + resolution: {integrity: sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==} + peerDependencies: + react: '>=15' + dependencies: + history: 4.10.1 + hoist-non-react-statics: 2.5.5 + invariant: 2.2.4 + loose-envify: 1.4.0 + path-to-regexp: 1.8.0 + prop-types: 15.8.1 + react: 18.2.0 + warning: 4.0.3 + dev: true + + /react-router@6.11.2(react@18.2.0): + resolution: {integrity: sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.6.2 + react: 18.2.0 + dev: true + + /react-router@6.3.0(react@18.1.0): + resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==} + peerDependencies: + react: '>=16.8' + dependencies: + history: 5.3.0 + react: 18.1.0 + dev: true + + /react-router@6.3.0(react@18.2.0): + resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==} + peerDependencies: + react: '>=16.8' + dependencies: + history: 5.3.0 + react: 18.2.0 + dev: true + + /react-sortable-hoc@2.0.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==} + peerDependencies: + prop-types: ^15.5.7 + react: ^16.3.0 || ^17.0.0 + react-dom: ^16.3.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.22.3 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /react-tween-state@0.1.5: + resolution: {integrity: sha512-sJQpjsdn0wjlDIUpfpb7jQGnOG8hAEW2e8k0KPA+xmf5KFa6Xat2JldbmxBhaqP0S/uIXhVE5ymKyH/b9X8nYA==} + dependencies: + raf: 3.4.1 + tween-functions: 1.2.0 + dev: true + + /react@18.1.0: + resolution: {integrity: sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: true + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /reactcss@1.2.3(react@18.2.0): + resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==} + peerDependencies: + react: '*' + dependencies: + lodash: 4.17.21 + react: 18.2.0 + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + dev: true + + /recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + dependencies: + minimatch: 3.1.2 + dev: false + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redux-saga@0.16.2: + resolution: {integrity: sha512-iIjKnRThI5sKPEASpUvySemjzwqwI13e3qP7oLub+FycCRDysLSAOwt958niZW6LhxfmS6Qm1BzbU70w/Koc4w==} + dev: true + + /redux@3.7.2: + resolution: {integrity: sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==} + dependencies: + lodash: 4.17.21 + lodash-es: 4.17.21 + loose-envify: 1.4.0 + symbol-observable: 1.2.0 + dev: true + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.22.3 + dev: true + + /reflect.getprototypeof@1.0.3: + resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + dev: true + + /regenerate-unicode-properties@10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regenerator-transform@0.15.1: + resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} + dependencies: + '@babel/runtime': 7.22.3 + dev: true + + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + dev: true + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + dependencies: + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-stringify@9.0.1: + resolution: {integrity: sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==} + dependencies: + mdast-util-to-markdown: 0.6.5 + dev: true + + /remark@13.0.0: + resolution: {integrity: sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==} + dependencies: + remark-parse: 9.0.0 + remark-stringify: 9.0.1 + unified: 9.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: true + + /renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /reserved-words@0.1.2: + resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==} + dev: true + + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + dev: true + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 9.3.5 + dev: true + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + + /rmc-align@1.0.0: + resolution: {integrity: sha512-3gEa5/+hqqoEVoeQ25KoRc8DOsXIdSaVpaBq1zQFaV941LR3xvZIRTlxTDT/IagYwoGM1KZea/jd7cNMYP34Rg==} + dependencies: + babel-runtime: 6.26.0 + dom-align: 1.12.4 + rc-util: 4.21.1 + dev: true + + /rmc-calendar@1.1.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xxQZaPFDnpHt4IFO8mukYrXSgC1W8LcNVp+EoX4iyeOJFimungOKB/iP5/cy+st8yXq8lUgk9TXsHNtM6Xo6ZA==} + dependencies: + babel-runtime: 6.26.0 + rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0) + rmc-date-picker: 6.0.10(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rmc-cascader@5.0.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PxDhMjWViDdG4SMZqoXtAthGwgDyYnyxxZEE17IDDYsiCHpWtOhoIL8nsI+/hZ212UT/XF2LpqCsOlMoJiYk+w==} + dependencies: + array-tree-filter: 2.1.0 + babel-runtime: 6.26.0 + rmc-picker: 5.0.10(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rmc-date-picker@6.0.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/9+I6lm3EDEl6M7862V6++zFuxwsM0UEq8wSHbotYIPPmyB/65gx1cviblghOv2QfB0O9+U2w3qEJlRP/WsMrA==} + dependencies: + babel-runtime: 6.26.0 + rmc-picker: 5.0.10(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rmc-dialog@1.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-28aJqtPTX6v13Z/aU1WBy1AFIXkE74PxZXde7JvtEIy9hQDTjH8fqOi822BpzAbXCyNE7jF9iFomy3H2ClsDJA==} + dependencies: + babel-runtime: 6.26.0 + rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rmc-drawer@0.4.11: + resolution: {integrity: sha512-YfB9XEJ8iM0MMuLWAK4313uOxSM8NAljC8Cqun1KamXutglYTuRviUuTLNSOzV8HHPp5kNpsVduvPCGLWXvThw==} + engines: {node: '>=4.0.0'} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + prop-types: 15.8.1 + dev: true + + /rmc-feedback@2.0.0: + resolution: {integrity: sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + dev: true + + /rmc-input-number@1.0.5: + resolution: {integrity: sha512-prPkEtoOVde77GnEnEaBeWjBobMOPgGqU5bd0gxfp1kt1pUN740mMpVAcH7uxpJjVfmw+kuGWtiz4S7CueagSg==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + rmc-feedback: 2.0.0 + dev: true + + /rmc-list-view@0.11.5: + resolution: {integrity: sha512-eMOC5394tLNawcdEEhF7boMpQgpjJGDdL5lS+LblAWdBec7Q4EYkUdnrKNbt+O9k5RGM6nSLAGZK5oB4FN85Lg==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + fbjs: 0.8.18 + prop-types: 15.8.1 + warning: 3.0.0 + zscroller: 0.4.8 + dev: true + + /rmc-notification@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9sPxjltFvtRLt2v312Hu7OXwk53pHkBYgINRDmnJ3A5NF1qtJeCCcdN0Xr0fzJ6sbQvtGju822tWHdzYA9u7Vw==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + prop-types: 15.8.1 + rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 4.21.1 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rmc-nuka-carousel@3.0.1: + resolution: {integrity: sha512-w2EPTERMUUZqcUSKFuejjin7xsMlhrLrtS0A/igTXpFJGq3kemDKcRi7q3pSYDuZBHYBl5iV4UqsLLkjdFtrYA==} + dependencies: + exenv: 1.2.2 + raf: 3.4.1 + dev: true + + /rmc-picker@5.0.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-KZ70+WjcaZHnG5GyCxWCPFWAZ12s6NqyrbW73LeqH0WEqaTMMs0sOrk2f4mQAZ/CGT0XcFN6VZLw7Ozoxfn7LA==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + rmc-dialog: 1.1.1(react-dom@18.2.0)(react@18.2.0) + rmc-feedback: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rmc-pull-to-refresh@1.0.13: + resolution: {integrity: sha512-iYLsURiR7G/sKmRA6p2kq6ZXicn7Hyeo6VQFljssV1eMW+fzDgihhaz0kv5mza0f88vphGJvjOihT9E6+xGb6Q==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + dev: true + + /rmc-steps@1.0.1: + resolution: {integrity: sha512-8ijtwp4D1CYTtI2yerXJYqCv+GQbiBc9T12nrFngd/vM0y+58CnznGphTAueF6IWf7qbxBwcjTrcFgg7bP2YGA==} + dependencies: + babel-runtime: 6.26.0 + classnames: 2.3.2 + dev: true + + /rmc-tabs@1.2.29: + resolution: {integrity: sha512-wiJS9WSJi9JH9GQO+FqncX+zaHP31qHa/S8nDW9UXUx0qbCX294QcJEnvfB+WmsfUws7rXjs6sOQp5EDiObnHg==} + dependencies: + babel-runtime: 6.26.0 + rc-gesture: 0.0.22 + dev: true + + /rmc-tooltip@1.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fSDArf2BlMVrHExmBiqb2TkCRJHshvXFJQ/7tMraLellwaJLNiwrxtWpW329k3S+zTtoVG8UxFS1TjBGEsMzRg==} + dependencies: + babel-runtime: 6.26.0 + rmc-trigger: 1.0.12(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rmc-trigger@1.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-AccQniX7PX7Pm8hBhHEsnf3JU6CA61Xc7fAt2WbO+oXrGaI/jqN8C3COhhOXG54S5iTOjLS26j858zshwAxR9A==} + dependencies: + babel-runtime: 6.26.0 + rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 4.21.1 + rmc-align: 1.0.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /rollup-plugin-visualizer@5.9.0: + resolution: {integrity: sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.4 + yargs: 17.7.2 + dev: true + + /rollup@3.23.0: + resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.5.2 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: true + + /safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + dependencies: + regexp-tree: 0.1.27 + dev: true + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: true + optional: true + + /saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /scheduler@0.22.0: + resolution: {integrity: sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==} + dependencies: + loose-envify: 1.4.0 + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + + /schema-utils@2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: false + + /schema-utils@3.1.2: + resolution: {integrity: sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: true + + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + dependencies: + compute-scroll-into-view: 1.0.20 + dev: true + + /scroll-into-view-if-needed@3.0.10: + resolution: {integrity: sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==} + dependencies: + compute-scroll-into-view: 3.0.3 + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: true + + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.1: + resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /shallow-equal@1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} + dev: true + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: false + + /should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + dependencies: + should-type: 1.4.0 + dev: true + + /should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + dev: true + + /should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + dev: true + + /should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + dev: true + + /should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + dev: true + + /should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /single-spa@5.9.4: + resolution: {integrity: sha512-QkEoh0AzGuU82qnbUUk0ydF78QbU5wMKqKKJn7uUQfBiOYlRQEfIOpLM4m23Sab+kTOLI1kbYhYeiQ7fX5KVVw==} + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + /slash2@2.0.0: + resolution: {integrity: sha512-7ElvBydJPi3MHU/KEOblFSbO/skl4Z69jKkFCpYIYVOMSIZsKi4gYU43HGeZPmjxCXrHekoDAAewphPQNnsqtA==} + engines: {node: '>=6'} + dev: true + + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + dependencies: + atomic-sleep: 1.0.0 + dev: true + + /sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + dev: true + + /sort-package-json@1.57.0: + resolution: {integrity: sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==} + hasBin: true + dependencies: + detect-indent: 6.1.0 + detect-newline: 3.1.0 + git-hooks-list: 1.0.3 + globby: 10.0.0 + is-plain-obj: 2.1.0 + sort-object-keys: 1.1.3 + dev: true + + /sort-package-json@2.4.1: + resolution: {integrity: sha512-Nd3rgLBJcZ4iw7tpuOhwBupG6SvUDU0Fy1cZGAMorA2JmDUb+29Dg5phJK9gapa2Ak9d15w/RuMl/viwX+nKwQ==} + hasBin: true + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.0 + git-hooks-list: 3.1.0 + globby: 13.1.4 + is-plain-obj: 4.1.0 + sort-object-keys: 1.1.3 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /specificity@0.4.1: + resolution: {integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==} + hasBin: true + dev: true + + /split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sshpk@1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.5 + dev: true + + /stream-browserify@2.0.2: + resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /stream-buffers@1.0.1: + resolution: {integrity: sha512-t+8bSU8qPq7NnWHWAvikjcZf+biErLZzD15RroYft1IKQwYbkRyiwppT7kNqwdtYLS59YPxc4sTSvwbLSMaodw==} + engines: {node: '>= 0.3.0'} + dev: true + + /stream-http@2.8.3: + resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 2.3.8 + to-arraybuffer: 1.0.1 + xtend: 4.0.2 + dev: true + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: true + + /streamroller@0.4.1: + resolution: {integrity: sha512-w0GGkMlWOiIBIYTmOWHTWKy9Y5hKxGKpQ5WpiHqwhvoSoMHXNTITrk6ZsR3fdgz3Bi/c+CXVHwmfPUQFkEPL+A==} + engines: {node: '>=0.12.0'} + deprecated: 0.x is no longer supported. Please upgrade to 3.x or higher. + dependencies: + date-format: 0.0.0 + debug: 0.7.4 + mkdirp: 0.5.6 + readable-stream: 1.1.14 + transitivePeerDependencies: + - supports-color + dev: true + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: true + + /string-argv@0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + dev: true + + /string-convert@0.2.1: + resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /style-search@0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + dev: true + + /styled-components@5.3.11(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + dependencies: + '@babel/helper-module-imports': 7.21.4 + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.2.1 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.3(styled-components@5.3.11) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + shallowequal: 1.1.0 + supports-color: 5.5.0 + dev: true + + /styled-components@6.0.0-beta.9(react-dom@18.2.0)(react@18.2.0)(tslib@2.5.2): + resolution: {integrity: sha512-RYtmvWZForwSd24aZgi3iGZM/6HvJkP7zobHK+bwC01vI6QhHK5MX9ayXEnJWaFY7DoEWoAnar5ACiGVkTCoCQ==} + engines: {node: '>= 14'} + peerDependencies: + babel-plugin-styled-components: '>= 2' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + shallowequal: '>= 1' + stylis: ^4.0.0 + tslib: ^2.0.0 + peerDependenciesMeta: + babel-plugin-styled-components: + optional: true + shallowequal: + optional: true + stylis: + optional: true + tslib: + optional: true + dependencies: + '@babel/cli': 7.21.5(@babel/core@7.22.1) + '@babel/core': 7.22.1 + '@babel/helper-module-imports': 7.21.4 + '@babel/plugin-external-helpers': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.1) + '@babel/preset-env': 7.22.2(@babel/core@7.22.1) + '@babel/preset-react': 7.22.3(@babel/core@7.22.1) + '@babel/preset-typescript': 7.21.5(@babel/core@7.22.1) + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@emotion/unitless': 0.8.1 + css-to-react-native: 3.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /styled-components@6.0.0-rc.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3+Lnu1NC5JuieYi8dV/nhmlK7/yzqZW43u4P7WgIJfu5Dq5AiPU3t4efu0nWLmlMEmWrSXdrinxfbDnqnpP6hg==} + engines: {node: '>= 14'} + peerDependencies: + babel-plugin-styled-components: '>= 2' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + peerDependenciesMeta: + babel-plugin-styled-components: + optional: true + dependencies: + '@babel/cli': 7.21.5(@babel/core@7.22.1) + '@babel/core': 7.22.1 + '@babel/helper-module-imports': 7.21.4 + '@babel/plugin-external-helpers': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.1) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.1) + '@babel/preset-env': 7.22.2(@babel/core@7.22.1) + '@babel/preset-react': 7.22.3(@babel/core@7.22.1) + '@babel/preset-typescript': 7.21.5(@babel/core@7.22.1) + '@babel/traverse': 7.22.1(supports-color@5.5.0) + '@emotion/unitless': 0.8.1 + css-to-react-native: 3.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + stylis: 4.2.0 + tslib: 2.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /stylelint-config-css-modules@2.3.0(stylelint@13.13.1): + resolution: {integrity: sha512-nSxwaJMv9wBrTAi+O4qXubyi1AR9eB36tJpY0uaFhKgEc3fwWGUzUK1Edl8AQHAoU7wmUeKtsuYjblyRP/V7rw==} + peerDependencies: + stylelint: 11.x - 14.x + dependencies: + stylelint: 13.13.1 + dev: true + + /stylelint-config-prettier@8.0.2(stylelint@13.13.1): + resolution: {integrity: sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==} + engines: {node: '>= 10', npm: '>= 5'} + hasBin: true + peerDependencies: + stylelint: '>=11.0.0' + dependencies: + stylelint: 13.13.1 + dev: true + + /stylelint-config-recommended@3.0.0(stylelint@13.13.1): + resolution: {integrity: sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==} + peerDependencies: + stylelint: '>=10.1.0' + dependencies: + stylelint: 13.13.1 + dev: true + + /stylelint-config-recommended@7.0.0(stylelint@14.16.1): + resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==} + peerDependencies: + stylelint: ^14.4.0 + dependencies: + stylelint: 14.16.1 + dev: true + + /stylelint-config-recommended@7.0.0(stylelint@14.8.2): + resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==} + peerDependencies: + stylelint: ^14.4.0 + dependencies: + stylelint: 14.8.2 + dev: true + + /stylelint-config-standard@20.0.0(stylelint@13.13.1): + resolution: {integrity: sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==} + peerDependencies: + stylelint: '>=10.1.0' + dependencies: + stylelint: 13.13.1 + stylelint-config-recommended: 3.0.0(stylelint@13.13.1) + dev: true + + /stylelint-config-standard@25.0.0(stylelint@14.16.1): + resolution: {integrity: sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==} + peerDependencies: + stylelint: ^14.4.0 + dependencies: + stylelint: 14.16.1 + stylelint-config-recommended: 7.0.0(stylelint@14.16.1) + dev: true + + /stylelint-config-standard@25.0.0(stylelint@14.8.2): + resolution: {integrity: sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==} + peerDependencies: + stylelint: ^14.4.0 + dependencies: + stylelint: 14.8.2 + stylelint-config-recommended: 7.0.0(stylelint@14.8.2) + dev: true + + /stylelint-declaration-block-no-ignored-properties@2.7.0(stylelint@13.13.1): + resolution: {integrity: sha512-44SpI9+9Oc1ICuwwRfwS/3npQ2jPobDSTnwWdNgZGryGqQCp17CgEIWjCv1BgUOSzND3RqywNCNLKvO1AOxbfg==} + engines: {node: '>=6'} + peerDependencies: + stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 + dependencies: + stylelint: 13.13.1 + dev: true + + /stylelint@13.13.1: + resolution: {integrity: sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@stylelint/postcss-css-in-js': 0.37.3(postcss-syntax@0.36.2)(postcss@7.0.39) + '@stylelint/postcss-markdown': 0.36.2(postcss-syntax@0.36.2)(postcss@7.0.39) + autoprefixer: 9.8.8 + balanced-match: 2.0.0 + chalk: 4.1.2 + cosmiconfig: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + execall: 2.0.0 + fast-glob: 3.2.12 + fastest-levenshtein: 1.0.16 + file-entry-cache: 6.0.1 + get-stdin: 8.0.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.2.4 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + known-css-properties: 0.21.0 + lodash: 4.17.21 + log-symbols: 4.1.0 + mathml-tag-names: 2.1.3 + meow: 9.0.0 + micromatch: 4.0.5 + normalize-selector: 0.2.0 + postcss: 7.0.39 + postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39) + 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.13 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + slash: 3.0.0 + specificity: 0.4.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + sugarss: 2.0.0 + svg-tags: 1.0.0 + table: 6.8.1 + v8-compile-cache: 2.3.0 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - postcss-jsx + - postcss-markdown + - supports-color + dev: true + + /stylelint@14.16.1: + resolution: {integrity: sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 7.1.0 + css-functions-list: 3.1.0 + debug: 4.3.4(supports-color@5.5.0) + fast-glob: 3.2.12 + fastest-levenshtein: 1.0.16 + file-entry-cache: 6.0.1 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.2.4 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.26.0 + mathml-tag-names: 2.1.3 + meow: 9.0.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.24 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 6.0.0(postcss@8.4.24) + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + supports-hyperlinks: 2.3.0 + svg-tags: 1.0.0 + table: 6.8.1 + v8-compile-cache: 2.3.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /stylelint@14.8.2: + resolution: {integrity: sha512-tjDfexCYfoPdl/xcDJ9Fv+Ko9cvzbDnmdiaqEn3ovXHXasi/hbkt5tSjsiReQ+ENqnz0eltaX/AOO+AlzVdcNA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 7.1.0 + css-functions-list: 3.1.0 + debug: 4.3.4(supports-color@5.5.0) + execall: 2.0.0 + fast-glob: 3.2.12 + fastest-levenshtein: 1.0.16 + file-entry-cache: 6.0.1 + get-stdin: 8.0.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.2.4 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.25.0 + mathml-tag-names: 2.1.3 + meow: 9.0.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + normalize-selector: 0.2.0 + picocolors: 1.0.0 + postcss: 8.4.24 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 6.0.0(postcss@8.4.24) + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + specificity: 0.4.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + supports-hyperlinks: 2.3.0 + svg-tags: 1.0.0 + table: 6.8.1 + v8-compile-cache: 2.3.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + /sugarss@2.0.0: + resolution: {integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==} + dependencies: + postcss: 7.0.39 + dev: true + + /superjson@1.12.3: + resolution: {integrity: sha512-0j+U70KUtP8+roVPbwfqkyQI7lBt7ETnuA7KXbTDX3mCKiD/4fXs2ldKSMdt0MCfpTwiMxo20yFU3vu6ewETpQ==} + engines: {node: '>=10'} + dependencies: + copy-anything: 3.0.5 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: true + + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /swagger-ui-dist@4.19.0: + resolution: {integrity: sha512-9C9fJGI18gK5AhaU5YRyPY1lXJH4lmWh8h9zFMrJBkYzdRjCbAzYl1ayWPYgwFvag/Luqi3Co599OK/39IS2QQ==} + dev: true + + /swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.6.11 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + dev: true + + /swr@2.1.5(react@18.2.0): + resolution: {integrity: sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + + /symbol-observable@1.2.0: + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} + dev: true + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.1 + tslib: 2.5.2 + dev: true + + /table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /terser-webpack-plugin@5.3.9(webpack@5.84.1): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + jest-worker: 27.5.1 + schema-utils: 3.1.2 + serialize-javascript: 6.0.1 + terser: 5.17.6 + webpack: 5.84.1 + + /terser@5.17.6: + resolution: {integrity: sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.3 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + dependencies: + real-require: 0.1.0 + dev: true + + /throttle-debounce@5.0.0: + resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} + engines: {node: '>=12.22'} + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + dev: true + + /tiny-pinyin@1.3.2: + resolution: {integrity: sha512-uHNGu4evFt/8eNLldazeAM1M8JrMc1jshhJJfVRARTN3yT8HEEibofeQ7QETWQ5ISBjd6fKtTVBCC/+mGS6FpA==} + dev: true + + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + dev: true + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-arraybuffer@1.0.1: + resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} + dev: true + + /to-fast-properties@1.0.3: + resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} + engines: {node: '>=0.10.0'} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + dev: true + + /tough-cookie@4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + dependencies: + punycode: 2.3.0 + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + dev: true + + /ts-node@10.9.1(@types/node@20.2.5)(typescript@5.0.2): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.2.5 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.5.2: + resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + dev: true + + /tsutils@3.21.0(typescript@4.9.5): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: true + + /tsutils@3.21.0(typescript@5.0.2): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.2 + dev: true + + /tsx@3.12.7: + resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} + hasBin: true + dependencies: + '@esbuild-kit/cjs-loader': 2.4.2 + '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/esm-loader': 2.5.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /tty-browserify@0.0.0: + resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tween-functions@1.2.0: + resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + dev: true + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@3.9.10: + resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + + /ua-parser-js@0.7.35: + resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} + dev: true + + /umi-presets-pro@2.0.3(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)(umi@4.0.69): + resolution: {integrity: sha512-sHKynw/fi7UeUftzTRPRsrV5GHV4BWvWYhyvwkg8s+shmt0ROPW/52y4gxBziEvetxl8yWMKUCWk50OUDOcrww==} + dependencies: + '@alita/plugins': 3.2.22(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@umijs/max-plugin-openapi': 2.0.3 + '@umijs/plugins': 4.0.69(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0) + '@umijs/request-record': 1.1.4(umi@4.0.69) + swagger-ui-dist: 4.19.0 + transitivePeerDependencies: + - '@types/lodash.merge' + - '@types/react' + - '@types/react-dom' + - antd + - babel-plugin-styled-components + - chokidar + - debug + - dva + - encoding + - postcss-jsx + - postcss-markdown + - prop-types + - rc-field-form + - react + - react-dom + - react-native + - shallowequal + - stylis + - supports-color + - umi + dev: true + + /umi-request@1.4.0: + resolution: {integrity: sha512-OknwtQZddZHi0Ggi+Vr/olJ7HNMx4AzlywyK0W3NZBT7B0stjeZ9lcztA85dBgdAj3KVk8uPJPZSnGaDjELhrA==} + dependencies: + isomorphic-fetch: 2.2.1 + qs: 6.11.2 + dev: true + + /umi-utils@1.7.3: + resolution: {integrity: sha512-KLUGIKXkuPOq8LACQN57nj9rSPIjLz8eLbR4mZpihJ3BgL3f1bZFvmUV/VYHr9D7PfFH2Vb1Y6UAOuNkKL9g2g==} + dependencies: + chalk: 2.4.2 + dotenv: 8.6.0 + is-url: 1.2.4 + node-fetch: 2.6.0 + prettier: 1.15.3 + slash2: 2.0.0 + dev: true + + /umi@4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react@18.2.7)(eslint@8.35.0)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-n6MqLQnJKpCDPzzMptSBa/2yfawNs0yXSWg6yWwKAyVew+IxodqD99+6i9ssGCudXPaC5AnbjIqF4bwa1IjTWw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@babel/runtime': 7.21.0 + '@umijs/bundler-utils': 4.0.69 + '@umijs/bundler-webpack': 4.0.69(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1) + '@umijs/core': 4.0.69 + '@umijs/lint': 4.0.69(eslint@8.35.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2) + '@umijs/preset-umi': 4.0.69(@types/node@20.2.5)(@types/react@18.2.7)(postcss@8.4.24)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1) + '@umijs/renderer-react': 4.0.69(react-dom@18.2.0)(react@18.2.0) + '@umijs/server': 4.0.69 + '@umijs/test': 4.0.69(@babel/core@7.22.1) + '@umijs/utils': 4.0.69 + prettier-plugin-organize-imports: 3.2.2(prettier@2.8.8)(typescript@5.0.2) + prettier-plugin-packagejson: 2.4.3(prettier@2.8.8) + transitivePeerDependencies: + - '@babel/core' + - '@types/node' + - '@types/react' + - '@types/webpack' + - '@volar/vue-language-plugin-pug' + - '@volar/vue-typescript' + - eslint + - jest + - postcss + - postcss-html + - postcss-jsx + - postcss-less + - postcss-markdown + - postcss-scss + - prettier + - react + - react-dom + - rollup + - sass + - sockjs-client + - styled-components + - stylelint + - stylus + - sugarss + - supports-color + - terser + - type-fest + - typescript + - webpack + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /umi@4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react@18.2.7)(eslint@8.41.0)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2)(webpack@5.84.1): + resolution: {integrity: sha512-n6MqLQnJKpCDPzzMptSBa/2yfawNs0yXSWg6yWwKAyVew+IxodqD99+6i9ssGCudXPaC5AnbjIqF4bwa1IjTWw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@babel/runtime': 7.21.0 + '@umijs/bundler-utils': 4.0.69 + '@umijs/bundler-webpack': 4.0.69(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1) + '@umijs/core': 4.0.69 + '@umijs/lint': 4.0.69(eslint@8.41.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2) + '@umijs/preset-umi': 4.0.69(@types/node@20.2.5)(@types/react@18.2.7)(postcss@8.4.24)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1) + '@umijs/renderer-react': 4.0.69(react-dom@18.2.0)(react@18.2.0) + '@umijs/server': 4.0.69 + '@umijs/test': 4.0.69(@babel/core@7.22.1) + '@umijs/utils': 4.0.69 + prettier-plugin-organize-imports: 3.2.2(prettier@2.8.8)(typescript@5.0.2) + prettier-plugin-packagejson: 2.4.3(prettier@2.8.8) + transitivePeerDependencies: + - '@babel/core' + - '@types/node' + - '@types/react' + - '@types/webpack' + - '@volar/vue-language-plugin-pug' + - '@volar/vue-typescript' + - eslint + - jest + - postcss + - postcss-html + - postcss-jsx + - postcss-less + - postcss-markdown + - postcss-scss + - prettier + - react + - react-dom + - rollup + - sass + - sockjs-client + - styled-components + - stylelint + - stylus + - sugarss + - supports-color + - terser + - type-fest + - typescript + - webpack + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /underscore@1.7.0: + resolution: {integrity: sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==} + dev: true + + /unfetch@5.0.0: + resolution: {integrity: sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==} + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + dependencies: + '@types/unist': 2.0.6 + bail: 1.0.5 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 + dev: true + + /unist-util-find-all-after@3.0.2: + resolution: {integrity: sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==} + dependencies: + unist-util-is: 4.1.0 + dev: true + + /unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + dev: true + + /unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.6): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.6 + escalade: 3.1.1 + picocolors: 1.0.0 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /url@0.11.0: + resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: true + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.7)(react@18.1.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.7 + react: 18.1.0 + dev: true + + /use-json-comparison@1.0.6(react@18.2.0): + resolution: {integrity: sha512-xPadt5yMRbEmVfOSGFSMqjjICrq7nLbfSH3rYIXsrtcuFX7PmbYDN/ku8ObBn3v8o/yZelO1OxUS5+5TI3+fUw==} + peerDependencies: + react: '>=16.9.0' + dependencies: + react: 18.2.0 + + /use-media-antd-query@1.1.0(react@18.2.0): + resolution: {integrity: sha512-B6kKZwNV4R+l4Rl11sWO7HqOay9alzs1Vp1b4YJqjz33YxbltBCZtt/yxXxkXN9rc1S7OeEL/GbwC30Wmqhw6Q==} + peerDependencies: + react: '>=16.9.0' + dependencies: + react: 18.2.0 + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /util@0.10.3: + resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==} + dependencies: + inherits: 2.0.1 + dev: true + + /util@0.11.1: + resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} + dependencies: + inherits: 2.0.3 + dev: true + + /utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /valtio@1.9.0(react@18.2.0): + resolution: {integrity: sha512-mQLFsAlKbYascZygFQh6lXuDjU5WHLoeZ8He4HqMnWfasM96V6rDbeFkw1XeG54xycmDonr/Jb4xgviHtuySrA==} + engines: {node: '>=12.20.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + dependencies: + proxy-compare: 2.4.0 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: true + + /value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + dependencies: + '@types/unist': 2.0.6 + unist-util-stringify-position: 2.0.3 + dev: true + + /vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + dependencies: + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 + dev: true + + /vite@4.3.1(@types/node@20.2.5)(less@4.1.3): + resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.2.5 + esbuild: 0.17.19 + less: 4.1.3 + postcss: 8.4.24 + rollup: 3.23.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + dev: true + + /w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + dependencies: + xml-name-validator: 4.0.0 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /warning@3.0.0: + resolution: {integrity: sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==} + dependencies: + loose-envify: 1.4.0 + dev: true + + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack@5.84.1: + resolution: {integrity: sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.21.6 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.14.1 + es-module-lexer: 1.2.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.1.2 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.84.1) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-fetch@3.6.2: + resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} + dev: true + + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + + /whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.5 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.9 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /ws@6.2.2: + resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + dev: true + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /zscroller@0.4.8: + resolution: {integrity: sha512-G5NiNLKx2+QhhvZi2yV1jjVXY50otktxkseX2hG2N/eixohOUk0AY8ZpbAxNqS9oJS/NxItCsowupy2tsXxAMw==} + dependencies: + babel-runtime: 6.26.0 + dev: true + + /zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + dev: true diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..30c2d4d --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +preview.pro.ant.design \ No newline at end of file diff --git a/public/bg.png b/public/bg.png new file mode 100644 index 0000000..2b08d4f Binary files /dev/null and b/public/bg.png differ diff --git a/public/demos/index.html b/public/demos/index.html new file mode 100644 index 0000000..232f260 --- /dev/null +++ b/public/demos/index.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.6.6/fabric.min.js"></script> + <title>Fabric.js Text Editing</title> +</head> + <style> + body { + background: ivory; + } + </style> +<body> + <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.4.0/fabric.js"></script> --> + <canvas id="c" width="1300" height="1200" ></canvas> + <script> + const canvas = new fabric.Canvas('c') + +fabric.RectWithText = fabric.util.createClass(fabric.Rect, { + type: 'rectWithText', + text: null, + textOffsetLeft: 0, + textOffsetTop: 0, + _prevObjectStacking: null, + _prevAngle: 0, + recalcTextPosition: function () { + const sin = Math.sin(fabric.util.degreesToRadians(this.angle)) + const cos = Math.cos(fabric.util.degreesToRadians(this.angle)) + const newTop = sin * this.textOffsetLeft + cos * this.textOffsetTop + const newLeft = cos * this.textOffsetLeft - sin * this.textOffsetTop + const rectLeftTop = this.getPointByOrigin('left', 'top') + this.text.set('left', rectLeftTop.x + newLeft) + this.text.set('top', rectLeftTop.y + newTop) + }, + initialize: function (rectOptions, textOptions, text) { + this.callSuper('initialize', rectOptions) + this.text = new fabric.Textbox(text, { + ...textOptions, + selectable: false, + evented: false, + }) + this.textOffsetLeft = this.text.left - this.left + this.textOffsetTop = this.text.top - this.top + this.on('moving', () => { + this.recalcTextPosition() + }) + this.on('rotating', () => { + this.text.rotate(this.text.angle + this.angle - this._prevAngle) + this.recalcTextPosition() + this._prevAngle = this.angle + }) + this.on('scaling', (e) => { + this.recalcTextPosition() + }) + this.on('added', () => { + this.canvas.add(this.text) + }) + this.on('removed', () => { + this.canvas.remove(this.text) + }) + this.on('mousedown:before', () => { + this._prevObjectStacking = this.canvas.preserveObjectStacking + this.canvas.preserveObjectStacking = true + }) + //双击 + this.on('mousedblclick', () => { + this.text.selectable = true + this.text.evented = true + this.canvas.setActiveObject(this.text) + this.text.enterEditing() + this.selectable = false + }) + this.on('deselected', () => { + this.canvas.preserveObjectStacking = this._prevObjectStacking + }) + this.text.on('editing:exited', () => { + this.text.selectable = false + this.text.evented = false + this.selectable = true + }) + } +}) + +const rectOptions = { + left: 10, + top: 10, + width: 200, + height: 75, + fill: 'rgba(30, 30, 30, 0.3)', +} +const textOptions = { + left: 35, + top: 30, + width: 150, + fill: 'white', + shadow: new fabric.Shadow({ + color: 'rgba(34, 34, 100, 0.4)', + blur: 2, + offsetX: -2, + offsetY: 2 + }), + fontSize: 30, +} +const rectWithText = new fabric.RectWithText(rectOptions, textOptions, 'Some text') +canvas.add(rectWithText) + + </script> +</body> +</html> diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e2e9325 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/icons/icon-128x128.png b/public/icons/icon-128x128.png new file mode 100644 index 0000000..48d0e23 Binary files /dev/null and b/public/icons/icon-128x128.png differ diff --git a/public/icons/icon-192x192.png b/public/icons/icon-192x192.png new file mode 100644 index 0000000..938e9b5 Binary files /dev/null and b/public/icons/icon-192x192.png differ diff --git a/public/icons/icon-512x512.png b/public/icons/icon-512x512.png new file mode 100644 index 0000000..21fc108 Binary files /dev/null and b/public/icons/icon-512x512.png differ diff --git a/public/images/computePowerAllocation/icon1.png b/public/images/computePowerAllocation/icon1.png new file mode 100644 index 0000000..2c6a354 Binary files /dev/null and b/public/images/computePowerAllocation/icon1.png differ diff --git a/public/images/computePowerAllocation/slideBtn1.png b/public/images/computePowerAllocation/slideBtn1.png new file mode 100644 index 0000000..65b553e Binary files /dev/null and b/public/images/computePowerAllocation/slideBtn1.png differ diff --git a/public/images/computePowerAllocation/slideBtn2.png b/public/images/computePowerAllocation/slideBtn2.png new file mode 100644 index 0000000..91ab9cd Binary files /dev/null and b/public/images/computePowerAllocation/slideBtn2.png differ diff --git a/public/images/icons/logo.svg b/public/images/icons/logo.svg new file mode 100644 index 0000000..9d46ecd --- /dev/null +++ b/public/images/icons/logo.svg @@ -0,0 +1,24 @@ +<svg width="64" height="24" viewBox="0 0 64 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<mask id="mask0_3180_54416" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="64" height="24"> +<rect width="64" height="24" fill="#D9D9D9"/> +</mask> +<g mask="url(#mask0_3180_54416)"> +<path d="M14.039 4.05812L11.9366 4.49908C11.8873 4.51252 11.8707 4.57396 11.9072 4.6098L13.5648 6.2674C13.6006 6.30324 13.6627 6.28724 13.6755 6.23796L14.1203 4.1394C14.1337 4.09012 14.0883 4.04532 14.039 4.05812Z" fill="#E42F2F"/> +<path d="M15.1781 2.93749L12.133 3.75349C12.0972 3.76309 12.0856 3.80789 12.1112 3.83413L14.3404 6.06325C14.3666 6.08949 14.4114 6.07733 14.421 6.04149L15.237 2.99637C15.2466 2.96053 15.214 2.92789 15.1781 2.93749Z" fill="#FAEC18"/> +<path d="M21.4489 12.7755L17.8688 9.19532L16.4736 7.80013C16.3801 7.70669 16.2284 7.70669 16.1344 7.80013L10.0608 13.8737C9.9494 13.9851 9.76828 13.9851 9.65692 13.8737L8.0006 12.2174C7.88924 12.106 7.88924 11.9249 8.0006 11.8136L13.0803 6.73388C13.1737 6.64044 13.1737 6.48877 13.0803 6.39469L11.7017 5.01612C11.6083 4.92268 11.4566 4.92268 11.3625 5.01612L4.47804 11.9019C4.3846 11.9953 4.3846 12.147 4.47804 12.2411L8.10108 15.8641L9.49628 17.2593C9.58972 17.3528 9.7414 17.3528 9.83548 17.2593L16.1657 10.9291C16.2771 10.8177 16.4582 10.8177 16.5696 10.9291L18.2259 12.5854C18.3372 12.6968 18.3372 12.8779 18.2259 12.9892L11.8956 19.3195C11.8022 19.4129 11.8022 19.5646 11.8956 19.6587L13.2313 20.9944C13.3248 21.0878 13.4764 21.0878 13.5705 20.9944L21.4496 13.1153C21.5424 13.0206 21.5424 12.8689 21.4489 12.7755Z" fill="#154DDD"/> +<path d="M33.2839 6.32767H32.0116V5.51871H29.5962V6.21951H28.3239V5.51871H26.1569L26.0596 4.41919H28.3239V3.58911H29.5962V4.41919H32.0116V3.58911H33.2839V4.41919H35.6884V5.51871H33.2839V6.32767ZM26.0596 11.0611L27.0087 8.64575H28.2164L27.3217 11.0611H26.0596ZM33.8445 11.6109C33.7581 12.441 33.2193 12.9587 32.3137 13.0125C31.785 13.0554 30.9441 12.9907 30.2433 12.8723L29.9629 11.8048C30.5882 11.9232 31.3217 11.9776 31.7633 11.945C32.281 11.9232 32.5287 11.6864 32.5613 11.2224C32.6369 10.2842 32.626 9.14111 32.5613 8.24639C32.5505 8.13887 32.5185 8.09535 32.4103 8.09535H30.5127C30.3725 10.6938 29.2621 11.977 26.5985 13.2819L26.2644 12.064C28.162 11.1046 29.0567 9.97247 29.2186 8.09599H26.8468L26.7604 7.01759H29.2404V6.30591H30.5345V7.01759H33.0144C33.5213 7.01759 33.8017 7.32991 33.8445 7.81567C33.8663 8.02047 33.8765 8.21439 33.8874 8.41983H35.0624L35.9252 11.072H34.6209L33.8983 8.65663C33.9629 9.70239 33.9412 10.727 33.8445 11.6109Z" fill="#154DDD"/> +<path d="M39.57 9.79973V9.85349C39.57 10.8884 39.538 11.8913 39.2033 13.2391H37.8555C38.3406 11.5137 38.3515 10.4141 38.3515 9.19557V4.51589C38.3515 4.03077 38.6427 3.76133 39.1604 3.76133H40.8961C41.4139 3.76133 41.7044 4.01989 41.7044 4.51589V12.1716C41.7044 12.7649 41.2948 13.1309 40.6804 13.1745C40.3675 13.1962 40.0443 13.1527 39.8395 13.0989L39.57 11.9885C39.7428 12.0314 39.9905 12.0532 40.1736 12.0532C40.3784 12.0532 40.4865 11.9348 40.4865 11.7511V9.79973H39.57ZM40.4865 4.96902C40.4865 4.90438 40.4436 4.86086 40.379 4.86086H39.6891C39.6244 4.86086 39.5707 4.90374 39.5707 4.96902V6.32773H40.4871V4.96902H40.4865ZM40.4865 7.31973H39.57V8.80773H40.4865V7.31973ZM47.6993 11.8593V12.9805H42.082L41.9745 11.8593H44.3252V9.67046H42.5896L42.4814 8.54917H44.3252V6.53254H43.387C43.2897 6.97478 43.1713 7.39525 43.0203 7.79397H41.8343C42.2439 6.65093 42.4596 5.45413 42.4923 4.07429H43.6462C43.6353 4.53765 43.6033 4.99077 43.5598 5.41125H44.3252V3.54565H45.5867V5.41125H47.3659V6.53254H45.5867V8.54917H47.3012V9.67046H45.5867V11.8593H47.6993Z" fill="#154DDD"/> +<path d="M59.5924 11.9886L59.2039 13.3364C56.8212 12.3335 55.3978 11.5143 54.6433 9.9617C53.8887 11.4171 52.4007 12.4846 49.9853 13.3255L49.6404 12.0315C52.3361 10.9748 53.4356 10.0692 53.8023 8.47306H49.9425L49.8241 7.33002H53.9322C53.9431 7.18986 53.9431 7.03882 53.9431 6.88778V5.19498H50.6113L50.5037 4.09546H58.8058V5.19498H55.2577V7.14634V7.32938H59.3869V8.47242H55.3325C55.9482 10.3604 57.5329 11.2231 59.5924 11.9886Z" fill="#154DDD"/> +<path d="M25.8777 18.3961L26.5938 18.3277C26.6367 18.5632 26.7244 18.7366 26.8562 18.8467C26.9881 18.9574 27.166 19.0125 27.3894 19.0125C27.6262 19.0125 27.8054 18.9632 27.925 18.8653C28.0454 18.7667 28.1055 18.6521 28.1055 18.5203C28.1055 18.4358 28.0799 18.3641 28.0294 18.3046C27.9788 18.2451 27.8905 18.1939 27.7644 18.1498C27.678 18.1203 27.4815 18.0685 27.175 17.9936C26.7801 17.8976 26.5036 17.7798 26.3442 17.6403C26.1202 17.4438 26.0082 17.2038 26.0082 16.9209C26.0082 16.7392 26.0607 16.5689 26.1663 16.4102C26.2719 16.2515 26.423 16.1312 26.6214 16.048C26.8198 15.9654 27.0585 15.9238 27.3388 15.9238C27.7964 15.9238 28.1407 16.0224 28.3724 16.2189C28.6041 16.4153 28.725 16.6777 28.7366 17.0061L28.0006 17.0381C27.9692 16.8544 27.9014 16.7226 27.7977 16.6419C27.694 16.5613 27.5385 16.5216 27.3311 16.5216C27.1174 16.5216 26.9497 16.5645 26.8287 16.6509C26.7506 16.7059 26.7116 16.7801 26.7116 16.8729C26.7116 16.9574 26.7481 17.0298 26.821 17.0899C26.9138 17.1661 27.1391 17.2461 27.4975 17.3286C27.8559 17.4112 28.1202 17.497 28.2924 17.5859C28.4646 17.6749 28.5983 17.7958 28.695 17.9488C28.7922 18.1024 28.8402 18.2918 28.8402 18.5178C28.8402 18.7226 28.782 18.9145 28.6662 19.0931C28.5503 19.2717 28.3858 19.4048 28.174 19.4918C27.9615 19.5789 27.6972 19.6224 27.3804 19.6224C26.9196 19.6224 26.5657 19.5181 26.3186 19.3094C26.0735 19.1001 25.9263 18.7961 25.8777 18.3961Z" fill="#154DDD"/> +<path d="M29.3547 15.9854H30.0907V17.9207C30.0907 18.2279 30.0997 18.427 30.1183 18.5178C30.1496 18.6644 30.2245 18.7815 30.3435 18.8698C30.4619 18.9582 30.6239 19.0029 30.8299 19.0029C31.0386 19.0029 31.196 18.9614 31.3023 18.8775C31.4085 18.7937 31.4725 18.6913 31.4936 18.569C31.5154 18.4474 31.5263 18.2445 31.5263 17.9623V15.9854H32.2623V17.8625C32.2623 18.2913 32.2424 18.5946 32.2027 18.7719C32.1631 18.9492 32.0895 19.0983 31.9826 19.2206C31.8757 19.3428 31.7323 19.4394 31.5538 19.5118C31.3746 19.5841 31.141 19.6199 30.8523 19.6199C30.5042 19.6199 30.2399 19.5802 30.06 19.5015C29.8802 19.4228 29.7381 19.3204 29.6338 19.1943C29.5295 19.0682 29.4603 18.9364 29.4271 18.7981C29.3791 18.5933 29.3547 18.2913 29.3547 17.8913V15.9854Z" fill="#154DDD"/> +<path d="M32.9363 19.559V15.9858H34.1177C34.5651 15.9858 34.8569 16.0038 34.9932 16.0396C35.2019 16.0934 35.3772 16.2098 35.518 16.389C35.6588 16.5689 35.7292 16.8006 35.7292 17.0847C35.7292 17.3042 35.6889 17.4886 35.6076 17.6383C35.5264 17.7881 35.4233 17.9052 35.2979 17.9903C35.1724 18.0754 35.0457 18.1318 34.9164 18.1599C34.7404 18.1938 34.4864 18.2111 34.1529 18.2111H33.6729V19.559H32.9363ZM33.6729 16.59V17.6038H34.0755C34.3654 17.6038 34.5593 17.5852 34.6572 17.5474C34.7552 17.5103 34.832 17.4514 34.887 17.3721C34.9427 17.2927 34.9702 17.1999 34.9702 17.0943C34.9702 16.9644 34.9312 16.8569 34.8531 16.7724C34.775 16.6879 34.6764 16.6348 34.5574 16.6137C34.4697 16.5977 34.2931 16.5894 34.0275 16.5894H33.6729V16.59Z" fill="#154DDD"/> +<path d="M36.2317 19.559V15.9858H38.935V16.5906H36.9677V17.383H38.7981V17.9852H36.9677V18.958H39.0048V19.5602H36.2317V19.559Z" fill="#154DDD"/> +<path d="M39.5295 19.559V15.9858H41.079C41.4687 15.9858 41.7516 16.0178 41.9283 16.0818C42.1049 16.1458 42.2463 16.2604 42.3519 16.4242C42.4575 16.5881 42.5113 16.7762 42.5113 16.9874C42.5113 17.2556 42.4307 17.477 42.27 17.6518C42.1094 17.8265 41.8687 17.9366 41.5487 17.982C41.7081 18.0729 41.8393 18.1727 41.943 18.2815C42.0467 18.3903 42.1862 18.5836 42.3622 18.8614L42.8076 19.5583H41.927L41.3945 18.7807C41.2057 18.503 41.0764 18.3276 41.0067 18.2553C40.9369 18.183 40.8633 18.1337 40.7852 18.1068C40.7071 18.0799 40.5836 18.0665 40.4147 18.0665H40.2655V19.5583H39.5295V19.559ZM40.2662 17.4969H40.8108C41.1641 17.4969 41.3843 17.4822 41.4726 17.4527C41.5609 17.4233 41.6294 17.3734 41.6787 17.3017C41.7279 17.23 41.7535 17.141 41.7535 17.0335C41.7535 16.9132 41.7209 16.8159 41.655 16.7423C41.5891 16.6687 41.4969 16.6214 41.3779 16.6022C41.3183 16.5938 41.1391 16.59 40.8409 16.59H40.2662V17.4969Z" fill="#154DDD"/> +<path d="M43.9417 19.559L42.6387 15.9858H43.4368L44.3596 18.6303L45.2524 15.9858H46.0332L44.7276 19.559H43.9417Z" fill="#154DDD"/> +<path d="M46.2847 19.559V15.9858H47.0207V19.559H46.2847Z" fill="#154DDD"/> +<path d="M47.4341 18.3961L48.1502 18.3277C48.1931 18.5632 48.2808 18.7366 48.4126 18.8467C48.5445 18.9574 48.7224 19.0125 48.9464 19.0125C49.1832 19.0125 49.3618 18.9632 49.4821 18.8653C49.6024 18.7667 49.6626 18.6521 49.6626 18.5203C49.6626 18.4358 49.637 18.3641 49.5864 18.3046C49.5358 18.2451 49.4475 18.1939 49.3214 18.1498C49.235 18.1203 49.0386 18.0685 48.732 17.9936C48.3371 17.8976 48.0606 17.7798 47.9013 17.6403C47.6773 17.4438 47.5653 17.2038 47.5653 16.9209C47.5653 16.7392 47.6178 16.5689 47.7234 16.4102C47.8283 16.2515 47.98 16.1312 48.1784 16.048C48.3762 15.9654 48.6155 15.9238 48.8958 15.9238C49.3534 15.9238 49.6978 16.0224 49.9294 16.2189C50.1605 16.4153 50.2821 16.6777 50.2936 17.0061L49.5576 17.0381C49.5262 16.8544 49.4584 16.7226 49.3547 16.6419C49.251 16.5613 49.0955 16.5216 48.8882 16.5216C48.6744 16.5216 48.5067 16.5645 48.3858 16.6509C48.3077 16.7059 48.2686 16.7801 48.2686 16.8729C48.2686 16.9574 48.3051 17.0298 48.3781 17.0899C48.4709 17.1661 48.6962 17.2461 49.0546 17.3286C49.413 17.4112 49.6773 17.497 49.8494 17.5859C50.0216 17.6749 50.1554 17.7958 50.252 17.9488C50.3493 18.1024 50.3973 18.2918 50.3973 18.5178C50.3973 18.7226 50.339 18.9145 50.2232 19.0931C50.1074 19.2717 49.9429 19.4048 49.731 19.4918C49.5186 19.5789 49.2542 19.6224 48.9374 19.6224C48.4766 19.6224 48.1227 19.5181 47.8757 19.3094C47.6293 19.1001 47.4821 18.7961 47.4341 18.3961Z" fill="#154DDD"/> +<path d="M50.8933 19.559V15.9858H51.6293V19.559H50.8933Z" fill="#154DDD"/> +<path d="M52.0798 17.7939C52.0798 17.4298 52.1355 17.1245 52.2462 16.8774C52.3288 16.6957 52.4421 16.5318 52.5854 16.3872C52.7288 16.2425 52.8862 16.135 53.0565 16.0653C53.2837 15.9712 53.5454 15.9238 53.8424 15.9238C54.3794 15.9238 54.8094 16.087 55.132 16.4141C55.4546 16.7405 55.6158 17.1949 55.6158 17.7766C55.6158 18.3533 55.4558 18.8051 55.1358 19.1309C54.8158 19.4566 54.3877 19.6198 53.8526 19.6198C53.3106 19.6198 52.8792 19.4579 52.5592 19.1334C52.2398 18.8096 52.0798 18.3629 52.0798 17.7939ZM52.8382 17.7696C52.8382 18.1741 52.9336 18.4813 53.1243 18.6899C53.315 18.8985 53.557 19.0029 53.8507 19.0029C54.1445 19.0029 54.3851 18.8992 54.5733 18.6918C54.7614 18.4845 54.8555 18.1741 54.8555 17.7593C54.8555 17.3497 54.764 17.0445 54.581 16.8429C54.3979 16.6413 54.1547 16.5408 53.8507 16.5408C53.5474 16.5408 53.3029 16.6425 53.1173 16.8467C52.931 17.0509 52.8382 17.3587 52.8382 17.7696Z" fill="#154DDD"/> +<path d="M56.0967 19.559V15.9858H56.8128L58.3053 18.3724V15.9858H58.9895V19.559H58.2509L56.7808 17.2287V19.559H56.0967Z" fill="#154DDD"/> +</g> +</svg> diff --git a/public/images/model.png b/public/images/model.png new file mode 100644 index 0000000..9242b28 Binary files /dev/null and b/public/images/model.png differ diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..239bf69 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200" version="1.1" viewBox="0 0 200 200"><title>Group 28 Copy 5</title><desc>Created with Sketch.</desc><defs><linearGradient id="linearGradient-1" x1="62.102%" x2="108.197%" y1="0%" y2="37.864%"><stop offset="0%" stop-color="#4285EB"/><stop offset="100%" stop-color="#2EC7FF"/></linearGradient><linearGradient id="linearGradient-2" x1="69.644%" x2="54.043%" y1="0%" y2="108.457%"><stop offset="0%" stop-color="#29CDFF"/><stop offset="37.86%" stop-color="#148EFF"/><stop offset="100%" stop-color="#0A60FF"/></linearGradient><linearGradient id="linearGradient-3" x1="69.691%" x2="16.723%" y1="-12.974%" y2="117.391%"><stop offset="0%" stop-color="#FA816E"/><stop offset="41.473%" stop-color="#F74A5C"/><stop offset="100%" stop-color="#F51D2C"/></linearGradient><linearGradient id="linearGradient-4" x1="68.128%" x2="30.44%" y1="-35.691%" y2="114.943%"><stop offset="0%" stop-color="#FA8E7D"/><stop offset="51.264%" stop-color="#F74A5C"/><stop offset="100%" stop-color="#F51D2C"/></linearGradient></defs><g id="Page-1" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><g id="logo" transform="translate(-20.000000, -20.000000)"><g id="Group-28-Copy-5" transform="translate(20.000000, 20.000000)"><g id="Group-27-Copy-3"><g id="Group-25" fill-rule="nonzero"><g id="2"><path id="Shape" fill="url(#linearGradient-1)" d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C99.2571609,26.9692191 101.032305,26.9692191 102.20193,28.1378823 L129.985225,55.8983314 C134.193707,60.1033528 141.017005,60.1033528 145.225487,55.8983314 C149.433969,51.69331 149.433969,44.8756232 145.225487,40.6706018 L108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z"/><path id="Shape" fill="url(#linearGradient-2)" d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C100.999864,25.6271836 105.751642,20.541824 112.729652,19.3524487 C117.915585,18.4685261 123.585219,20.4140239 129.738554,25.1889424 C125.624663,21.0784292 118.571995,14.0340304 108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z"/></g><path id="Shape" fill="url(#linearGradient-3)" d="M153.685633,135.854579 C157.894115,140.0596 164.717412,140.0596 168.925894,135.854579 L195.959977,108.842726 C200.659183,104.147384 200.659183,96.5636133 195.960527,91.8688194 L168.690777,64.7181159 C164.472332,60.5180858 157.646868,60.5241425 153.435895,64.7316526 C149.227413,68.936674 149.227413,75.7543607 153.435895,79.9593821 L171.854035,98.3623765 C173.02366,99.5310396 173.02366,101.304724 171.854035,102.473387 L153.685633,120.626849 C149.47715,124.83187 149.47715,131.649557 153.685633,135.854579 Z"/></g><ellipse id="Combined-Shape" cx="100.519" cy="100.437" fill="url(#linearGradient-4)" rx="23.6" ry="23.581"/></g></g></g></g></svg> \ No newline at end of file diff --git a/public/my_logo.svg b/public/my_logo.svg new file mode 100644 index 0000000..dc16d57 --- /dev/null +++ b/public/my_logo.svg @@ -0,0 +1 @@ +<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 220 220"><defs><style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style><clipPath id="clip-path"><rect class="cls-1" x="4.5" y="4.5" width="211.01" height="211.01"/></clipPath></defs><g class="cls-2"><image width="1166" height="221" transform="translate(4.13 4.94) scale(0.95)" xlink:href="data:image/png;base64,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"/></g></svg> \ No newline at end of file diff --git a/public/pro_icon.svg b/public/pro_icon.svg new file mode 100644 index 0000000..e075b78 --- /dev/null +++ b/public/pro_icon.svg @@ -0,0 +1,5 @@ +<svg width="42" height="42" xmlns="http://www.w3.org/2000/svg"> + <g> + <path fill="#070707" d="m6.717392,13.773912l5.6,0c2.8,0 4.7,1.9 4.7,4.7c0,2.8 -2,4.7 -4.9,4.7l-2.5,0l0,4.3l-2.9,0l0,-13.7zm2.9,2.2l0,4.9l1.9,0c1.6,0 2.6,-0.9 2.6,-2.4c0,-1.6 -0.9,-2.4 -2.6,-2.4l-1.9,0l0,-0.1zm8.9,11.5l2.7,0l0,-5.7c0,-1.4 0.8,-2.3 2.2,-2.3c0.4,0 0.8,0.1 1,0.2l0,-2.4c-0.2,-0.1 -0.5,-0.1 -0.8,-0.1c-1.2,0 -2.1,0.7 -2.4,2l-0.1,0l0,-1.9l-2.7,0l0,10.2l0.1,0zm11.7,0.1c-3.1,0 -5,-2 -5,-5.3c0,-3.3 2,-5.3 5,-5.3s5,2 5,5.3c0,3.4 -1.9,5.3 -5,5.3zm0,-2.1c1.4,0 2.2,-1.1 2.2,-3.2c0,-2 -0.8,-3.2 -2.2,-3.2c-1.4,0 -2.2,1.2 -2.2,3.2c0,2.1 0.8,3.2 2.2,3.2z" class="st0" id="Ant-Design-Pro"/> + </g> +</svg> \ No newline at end of file diff --git a/public/scripts/loading.js b/public/scripts/loading.js new file mode 100644 index 0000000..c1ced54 --- /dev/null +++ b/public/scripts/loading.js @@ -0,0 +1,202 @@ +/** + * loading 占位 + * 解决首次加载时白屏的问题 + */ + (function () { + const _root = document.querySelector('#root'); + if (_root && _root.innerHTML === '') { + _root.innerHTML = ` + <style> + html, + body, + #root { + height: 100%; + margin: 0; + padding: 0; + } + #root { + background-repeat: no-repeat; + background-size: 100% auto; + } + + .loading-title { + font-size: 1.1rem; + } + + .loading-sub-title { + margin-top: 20px; + font-size: 1rem; + color: #888; + } + + .page-loading-warp { + display: flex; + align-items: center; + justify-content: center; + padding: 26px; + } + .ant-spin { + position: absolute; + display: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + color: rgba(0, 0, 0, 0.65); + color: #1890ff; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + text-align: center; + list-style: none; + opacity: 0; + -webkit-transition: -webkit-transform 0.3s + cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: -webkit-transform 0.3s + cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), + -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + -webkit-font-feature-settings: "tnum"; + font-feature-settings: "tnum"; + } + + .ant-spin-spinning { + position: static; + display: inline-block; + opacity: 1; + } + + .ant-spin-dot { + position: relative; + display: inline-block; + width: 20px; + height: 20px; + font-size: 20px; + } + + .ant-spin-dot-item { + position: absolute; + display: block; + width: 9px; + height: 9px; + background-color: #1890ff; + border-radius: 100%; + -webkit-transform: scale(0.75); + -ms-transform: scale(0.75); + transform: scale(0.75); + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + opacity: 0.3; + -webkit-animation: antspinmove 1s infinite linear alternate; + animation: antSpinMove 1s infinite linear alternate; + } + + .ant-spin-dot-item:nth-child(1) { + top: 0; + left: 0; + } + + .ant-spin-dot-item:nth-child(2) { + top: 0; + right: 0; + -webkit-animation-delay: 0.4s; + animation-delay: 0.4s; + } + + .ant-spin-dot-item:nth-child(3) { + right: 0; + bottom: 0; + -webkit-animation-delay: 0.8s; + animation-delay: 0.8s; + } + + .ant-spin-dot-item:nth-child(4) { + bottom: 0; + left: 0; + -webkit-animation-delay: 1.2s; + animation-delay: 1.2s; + } + + .ant-spin-dot-spin { + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-animation: antrotate 1.2s infinite linear; + animation: antRotate 1.2s infinite linear; + } + + .ant-spin-lg .ant-spin-dot { + width: 32px; + height: 32px; + font-size: 32px; + } + + .ant-spin-lg .ant-spin-dot i { + width: 14px; + height: 14px; + } + + @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { + .ant-spin-blur { + background: #fff; + opacity: 0.5; + } + } + + @-webkit-keyframes antSpinMove { + to { + opacity: 1; + } + } + + @keyframes antSpinMove { + to { + opacity: 1; + } + } + + @-webkit-keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + } + + @keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + } + </style> + + <div style=" + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + min-height: 362px; + "> + <div class="page-loading-warp"> + <div class="ant-spin ant-spin-lg ant-spin-spinning"> + <span class="ant-spin-dot ant-spin-dot-spin"> + <i class="ant-spin-dot-item"></i> + <i class="ant-spin-dot-item"></i> + <i class="ant-spin-dot-item"></i> + <i class="ant-spin-dot-item"></i> + </span> + </div> + </div> + <div class="loading-title"> + 正在加载资源 + </div> + <div class="loading-sub-title"> + 初次加载资源可能需要较多时间 请耐心等待 + </div> + </div> + `; + } +})(); diff --git a/src/access.ts b/src/access.ts new file mode 100644 index 0000000..4209f2e --- /dev/null +++ b/src/access.ts @@ -0,0 +1,22 @@ +import {IRoute} from "@umijs/max"; + +/** + * @see https://umijs.org/zh-CN/plugins/plugin-access + * */ +export default function access(initialState: { currentUser?: API.CurrentUser } | undefined) { + // const { currentUser } = initialState ?? {}; + // const read_paths = currentUser?.read_paths || [] + // const update_paths = currentUser?.update_paths || [] + return { + // canReadMenu: read_paths?.includes(history.location.pathname), + canReadMenu: (route: IRoute)=>{ + // return read_paths?.includes(route.path) + return true + }, + canUpdate: (path: string)=>{ + // return update_paths?.includes(path) + return true + } + }; +} + diff --git a/src/app.tsx b/src/app.tsx new file mode 100644 index 0000000..94aabbc --- /dev/null +++ b/src/app.tsx @@ -0,0 +1,231 @@ +import { AvatarDropdown, AvatarName, Footer, Question, SelectLang } from '@/components'; +import { LinkOutlined } from '@ant-design/icons'; +import type { Settings as LayoutSettings } from '@ant-design/pro-components'; +import { SettingDrawer } from '@ant-design/pro-components'; +import { RunTimeLayoutConfig, getLocale, history } from '@umijs/max'; +import { RequestConfig } from 'umi'; +import defaultSettings from '../config/defaultSettings'; +import { errorConfig } from './requestErrorConfig'; +const isDev = process.env.NODE_ENV === 'development'; +const loginPath = '/showInfo'; +// @ts-ignore +import { SelectRole } from '@/components/RightContent'; +import zhCN from '@/locales/zh-CN'; +import { postMenuGetMenu } from '@/services/system/Menu'; +import { getUserGetUserInfo } from '@/services/system/User'; +import fixMenuItemIcon from '@/utils/FixMenuItemIcon'; +import { getAllRouteNameTile } from '@/utils/common'; +import { addLocale } from '@@/plugin-locale'; +import { MenuDataItem } from '@ant-design/pro-layout'; +import { Button } from 'antd'; +import cookie from 'react-cookies'; +/** + * @see https://umijs.org/zh-CN/plugins/plugin-initial-state + * */ +// 自定义路由路径集合 +const isCustomPageTitlePaths: string[] = ['/resource/algorithm-model-detail']; + +export async function getInitialState(): Promise<{ + settings?: Partial<LayoutSettings>; + currentUser?: API.UserView; + loading?: boolean; + fetchUserInfo?: any; + menuData?: MenuDataItem[]; +}> { + const fetchUserInfo = async () => { + // try { + // const msg = await getUserGetUserInfo(); + // return msg.data.userInfo; + // } catch (error) { + // history.push(loginPath); + // } + history.push(loginPath); + return undefined; + }; + // 如果不是登录页面,执行 + const { location } = history; + if (location.pathname !== loginPath && localStorage.getItem('access')) { + const currentUser = await fetchUserInfo(); + const menus = await postMenuGetMenu(); + if (getLocale() === 'zh-CN') { + let localData = getAllRouteNameTile(menus.data.routes, ''); + let localRes: any = {}; + localData.forEach((v) => { + // console.log(v.title,'localData_v') + localRes[`menu${v.name}`] = v.title; + }); + console.log(localRes, 'getAllRouteNameTile'); + addLocale('zh-CN', localRes, { + momentLocale: 'zh-CN', + antd: zhCN, + }); + } + + return { + fetchUserInfo, + currentUser, + settings: defaultSettings as Partial<LayoutSettings>, + menuData: [ + { + path: '/welcome', + key: '', + name: 'welcome', + icon: 'HomeOutlined', + access: '', + component: 'Welcome', + title: '首页', + // routes: [], + }, + ], + }; + } + + return { + fetchUserInfo, + settings: defaultSettings as Partial<LayoutSettings>, + }; +} + +// ProLayout 支持的api https://procomponents.ant.design/components/layout +export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => { + return { + actionsRender: () => [ + <SelectRole key="selectRole" />, + <Question key="doc" />, + <SelectLang key="SelectLang" />, + ], + avatarProps: { + src: SERVER_HOST + initialState?.currentUser?.avatarUrl, + title: <AvatarName />, + render: (_, avatarChildren) => { + // console.log(avatarChildren,'') + return <AvatarDropdown>{avatarChildren}</AvatarDropdown>; + }, + }, + pageTitleRender: () => { + console.log(history, 'pageTitleRender'); + // TODO 目前使用路由path全匹配,后续改成从接口字段读取 + let isCustom: boolean = false; + for (let i = 0; i < isCustomPageTitlePaths.length; i++) { + const item = isCustomPageTitlePaths[i]; + if (history.location.pathname.includes(item)) { + isCustom = true; + break; + } else { + isCustom = false; + } + } + return isCustom ? '' : undefined; + // 默认不进行重定义 使用null即可 + }, + footerRender: () => <Footer />, + onPageChange: () => { + const { location } = history; + // 如果没有登录,重定向到 login + if (!initialState?.currentUser && location.pathname !== loginPath) { + history.push(loginPath); + } + }, + menuDataRender: () => { + if (initialState?.menuData !== undefined) { + return fixMenuItemIcon(initialState?.menuData || []); + } + }, + layoutBgImgList: [ + { + src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr', + left: 85, + bottom: 100, + height: '303px', + }, + { + src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr', + bottom: -68, + right: -45, + height: '303px', + }, + { + src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr', + bottom: 0, + left: 0, + width: '331px', + }, + ], + links: isDev + ? [ + // eslint-disable-next-line react/jsx-key + <Button + onClick={() => { + window.open('https://funcion_woqu.gitee.io/fabric-doc/api/'); + }} + > + <LinkOutlined /> + <span>fabric 中文文档</span> + </Button>, + ] + : [], + menuHeaderRender: undefined, + // 自定义 403 页面 + // unAccessible: <div>unAccessible</div>, + // 增加一个 loading 的状态 + childrenRender: (children) => { + // if (initialState?.loading) return <PageLoading />; + return ( + <> + {children} + {isDev && ( + <SettingDrawer + disableUrlParams + enableDarkTheme + settings={initialState?.settings} + onSettingChange={(settings) => { + setInitialState((preInitialState) => ({ + ...preInitialState, + settings, + })); + }} + /> + )} + </> + ); + }, + ...initialState?.settings, + }; +}; + +const csrfAndJwtHeaderInterceptor = (url: string, options: RequestConfig) => { + const csrfHeader = { 'X-CSRFToken': cookie.load('csrftoken') }; + let bearerToken = {}; + const access = localStorage.getItem('access'); + if (access) { + bearerToken = { 'X-Token': `${access}` }; + } + let locale = getLocale(); + return { + url: `${url}`, + options: { + ...options, + interceptors: true, + headers: { ...csrfHeader, ...bearerToken, 'Accept-Language': locale }, + }, + }; +}; + +const responseHeaderInterceptor = (response: Response) => { + if ('new-token' in response.headers) { + localStorage.setItem('access', (response.headers['new-token'] || '') as string); + window.location.reload(); + } + return response; +}; + +/** + * @name request 配置,可以配置错误处理 + * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。 + * @doc https://umijs.org/docs/max/request#配置 + */ +export const request = { + ...errorConfig, + requestInterceptors: [csrfAndJwtHeaderInterceptor], + responseInterceptors: [responseHeaderInterceptor], +}; diff --git a/src/components/BatchOperation/isBatchDelete.tsx b/src/components/BatchOperation/isBatchDelete.tsx new file mode 100644 index 0000000..30f384b --- /dev/null +++ b/src/components/BatchOperation/isBatchDelete.tsx @@ -0,0 +1,54 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-16 14:30:15 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-16 14:35:20 + * @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { ExclamationCircleOutlined } from '@ant-design/icons'; +// import { useIntl } from '@ant-design/pro-components'; +import { useIntl } from '@umijs/max'; +import { Button, Modal } from 'antd'; +import { FormattedMessage } from 'react-intl'; + +type IsBatchDeleteProps = { + // eslint-disable-next-line @typescript-eslint/ban-types + deleteApi: Function; +}; + +const IsBatchDelete: React.FC<IsBatchDeleteProps> = (props) => { + const intl = useIntl(); + + return ( + <Button + danger + onClick={async () => { + Modal.confirm({ + icon: <ExclamationCircleOutlined />, + title: intl.formatMessage({ + id: 'common.modal.table.delete.title', + defaultMessage: '$$$', + }), + content: intl.formatMessage({ + id: 'common.modal.table.delete.content', + defaultMessage: '$$$', + }), + okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' }), + cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' }), + onOk() { + // TODO 未对接批量删除接口 + props.deleteApi(); + }, + onCancel() { + console.log('Cancel'); + }, + }); + }} + > + <FormattedMessage id="pages.searchTable.batchDeletion" defaultMessage="Batch deletion" /> + </Button> + ); +}; + +export default IsBatchDelete; diff --git a/src/components/DictionaryBox/isEnable.tsx b/src/components/DictionaryBox/isEnable.tsx new file mode 100644 index 0000000..767702b --- /dev/null +++ b/src/components/DictionaryBox/isEnable.tsx @@ -0,0 +1,32 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-15 15:01:34 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-22 13:24:58 + * @FilePath: \general-ai-platform-web\src\components\DictionaryBox\isEnable.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { isEnableEnum } from '@/enums/common'; +import { Badge } from 'antd'; +import { FormattedMessage } from 'react-intl'; + +type IsEnableBoxProps = { + isEnable: boolean; +}; + +const IsEnableBox: React.FC<IsEnableBoxProps> = (props) => { + const { isEnable } = props; + + const currentItem = isEnableEnum[isEnable ? '1' : '0'] + + return ( + <div style={{ display: 'flex', alignItems: 'center'}}> + <Badge status={isEnable ? 'success' : 'default'}></Badge> + <span style={{color: currentItem.color, paddingLeft: 4 }}> + <FormattedMessage id={isEnable ? 'common.enable' : 'common.disable'} defaultMessage="$$$" /> + </span> + </div> + ); +}; + +export default IsEnableBox; diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx new file mode 100644 index 0000000..0ca2152 --- /dev/null +++ b/src/components/Footer/index.tsx @@ -0,0 +1,18 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-22 10:02:59 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-05 10:56:42 + * @FilePath: \react-adpro-fabric\src\components\Footer\index.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { GithubOutlined } from '@ant-design/icons'; +import { DefaultFooter } from '@ant-design/pro-components'; +import { useIntl } from '@umijs/max'; +import React from 'react'; + +const Footer: React.FC = () => { + return <></> +}; + +export default Footer; diff --git a/src/components/HeaderDropdown/index.tsx b/src/components/HeaderDropdown/index.tsx new file mode 100644 index 0000000..52abe00 --- /dev/null +++ b/src/components/HeaderDropdown/index.tsx @@ -0,0 +1,23 @@ +import { Dropdown } from 'antd'; +import type { DropDownProps } from 'antd/es/dropdown'; +import React from 'react'; +import { useEmotionCss } from '@ant-design/use-emotion-css'; +import classNames from 'classnames'; + +export type HeaderDropdownProps = { + overlayClassName?: string; + placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter'; +} & Omit<DropDownProps, 'overlay'>; + +const HeaderDropdown: React.FC<HeaderDropdownProps> = ({ overlayClassName: cls, ...restProps }) => { + const className = useEmotionCss(({ token }) => { + return { + [`@media screen and (max-width: ${token.screenXS}px)`]: { + width: '100%', + }, + }; + }); + return <Dropdown overlayClassName={classNames(className, cls)} {...restProps} />; +}; + +export default HeaderDropdown; diff --git a/src/components/IconSelector/Category.tsx b/src/components/IconSelector/Category.tsx new file mode 100644 index 0000000..1a862c3 --- /dev/null +++ b/src/components/IconSelector/Category.tsx @@ -0,0 +1,63 @@ +import * as React from 'react'; +import CopyableIcon from './CopyableIcon'; +import type { ThemeType } from './index'; +import type { CategoriesKeys } from './fields'; +import { useIntl } from '@umijs/max'; +import styles from './style.less'; + +interface CategoryProps { + title: CategoriesKeys; + icons: string[]; + theme: ThemeType; + newIcons: string[]; + onSelect: (type: string, name: string) => any; +} + +const Category: React.FC<CategoryProps> = props => { + + const { icons, title, newIcons, theme } = props; + const intl = useIntl(); + const [justCopied, setJustCopied] = React.useState<string | null>(null); + const copyId = React.useRef<NodeJS.Timeout | null>(null); + const onSelect = React.useCallback((type: string, text: string) => { + const { onSelect } = props; + if (onSelect) { + onSelect(type, text); + } + setJustCopied(type); + copyId.current = setTimeout(() => { + setJustCopied(null); + }, 2000); + }, []); + React.useEffect( + () => () => { + if (copyId.current) { + clearTimeout(copyId.current); + } + }, + [], + ); + + return ( + <div> + <h4 style={{paddingTop: 16}}>{intl.formatMessage({ + id: `app.docs.components.icon.category.${title}`, + defaultMessage: '信息', + })}</h4> + <ul className={styles.anticonsList}> + {icons.map(name => ( + <CopyableIcon + key={name} + name={name} + theme={theme} + isNew={newIcons.includes(name)} + justCopied={justCopied} + onSelect={onSelect} + /> + ))} + </ul> + </div> + ); +}; + +export default Category; diff --git a/src/components/IconSelector/CopyableIcon.tsx b/src/components/IconSelector/CopyableIcon.tsx new file mode 100644 index 0000000..214b5c7 --- /dev/null +++ b/src/components/IconSelector/CopyableIcon.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; +import { Tooltip } from 'antd'; +import classNames from 'classnames'; +import * as AntdIcons from '@ant-design/icons'; +import type { ThemeType } from './index'; +import styles from './style.less'; + +const allIcons: { + [key: string]: any; +} = AntdIcons; + +export interface CopyableIconProps { + name: string; + isNew: boolean; + theme: ThemeType; + justCopied: string | null; + onSelect: (type: string, text: string) => any; +} + +const CopyableIcon: React.FC<CopyableIconProps> = ({ + name, + justCopied, + onSelect, + theme, +}) => { + const className = classNames({ + gn: true, + themeBgHover: true, + copied: justCopied === name, + [theme]: !!theme, + }); + return ( + <li className={className} + style={{ + lineHeight: '48px', + }} + onClick={() => { + if (onSelect) { + onSelect(theme, name); + } + }}> + <Tooltip title={name}> + {React.createElement(allIcons[name], { className: styles.anticon })} + </Tooltip> + {/* <span className={styles.anticonClass}> + <Badge dot={isNew}>{name}</Badge> + </span> */} + </li> + ); +}; + +export default CopyableIcon; diff --git a/src/components/IconSelector/IconPicSearcher.tsx b/src/components/IconSelector/IconPicSearcher.tsx new file mode 100644 index 0000000..3a4cf01 --- /dev/null +++ b/src/components/IconSelector/IconPicSearcher.tsx @@ -0,0 +1,233 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import { Upload, Tooltip, Popover, Modal, Progress, Spin, Result } from 'antd'; +import * as AntdIcons from '@ant-design/icons'; +import { useIntl } from '@umijs/max'; +import './style.less'; + +const allIcons: { [key: string]: any } = AntdIcons; + +const { Dragger } = Upload; +interface AntdIconClassifier { + load: () => void; + predict: (imgEl: HTMLImageElement) => void; +} +declare global { + interface Window { + antdIconClassifier: AntdIconClassifier; + } +} + +interface PicSearcherState { + loading: boolean; + modalOpen: boolean; + popoverVisible: boolean; + icons: iconObject[]; + fileList: any[]; + error: boolean; + modelLoaded: boolean; +} + +interface iconObject { + type: string; + score: number; +} + +const PicSearcher: React.FC = () => { + const intl = useIntl(); + const {formatMessage} = intl; + const [state, setState] = useState<PicSearcherState>({ + loading: false, + modalOpen: false, + popoverVisible: false, + icons: [], + fileList: [], + error: false, + modelLoaded: false, + }); + const predict = (imgEl: HTMLImageElement) => { + try { + let icons: any[] = window.antdIconClassifier.predict(imgEl); + if (gtag && icons.length) { + gtag('event', 'icon', { + event_category: 'search-by-image', + event_label: icons[0].className, + }); + } + icons = icons.map(i => ({ score: i.score, type: i.className.replace(/\s/g, '-') })); + setState(prev => ({ ...prev, loading: false, error: false, icons })); + } catch { + setState(prev => ({ ...prev, loading: false, error: true })); + } + }; + // eslint-disable-next-line class-methods-use-this + const toImage = (url: string) => + new Promise(resolve => { + const img = new Image(); + img.setAttribute('crossOrigin', 'anonymous'); + img.src = url; + img.onload = () => { + resolve(img); + }; + }); + + const uploadFile = useCallback((file: File) => { + setState(prev => ({ ...prev, loading: true })); + const reader = new FileReader(); + reader.onload = () => { + toImage(reader.result as string).then(predict); + setState(prev => ({ + ...prev, + fileList: [{ uid: 1, name: file.name, status: 'done', url: reader.result }], + })); + }; + reader.readAsDataURL(file); + }, []); + + const onPaste = useCallback((event: ClipboardEvent) => { + const items = event.clipboardData && event.clipboardData.items; + let file = null; + if (items && items.length) { + for (let i = 0; i < items.length; i++) { + if (items[i].type.includes('image')) { + file = items[i].getAsFile(); + break; + } + } + } + if (file) { + uploadFile(file); + } + }, []); + const toggleModal = useCallback(() => { + setState(prev => ({ + ...prev, + modalOpen: !prev.modalOpen, + popoverVisible: false, + fileList: [], + icons: [], + })); + if (!localStorage.getItem('disableIconTip')) { + localStorage.setItem('disableIconTip', 'true'); + } + }, []); + + useEffect(() => { + const script = document.createElement('script'); + script.onload = async () => { + await window.antdIconClassifier.load(); + setState(prev => ({ ...prev, modelLoaded: true })); + document.addEventListener('paste', onPaste); + }; + script.src = 'https://cdn.jsdelivr.net/gh/lewis617/antd-icon-classifier@0.0/dist/main.js'; + document.head.appendChild(script); + setState(prev => ({ ...prev, popoverVisible: !localStorage.getItem('disableIconTip') })); + return () => { + document.removeEventListener('paste', onPaste); + }; + }, []); + + return ( + <div className="iconPicSearcher"> + <Popover + content={formatMessage({id: 'app.docs.components.icon.pic-searcher.intro'})} + open={state.popoverVisible} + > + <AntdIcons.CameraOutlined className="icon-pic-btn" onClick={toggleModal} /> + </Popover> + <Modal + title={intl.formatMessage({ + id: 'app.docs.components.icon.pic-searcher.title', + defaultMessage: '信息', + })} + open={state.modalOpen} + onCancel={toggleModal} + footer={null} + > + {state.modelLoaded || ( + <Spin + spinning={!state.modelLoaded} + tip={formatMessage({ + id: 'app.docs.components.icon.pic-searcher.modelloading', + + })} + > + <div style={{ height: 100 }} /> + </Spin> + )} + {state.modelLoaded && ( + <Dragger + accept="image/jpeg, image/png" + listType="picture" + customRequest={o => uploadFile(o.file as File)} + fileList={state.fileList} + showUploadList={{ showPreviewIcon: false, showRemoveIcon: false }} + > + <p className="ant-upload-drag-icon"> + <AntdIcons.InboxOutlined /> + </p> + <p className="ant-upload-text"> + {formatMessage({id: 'app.docs.components.icon.pic-searcher.upload-text'})} + </p> + <p className="ant-upload-hint"> + {formatMessage({id: 'app.docs.components.icon.pic-searcher.upload-hint'})} + </p> + </Dragger> + )} + <Spin + spinning={state.loading} + tip={formatMessage({id: 'app.docs.components.icon.pic-searcher.matching'})} + > + <div className="icon-pic-search-result"> + {state.icons.length > 0 && ( + <div className="result-tip"> + {formatMessage({id: 'app.docs.components.icon.pic-searcher.result-tip'})} + </div> + )} + <table> + {state.icons.length > 0 && ( + <thead> + <tr> + <th className="col-icon"> + {formatMessage({id: 'app.docs.components.icon.pic-searcher.th-icon'})} + </th> + <th>{formatMessage({id: 'app.docs.components.icon.pic-searcher.th-score'})}</th> + </tr> + </thead> + )} + <tbody> + {state.icons.map(icon => { + const { type } = icon; + const iconName = `${type + .split('-') + .map(str => `${str[0].toUpperCase()}${str.slice(1)}`) + .join('')}Outlined`; + return ( + <tr key={iconName}> + <td className="col-icon"> + <Tooltip title={icon.type} placement="right"> + {React.createElement(allIcons[iconName])} + </Tooltip> + </td> + <td> + <Progress percent={Math.ceil(icon.score * 100)} /> + </td> + </tr> + ); + })} + </tbody> + </table> + {state.error && ( + <Result + status="500" + title="503" + subTitle={formatMessage({id: 'app.docs.components.icon.pic-searcher.server-error'})} + /> + )} + </div> + </Spin> + </Modal> + </div> + ); +}; + +export default PicSearcher; diff --git a/src/components/IconSelector/fields.ts b/src/components/IconSelector/fields.ts new file mode 100644 index 0000000..de37e67 --- /dev/null +++ b/src/components/IconSelector/fields.ts @@ -0,0 +1,223 @@ +import * as AntdIcons from '@ant-design/icons/lib/icons'; + +const all = Object.keys(AntdIcons) + .map(n => n.replace(/(Outlined|Filled|TwoTone)$/, '')) + .filter((n, i, arr) => arr.indexOf(n) === i); + +const direction = [ + 'StepBackward', + 'StepForward', + 'FastBackward', + 'FastForward', + 'Shrink', + 'ArrowsAlt', + 'Down', + 'Up', + 'Left', + 'Right', + 'CaretUp', + 'CaretDown', + 'CaretLeft', + 'CaretRight', + 'UpCircle', + 'DownCircle', + 'LeftCircle', + 'RightCircle', + 'DoubleRight', + 'DoubleLeft', + 'VerticalLeft', + 'VerticalRight', + 'VerticalAlignTop', + 'VerticalAlignMiddle', + 'VerticalAlignBottom', + 'Forward', + 'Backward', + 'Rollback', + 'Enter', + 'Retweet', + 'Swap', + 'SwapLeft', + 'SwapRight', + 'ArrowUp', + 'ArrowDown', + 'ArrowLeft', + 'ArrowRight', + 'PlayCircle', + 'UpSquare', + 'DownSquare', + 'LeftSquare', + 'RightSquare', + 'Login', + 'Logout', + 'MenuFold', + 'MenuUnfold', + 'BorderBottom', + 'BorderHorizontal', + 'BorderInner', + 'BorderOuter', + 'BorderLeft', + 'BorderRight', + 'BorderTop', + 'BorderVerticle', + 'PicCenter', + 'PicLeft', + 'PicRight', + 'RadiusBottomleft', + 'RadiusBottomright', + 'RadiusUpleft', + 'RadiusUpright', + 'Fullscreen', + 'FullscreenExit', +]; + +const suggestion = [ + 'Question', + 'QuestionCircle', + 'Plus', + 'PlusCircle', + 'Pause', + 'PauseCircle', + 'Minus', + 'MinusCircle', + 'PlusSquare', + 'MinusSquare', + 'Info', + 'InfoCircle', + 'Exclamation', + 'ExclamationCircle', + 'Close', + 'CloseCircle', + 'CloseSquare', + 'Check', + 'CheckCircle', + 'CheckSquare', + 'ClockCircle', + 'Warning', + 'IssuesClose', + 'Stop', +]; + +const editor = [ + 'Edit', + 'Form', + 'Copy', + 'Scissor', + 'Delete', + 'Snippets', + 'Diff', + 'Highlight', + 'AlignCenter', + 'AlignLeft', + 'AlignRight', + 'BgColors', + 'Bold', + 'Italic', + 'Underline', + 'Strikethrough', + 'Redo', + 'Undo', + 'ZoomIn', + 'ZoomOut', + 'FontColors', + 'FontSize', + 'LineHeight', + 'Dash', + 'SmallDash', + 'SortAscending', + 'SortDescending', + 'Drag', + 'OrderedList', + 'UnorderedList', + 'RadiusSetting', + 'ColumnWidth', + 'ColumnHeight', +]; + +const data = [ + 'AreaChart', + 'PieChart', + 'BarChart', + 'DotChart', + 'LineChart', + 'RadarChart', + 'HeatMap', + 'Fall', + 'Rise', + 'Stock', + 'BoxPlot', + 'Fund', + 'Sliders', +]; + +const logo = [ + 'Android', + 'Apple', + 'Windows', + 'Ie', + 'Chrome', + 'Github', + 'Aliwangwang', + 'Dingding', + 'WeiboSquare', + 'WeiboCircle', + 'TaobaoCircle', + 'Html5', + 'Weibo', + 'Twitter', + 'Wechat', + 'Youtube', + 'AlipayCircle', + 'Taobao', + 'Skype', + 'Qq', + 'MediumWorkmark', + 'Gitlab', + 'Medium', + 'Linkedin', + 'GooglePlus', + 'Dropbox', + 'Facebook', + 'Codepen', + 'CodeSandbox', + 'CodeSandboxCircle', + 'Amazon', + 'Google', + 'CodepenCircle', + 'Alipay', + 'AntDesign', + 'AntCloud', + 'Aliyun', + 'Zhihu', + 'Slack', + 'SlackSquare', + 'Behance', + 'BehanceSquare', + 'Dribbble', + 'DribbbleSquare', + 'Instagram', + 'Yuque', + 'Alibaba', + 'Yahoo', + 'Reddit', + 'Sketch', + 'WhatsApp', + 'Dingtalk', +]; + +const datum = [...direction, ...suggestion, ...editor, ...data, ...logo]; + +const other = all.filter(n => !datum.includes(n)); + +export const categories = { + direction, + suggestion, + editor, + data, + logo, + other, +}; + +export default categories; + +export type Categories = typeof categories; +export type CategoriesKeys = keyof Categories; diff --git a/src/components/IconSelector/icon.ts b/src/components/IconSelector/icon.ts new file mode 100644 index 0000000..041a68e --- /dev/null +++ b/src/components/IconSelector/icon.ts @@ -0,0 +1,11 @@ +import React from 'react' +import * as icons from '@ant-design/icons' +// 自定义样式style +const Icon = (props: { icon: string, style?: object}) => { + const { icon, style } = props; + const antIcon: { [key: string]: any } = icons; + return React.createElement(antIcon[icon], { style }); + +}; + +export default Icon diff --git a/src/components/IconSelector/index.tsx b/src/components/IconSelector/index.tsx new file mode 100644 index 0000000..db88e69 --- /dev/null +++ b/src/components/IconSelector/index.tsx @@ -0,0 +1,147 @@ +import * as React from 'react'; +import Icon, * as AntdIcons from '@ant-design/icons'; +import { Radio, Input, Empty } from 'antd'; +import type { RadioChangeEvent } from 'antd/es/radio/interface'; +import {debounce } from 'lodash'; +import Category from './Category'; +import IconPicSearcher from './IconPicSearcher'; +import { FilledIcon, OutlinedIcon, TwoToneIcon } from './themeIcons'; +import type { CategoriesKeys } from './fields'; +import { categories } from './fields'; +// import { useIntl } from '@umijs/max'; + +export enum ThemeType { + Filled = 'Filled', + Outlined = 'Outlined', + TwoTone = 'TwoTone', +} + +const allIcons: { [key: string]: any } = AntdIcons; + +interface IconSelectorProps { + //intl: any; + onSelect: any; +} + +interface IconSelectorState { + theme: ThemeType; + searchKey: string; +} + +const IconSelector: React.FC<IconSelectorProps> = (props) => { + // const intl = useIntl(); + // const { messages } = intl; + const { onSelect } = props; + const [displayState, setDisplayState] = React.useState<IconSelectorState>({ + theme: ThemeType.Outlined, + searchKey: '', + }); + + const newIconNames: string[] = []; + + const handleSearchIcon = React.useCallback( + debounce((searchKey: string) => { + setDisplayState(prevState => ({ ...prevState, searchKey })); + }), + [], + ); + + const handleChangeTheme = React.useCallback((e: RadioChangeEvent) => { + setDisplayState(prevState => ({ ...prevState, theme: e.target.value as ThemeType })); + }, []); + + const renderCategories = React.useMemo<React.ReactNode | React.ReactNode[]>(() => { + const { searchKey = '', theme } = displayState; + + const categoriesResult = Object.keys(categories) + .map((key: CategoriesKeys) => { + let iconList = categories[key]; + if (searchKey) { + const matchKey = searchKey + // eslint-disable-next-line prefer-regex-literals + .replace(new RegExp(`^<([a-zA-Z]*)\\s/>$`, 'gi'), (_, name) => name) + .replace(/(Filled|Outlined|TwoTone)$/, '') + .toLowerCase(); + iconList = iconList.filter((iconName:string) => iconName.toLowerCase().includes(matchKey)); + } + + // CopyrightCircle is same as Copyright, don't show it + iconList = iconList.filter((icon:string) => icon !== 'CopyrightCircle'); + + return { + category: key, + icons: iconList.map((iconName:string) => iconName + theme).filter((iconName:string) => allIcons[iconName]), + }; + }) + .filter(({ icons }) => !!icons.length) + .map(({ category, icons }) => ( + <Category + key={category} + title={category as CategoriesKeys} + theme={theme} + icons={icons} + newIcons={newIconNames} + onSelect={(type, name) => { + if (onSelect) { + onSelect(name, allIcons[name]); + } + }} + /> + )); + return categoriesResult.length === 0 ? <Empty style={{ margin: '2em 0' }} /> : categoriesResult; + }, [displayState.searchKey, displayState.theme]); + return ( + <> + <div className='gn' style={{ display: 'flex', justifyContent: 'space-between' }}> + {/* + * //TODO 二级:输入框上方提示文案悬浮会覆盖清空菜单图标项按钮 + */} + <Input.Search + // placeholder={messages['app.docs.components.icon.search.placeholder']} + style={{ marginRight: 12, flex: 1 }} + allowClear + onChange={e => handleSearchIcon(e.currentTarget.value)} + size="large" + autoFocus + suffix={<IconPicSearcher />} + /> + {/* <Icon component={OutlinedIcon} /> <Icon component={FilledIcon} TwoToneIcon /> */} + <Radio.Group + value={displayState.theme} + onChange={handleChangeTheme} + size="large" + optionType="button" + buttonStyle="solid" + options={[ + { + label: <>线性</> , + value: ThemeType.Outlined + }, + { + label: <>填充</> , + value: ThemeType.Filled + }, + { + label: <>彩色</>, + value: ThemeType.TwoTone + }, + ]} + > + {/* <Radio.Button value={ThemeType.Outlined}> + <Icon components={OutlinedIcon} /> {messages['app.docs.components.icon.outlined']} + </Radio.Button> + <Radio.Button value={ThemeType.Filled}> + <Icon components={FilledIcon} /> {messages['app.docs.components.icon.filled']} + </Radio.Button> + <Radio.Button value={ThemeType.TwoTone}> + <Icon components={TwoToneIcon} /> {messages['app.docs.components.icon.two-tone']} + </Radio.Button> */} + </Radio.Group> + + </div> + {renderCategories} + </> + ); +}; + +export default IconSelector diff --git a/src/components/IconSelector/style.less b/src/components/IconSelector/style.less new file mode 100644 index 0000000..0a4353d --- /dev/null +++ b/src/components/IconSelector/style.less @@ -0,0 +1,137 @@ +.iconPicSearcher { + display: inline-block; + margin: 0 8px; + + .icon-pic-btn { + color: @text-color-secondary; + cursor: pointer; + transition: all 0.3s; + + &:hover { + color: @input-icon-hover-color; + } + } +} + +.icon-pic-preview { + width: 30px; + height: 30px; + margin-top: 10px; + padding: 8px; + text-align: center; + border: 1px solid @border-color-base; + border-radius: 4px; + + > img { + max-width: 50px; + max-height: 50px; + } +} + +.icon-pic-search-result { + min-height: 50px; + padding: 0 10px; + + > .result-tip { + padding: 10px 0; + color: @text-color-secondary; + } + + > table { + width: 100%; + + .col-icon { + width: 80px; + padding: 10px 0; + + > .anticon { + font-size: 30px; + + :hover { + color: @link-hover-color; + } + } + } + } +} + +ul.anticonsList { + margin: 2px 0; + overflow: hidden; + direction: ltr; + list-style: none; + + li { + position: relative; + float: left; + width: 48px; + height: 48px; + margin: 3px 0; + padding: 2px 0 0; + overflow: hidden; + color: #555; + text-align: center; + list-style: none; + background-color: inherit; + border-radius: 4px; + cursor: pointer; + transition: color 0.3s ease-in-out, background-color 0.3s ease-in-out; + + .rtl & { + margin: 3px 0; + padding: 2px 0 0; + } + + .anticon { + margin: 4px 0 2px; + font-size: 24px; + transition: transform 0.3s ease-in-out; + will-change: transform; + } + + .anticonClass { + display: block; + font-family: 'Lucida Console', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + white-space: nowrap; + text-align: center; + transform: scale(0.83); + + .ant-badge { + transition: color 0.3s ease-in-out; + } + } + + &:hover { + color: #fff; + background-color: @primary-color; + + .anticon { + transform: scale(1.4); + } + + .ant-badge { + color: #fff; + } + } + + &.TwoTone:hover { + background-color: #8ecafe; + } + + &.copied:hover { + color: rgba(255, 255, 255, 0.2); + } + + &.copied::after { + top: -2px; + opacity: 1; + } + } +} + +.copied-code { + padding: 2px 4px; + font-size: 12px; + background: #f5f5f5; + border-radius: 2px; +} diff --git a/src/components/IconSelector/themeIcons.tsx b/src/components/IconSelector/themeIcons.tsx new file mode 100644 index 0000000..abefe04 --- /dev/null +++ b/src/components/IconSelector/themeIcons.tsx @@ -0,0 +1,41 @@ +import * as React from 'react'; + + +export const FilledIcon: React.FC = props => { + const path = + 'M864 64H160C107 64 64 107 64 160v' + + '704c0 53 43 96 96 96h704c53 0 96-43 96-96V16' + + '0c0-53-43-96-96-96z'; + return ( + <svg {...props} viewBox="0 0 1024 1024"> + <path d={path} /> + </svg> + ); +}; + +export const OutlinedIcon: React.FC = props => { + const path = + 'M864 64H160C107 64 64 107 64 160v7' + + '04c0 53 43 96 96 96h704c53 0 96-43 96-96V160c' + + '0-53-43-96-96-96z m-12 800H172c-6.6 0-12-5.4-' + + '12-12V172c0-6.6 5.4-12 12-12h680c6.6 0 12 5.4' + + ' 12 12v680c0 6.6-5.4 12-12 12z'; + return ( + <svg {...props} viewBox="0 0 1024 1024"> + <path d={path} /> + </svg> + ); +}; + +export const TwoToneIcon: React.FC = props => { + const path = + 'M16 512c0 273.932 222.066 496 496 49' + + '6s496-222.068 496-496S785.932 16 512 16 16 238.' + + '066 16 512z m496 368V144c203.41 0 368 164.622 3' + + '68 368 0 203.41-164.622 368-368 368z'; + return ( + <svg {...props} viewBox="0 0 1024 1024"> + <path d={path} /> + </svg> + ); +}; diff --git a/src/components/RightContent/AvatarDropdown.tsx b/src/components/RightContent/AvatarDropdown.tsx new file mode 100644 index 0000000..029c89e --- /dev/null +++ b/src/components/RightContent/AvatarDropdown.tsx @@ -0,0 +1,136 @@ +import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons'; +import { useEmotionCss } from '@ant-design/use-emotion-css'; +// @ts-ignore +import { history, useModel } from '@umijs/max'; +import { Spin } from 'antd'; +import { stringify } from 'querystring'; +import type { MenuInfo } from 'rc-menu/lib/interface'; +import React, { useCallback } from 'react'; +import { flushSync } from 'react-dom'; +import HeaderDropdown from '../HeaderDropdown'; +import {postJwtJsonInBlacklist} from "@/services/system/Jwt"; + +export type GlobalHeaderRightProps = { + menu?: boolean; + children?: React.ReactNode; +}; + +export const AvatarName = () => { + const { initialState } = useModel('@@initialState'); + const { currentUser } = initialState || {}; + return <span className="anticon">{currentUser?.nickName}</span>; +}; + +export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu, children }) => { + /** + * 退出登录,并且将当前的 url 保存 + */ + const loginOut = async () => { + await postJwtJsonInBlacklist() + // await UserLogOut(); + localStorage.removeItem('access') + const { search, pathname } = window.location; + const urlParams = new URL(window.location.href).searchParams; + /** 此方法会跳转到 redirect 参数所在的位置 */ + const redirect = urlParams.get('redirect'); + // Note: There may be security issues, please note + if (window.location.pathname !== '/showInfo' && !redirect) { + history.replace({ + pathname: '/showInfo', + search: stringify({ + redirect: pathname + search, + }), + }); + } + }; + const actionClassName = useEmotionCss(({ token }) => { + return { + display: 'flex', + height: '48px', + marginLeft: 'auto', + overflow: 'hidden', + alignItems: 'center', + padding: '0 8px', + cursor: 'pointer', + borderRadius: token.borderRadius, + '&:hover': { + backgroundColor: token.colorBgTextHover, + }, + }; + }); + const { initialState, setInitialState } = useModel('@@initialState'); + + const onMenuClick = useCallback( + (event: MenuInfo) => { + const { key } = event; + if (key === 'logout') { + flushSync(() => { + setInitialState((s) => ({ ...s, currentUser: undefined, menuData: undefined })); + }); + loginOut().then(() => {}); + return; + } + history.push(`/account/${key}`); + }, + [setInitialState], + ); + + const loading = ( + <span className={actionClassName}> + <Spin + size="small" + style={{ + marginLeft: 8, + marginRight: 8, + }} + /> + </span> + ); + console.log(initialState) + if (!initialState) { + return loading; + } + + const { currentUser } = initialState; + + if (!currentUser || !currentUser.nickName) { + return loading; + } + + const menuItems = [ + ...(menu + ? [ + { + key: 'center', + icon: <UserOutlined />, + label: '个人中心', + }, + { + key: 'settings', + icon: <SettingOutlined />, + label: '个人设置', + }, + { + type: 'divider' as const, + }, + ] + : []), + { + key: 'logout', + icon: <LogoutOutlined />, + label: '退出登录', + }, + ]; + + return ( + <HeaderDropdown + menu={{ + selectedKeys: [], + onClick: onMenuClick, + items: menuItems, + }} + > + {children} + </HeaderDropdown> + ); +}; diff --git a/src/components/RightContent/index.tsx b/src/components/RightContent/index.tsx new file mode 100644 index 0000000..4418bb9 --- /dev/null +++ b/src/components/RightContent/index.tsx @@ -0,0 +1,66 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-01 13:56:33 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-28 11:34:00 + * @FilePath: \general-ai-platform-web\src\components\RightContent\index.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { QuestionCircleOutlined } from '@ant-design/icons'; +import { SelectLang as UmiSelectLang } from '@umijs/max'; +import React from 'react'; +import { Select } from 'antd'; +import {useModel} from "@@/exports"; +export type SiderTheme = 'light' | 'dark'; +import {postUserSetUserRole} from "@/services/system/User"; + +export const SelectLang = () => { + return ( + <UmiSelectLang + style={{ + padding: 4, + }} + /> + ); +}; + +export const Question = () => { + return ( + <div + style={{ + display: 'flex', + height: 26, + }} + onClick={() => { + window.open('https://pro.ant.design/docs/getting-started'); + }} + > + <QuestionCircleOutlined /> + </div> + ); +}; + +export const SelectRole = () => { + + const { initialState } = useModel('@@initialState'); + const { currentUser } = initialState || {}; + + return ( + <span className='gn'> + { + currentUser && ( + <Select + defaultValue={currentUser.roleId} + options={currentUser?.roles || []} + onSelect={value => { + postUserSetUserRole({roleId: value}).then((resp) => { + console.log(resp) + }) + }} + /> + ) + } + </span> + + ); +}; diff --git a/src/components/TableActionCard/index.tsx b/src/components/TableActionCard/index.tsx new file mode 100644 index 0000000..8729d05 --- /dev/null +++ b/src/components/TableActionCard/index.tsx @@ -0,0 +1,68 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-14 15:49:36 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-16 15:10:41 + * @FilePath: \general-ai-platform-web\src\components\TableActionCard\index.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ + +import { DownOutlined } from '@ant-design/icons'; +import { Dropdown } from 'antd'; +import React from 'react'; + +//TODO 表单的操作按钮集合 key的报错未解决 +type actionsProps = { + key: string; + renderDom: any +} + +export type TableActionItemProps = { + renderActions: actionsProps[]; +}; + +const TableActionCard: React.FC<TableActionItemProps> = (props) => { + const { renderActions } = props; + const maxActionCount = 3; + let prevActions: any[] = []; + const moreActions: { key: string; label: any }[] = []; + if (renderActions.length <= maxActionCount) { + prevActions = renderActions; + } else { + // eslint-disable-next-line array-callback-return + renderActions.map((item, index) => { + if (index < maxActionCount - 1) { + prevActions.push(item); + } else { + moreActions.push({ + key: index + '', + label: item.renderDom, + }); + } + // eslint-disable-next-line react/jsx-key + }); + } + return ( + <div> + {prevActions.map((item) => { + return ( + <span style={{ paddingRight: 8 }} key={item.key}> + {item.renderDom} + </span> + ); + })} + {moreActions.length ? ( + <Dropdown menu={{ items: moreActions }}> + <a> + 更多 + <DownOutlined /> + </a> + </Dropdown> + ) : ( + <></> + )} + </div> + ); +}; + +export default TableActionCard; diff --git a/src/components/TableActionCard/isConfirmAction.tsx b/src/components/TableActionCard/isConfirmAction.tsx new file mode 100644 index 0000000..fea2ee7 --- /dev/null +++ b/src/components/TableActionCard/isConfirmAction.tsx @@ -0,0 +1,55 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-16 14:30:15 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-16 16:22:15 + * @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +// import { useIntl } from '@ant-design/pro-components'; +import { useIntl } from '@umijs/max'; +import { Button, Popconfirm } from 'antd'; +import { FormattedMessage } from 'react-intl'; + +type isConfirmActionProps = { + // eslint-disable-next-line @typescript-eslint/ban-types + confirmAction: Function; + title: string; + description?: string; + buttonText?: string; + buttonFormatText?: string; +}; + +const IsConfirmAction: React.FC<isConfirmActionProps> = (props) => { + const intl = useIntl(); + const description = props.description || `确认${props.title}吗?`; + return ( + <Popconfirm + title={props.title} + description={description} + onConfirm={() => { + props.confirmAction(); + }} + onCancel={() => {}} + okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })} + cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })} + > + <Button + type="link" + size="small" + onClick={() => { + // setPublishModalOpen(true); + }} + > + {/* 自定义文案优先 */} + {props.buttonText ? ( + props.buttonText + ) : ( + <FormattedMessage id={props.buttonFormatText} defaultMessage="$$$" /> + )} + </Button> + </Popconfirm> + ); +}; + +export default IsConfirmAction; diff --git a/src/components/TableActionCard/isDelete.tsx b/src/components/TableActionCard/isDelete.tsx new file mode 100644 index 0000000..649cb9c --- /dev/null +++ b/src/components/TableActionCard/isDelete.tsx @@ -0,0 +1,44 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-16 14:30:15 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-16 14:56:27 + * @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +// import { useIntl } from '@ant-design/pro-components'; +import { useIntl } from '@umijs/max'; +import { Button, Popconfirm } from 'antd'; +import { FormattedMessage } from 'react-intl'; + +type IsDeleteProps = { + // eslint-disable-next-line @typescript-eslint/ban-types + deleteApi: Function; +}; + +const IsDelete: React.FC<IsDeleteProps> = (props) => { + const intl = useIntl(); + + return ( + <Popconfirm + key="destroy" + placement="topLeft" + title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })} + description={intl.formatMessage({ + id: 'common.modal.table.delete.content', + defaultMessage: '$$$', + })} + okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })} + cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })} + onConfirm={() => { + props.deleteApi(); + }} + > + <Button type="link" size="small" danger> + <FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" /> + </Button> + </Popconfirm> + ); +}; + +export default IsDelete; diff --git a/src/components/TablePaginationCard/index.tsx b/src/components/TablePaginationCard/index.tsx new file mode 100644 index 0000000..179f36d --- /dev/null +++ b/src/components/TablePaginationCard/index.tsx @@ -0,0 +1,39 @@ +/** + * 未使用 验证中 + */ +import { TableDropdown } from '@ant-design/pro-components'; +import React from 'react'; + +export type TablePaginationCardProps = { + total: number; + pageSize: number; + current: number; + // eslint-disable-next-line @typescript-eslint/ban-types + onChange: Function + +}; +// 分页器 +const TablePaginationCard: React.FC<TablePaginationCardProps> = (props) => { + const { total, pageSize, current, onChange } = props; + const totalPage = Math.ceil(total / pageSize); + + const handleChange = (page: number, pageSize: number) => { + onChange(page, pageSize); + }; + + return ( + <div> + <span> + Total {total} items, {totalPage} pages + </span> + <TableDropdown + total={totalPage as number} + current={current} + pageSize={pageSize} + onClick={(e) => handleChange(e, pageSize)} + /> + </div> + ); +}; + +export default TablePaginationCard; diff --git a/src/components/VideoPlayer/index.tsx b/src/components/VideoPlayer/index.tsx new file mode 100644 index 0000000..d68c571 --- /dev/null +++ b/src/components/VideoPlayer/index.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import videojs from 'video.js'; +import './video.css'; +import './videojs-new-markers.js' + +export const VideoJS = (props) => { + const videoRef = React.useRef(null); + const playerRef = React.useRef(null); + const {options, onReady} = props; + + React.useEffect(() => { + + // Make sure Video.js player is only initialized once + if (!playerRef.current) { + // The Video.js player needs to be _inside_ the component el for React 18 Strict Mode. + const videoElement = document.createElement("video-js"); + + videoElement.classList.add('vjs-big-play-centered'); + videoRef.current.appendChild(videoElement); + + const player = playerRef.current = videojs(videoElement, options, () => { + videojs.log('player is ready'); + onReady && onReady(player); + }); + + // You could update an existing player in the `else` block here + // on prop change, for example: + } else { + const player = playerRef.current; + player.autoplay(options.autoplay); + player.src(options.sources); + } + }, [options, videoRef]); + + // Dispose the Video.js player when the functional component unmounts + React.useEffect(() => { + const player = playerRef.current; + + return () => { + if (player && !player.isDisposed()) { + player.dispose(); + playerRef.current = null; + } + }; + }, [playerRef]); + + return ( + <div data-vjs-player={true}> + <div ref={videoRef} /> + </div> + ); +} + +export default VideoJS; diff --git a/src/components/VideoPlayer/video.css b/src/components/VideoPlayer/video.css new file mode 100644 index 0000000..3acf9c9 --- /dev/null +++ b/src/components/VideoPlayer/video.css @@ -0,0 +1,1957 @@ +.bubble{ + /*border: 2px solid #DB372C;*/ + position: relative; + border-radius: 7px; + background: #DB372C; + .text { + color: #fff; + font-size: 30px; + font-weight: 500; + text-align: center; + padding: 20px; + } +} +.bubble::before{ + content: ''; + width: 0; + height: 0; + border: 10px solid; + position: absolute; + bottom: -20px; + left: 20px; + border-color: #DB372C transparent transparent; +} + +.vjs-svg-icon { + display: inline-block; + background-repeat: no-repeat; + background-position: center; + fill: #FFFFFF; + height: 1.5em; + width: 1.5em; +} +.vjs-svg-icon:before { + content: none !important; +} + +.vjs-svg-icon:hover, +.vjs-control:focus .vjs-svg-icon { + filter: drop-shadow(0 0 0.25em #fff); +} + +.vjs-modal-dialog .vjs-modal-dialog-content, .video-js .vjs-modal-dialog, .vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before { + text-align: center; +} + +@font-face { + font-family: VideoJS; + src: url(data:application/font-woff;charset=utf-8;base64,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) format("woff"); + font-weight: normal; + font-style: normal; +} +.vjs-icon-play, .video-js .vjs-play-control .vjs-icon-placeholder, .video-js .vjs-big-play-button .vjs-icon-placeholder:before { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-play:before, .video-js .vjs-play-control .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before { + content: "\f101"; +} + +.vjs-icon-play-circle { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-play-circle:before { + content: "\f102"; +} + +.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before { + content: "\f103"; +} + +.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before { + content: "\f104"; +} + +.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before { + content: "\f105"; +} + +.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before { + content: "\f106"; +} + +.vjs-icon-volume-high, .video-js .vjs-mute-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-volume-high:before, .video-js .vjs-mute-control .vjs-icon-placeholder:before { + content: "\f107"; +} + +.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control .vjs-icon-placeholder:before { + content: "\f108"; +} + +.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before { + content: "\f109"; +} + +.vjs-icon-spinner { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-spinner:before { + content: "\f10a"; +} + +.vjs-icon-subtitles, .video-js .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-subtitles-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-subtitles:before, .video-js .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-subtitles-button .vjs-icon-placeholder:before { + content: "\f10b"; +} + +.vjs-icon-captions, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-captions-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-captions:before, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-captions-button .vjs-icon-placeholder:before { + content: "\f10c"; +} + +.vjs-icon-hd { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-hd:before { + content: "\f10d"; +} + +.vjs-icon-chapters, .video-js .vjs-chapters-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-chapters:before, .video-js .vjs-chapters-button .vjs-icon-placeholder:before { + content: "\f10e"; +} + +.vjs-icon-downloading { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-downloading:before { + content: "\f10f"; +} + +.vjs-icon-file-download { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-file-download:before { + content: "\f110"; +} + +.vjs-icon-file-download-done { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-file-download-done:before { + content: "\f111"; +} + +.vjs-icon-file-download-off { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-file-download-off:before { + content: "\f112"; +} + +.vjs-icon-share { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-share:before { + content: "\f113"; +} + +.vjs-icon-cog { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-cog:before { + content: "\f114"; +} + +.vjs-icon-square { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-square:before { + content: "\f115"; +} + +.vjs-icon-circle, .vjs-seek-to-live-control .vjs-icon-placeholder, .video-js .vjs-volume-level, .video-js .vjs-play-progress { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-circle:before, .vjs-seek-to-live-control .vjs-icon-placeholder:before, .video-js .vjs-volume-level:before, .video-js .vjs-play-progress:before { + content: "\f116"; +} + +.vjs-icon-circle-outline { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-circle-outline:before { + content: "\f117"; +} + +.vjs-icon-circle-inner-circle { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-circle-inner-circle:before { + content: "\f118"; +} + +.vjs-icon-cancel, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before { + content: "\f119"; +} + +.vjs-icon-repeat { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-repeat:before { + content: "\f11a"; +} + +.vjs-icon-replay, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-replay:before, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before { + content: "\f11b"; +} + +.vjs-icon-replay-5, .video-js .vjs-skip-backward-5 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-replay-5:before, .video-js .vjs-skip-backward-5 .vjs-icon-placeholder:before { + content: "\f11c"; +} + +.vjs-icon-replay-10, .video-js .vjs-skip-backward-10 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-replay-10:before, .video-js .vjs-skip-backward-10 .vjs-icon-placeholder:before { + content: "\f11d"; +} + +.vjs-icon-replay-30, .video-js .vjs-skip-backward-30 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-replay-30:before, .video-js .vjs-skip-backward-30 .vjs-icon-placeholder:before { + content: "\f11e"; +} + +.vjs-icon-forward-5, .video-js .vjs-skip-forward-5 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-forward-5:before, .video-js .vjs-skip-forward-5 .vjs-icon-placeholder:before { + content: "\f11f"; +} + +.vjs-icon-forward-10, .video-js .vjs-skip-forward-10 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-forward-10:before, .video-js .vjs-skip-forward-10 .vjs-icon-placeholder:before { + content: "\f120"; +} + +.vjs-icon-forward-30, .video-js .vjs-skip-forward-30 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-forward-30:before, .video-js .vjs-skip-forward-30 .vjs-icon-placeholder:before { + content: "\f121"; +} + +.vjs-icon-audio, .video-js .vjs-audio-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-audio:before, .video-js .vjs-audio-button .vjs-icon-placeholder:before { + content: "\f122"; +} + +.vjs-icon-next-item { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-next-item:before { + content: "\f123"; +} + +.vjs-icon-previous-item { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-previous-item:before { + content: "\f124"; +} + +.vjs-icon-shuffle { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-shuffle:before { + content: "\f125"; +} + +.vjs-icon-cast { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-cast:before { + content: "\f126"; +} + +.vjs-icon-picture-in-picture-enter, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-picture-in-picture-enter:before, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before { + content: "\f127"; +} + +.vjs-icon-picture-in-picture-exit, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-picture-in-picture-exit:before, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before { + content: "\f128"; +} + +.vjs-icon-facebook { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-facebook:before { + content: "\f129"; +} + +.vjs-icon-linkedin { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-linkedin:before { + content: "\f12a"; +} + +.vjs-icon-twitter { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-twitter:before { + content: "\f12b"; +} + +.vjs-icon-tumblr { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-tumblr:before { + content: "\f12c"; +} + +.vjs-icon-pinterest { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-pinterest:before { + content: "\f12d"; +} + +.vjs-icon-audio-description, .video-js .vjs-descriptions-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-audio-description:before, .video-js .vjs-descriptions-button .vjs-icon-placeholder:before { + content: "\f12e"; +} + +.video-js { + display: inline-block; + vertical-align: top; + box-sizing: border-box; + color: #fff; + background-color: #000; + position: relative; + padding: 0; + font-size: 10px; + line-height: 1; + font-weight: normal; + font-style: normal; + font-family: Arial, Helvetica, sans-serif; + word-break: initial; +} +.video-js:-moz-full-screen { + position: absolute; +} +.video-js:-webkit-full-screen { + width: 100% !important; + height: 100% !important; +} + +.video-js[tabindex="-1"] { + outline: none; +} + +.video-js *, +.video-js *:before, +.video-js *:after { + box-sizing: inherit; +} + +.video-js ul { + font-family: inherit; + font-size: inherit; + line-height: inherit; + list-style-position: outside; + margin-left: 0; + margin-right: 0; + margin-top: 0; + margin-bottom: 0; +} + +.video-js.vjs-fluid, +.video-js.vjs-16-9, +.video-js.vjs-4-3, +.video-js.vjs-9-16, +.video-js.vjs-1-1 { + width: 100%; + max-width: 100%; +} + +.video-js.vjs-fluid:not(.vjs-audio-only-mode), +.video-js.vjs-16-9:not(.vjs-audio-only-mode), +.video-js.vjs-4-3:not(.vjs-audio-only-mode), +.video-js.vjs-9-16:not(.vjs-audio-only-mode), +.video-js.vjs-1-1:not(.vjs-audio-only-mode) { + height: 0; +} + +.video-js.vjs-16-9:not(.vjs-audio-only-mode) { + padding-top: 56.25%; +} + +.video-js.vjs-4-3:not(.vjs-audio-only-mode) { + padding-top: 75%; +} + +.video-js.vjs-9-16:not(.vjs-audio-only-mode) { + padding-top: 177.7777777778%; +} + +.video-js.vjs-1-1:not(.vjs-audio-only-mode) { + padding-top: 100%; +} + +.video-js.vjs-fill:not(.vjs-audio-only-mode) { + width: 100%; + height: 100%; +} + +.video-js .vjs-tech { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.video-js.vjs-audio-only-mode .vjs-tech { + display: none; +} + +body.vjs-full-window, +body.vjs-pip-window { + padding: 0; + margin: 0; + height: 100%; +} + +.vjs-full-window .video-js.vjs-fullscreen, +body.vjs-pip-window .video-js { + position: fixed; + overflow: hidden; + z-index: 1000; + left: 0; + top: 0; + bottom: 0; + right: 0; +} + +.video-js.vjs-fullscreen:not(.vjs-ios-native-fs), +body.vjs-pip-window .video-js { + width: 100% !important; + height: 100% !important; + padding-top: 0 !important; + display: block; +} + +.video-js.vjs-fullscreen.vjs-user-inactive { + cursor: none; +} + +.vjs-pip-container .vjs-pip-text { + position: absolute; + bottom: 10%; + font-size: 2em; + background-color: rgba(0, 0, 0, 0.7); + padding: 0.5em; + text-align: center; + width: 100%; +} + +.vjs-layout-tiny.vjs-pip-container .vjs-pip-text, +.vjs-layout-x-small.vjs-pip-container .vjs-pip-text, +.vjs-layout-small.vjs-pip-container .vjs-pip-text { + bottom: 0; + font-size: 1.4em; +} + +.vjs-hidden { + display: none !important; +} + +.vjs-disabled { + opacity: 0.5; + cursor: default; +} + +.video-js .vjs-offscreen { + height: 1px; + left: -9999px; + position: absolute; + top: 0; + width: 1px; +} + +.vjs-lock-showing { + display: block !important; + opacity: 1 !important; + visibility: visible !important; +} + +.vjs-no-js { + padding: 20px; + color: #fff; + background-color: #000; + font-size: 18px; + font-family: Arial, Helvetica, sans-serif; + text-align: center; + width: 300px; + height: 150px; + margin: 0px auto; +} + +.vjs-no-js a, +.vjs-no-js a:visited { + color: #66A8CC; +} + +.video-js .vjs-big-play-button { + font-size: 3em; + line-height: 1.5em; + height: 1.63332em; + width: 3em; + display: block; + position: absolute; + top: 50%; + left: 50%; + padding: 0; + margin-top: -0.81666em; + margin-left: -1.5em; + cursor: pointer; + opacity: 1; + border: 0.06666em solid #fff; + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.7); + border-radius: 0.3em; + transition: all 0.4s; +} +.vjs-big-play-button .vjs-svg-icon { + width: 0.75em; + height: 0.75em; +} + +.video-js:hover .vjs-big-play-button, +.video-js .vjs-big-play-button:focus { + border-color: #fff; + background-color: #73859f; + background-color: rgba(115, 133, 159, 0.5); + transition: all 0s; +} + +.vjs-controls-disabled .vjs-big-play-button, +.vjs-has-started .vjs-big-play-button, +.vjs-using-native-controls .vjs-big-play-button, +.vjs-error .vjs-big-play-button { + display: none; +} + +.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button { + display: block; +} + +.video-js button { + background: none; + border: none; + color: inherit; + display: inline-block; + font-size: inherit; + line-height: inherit; + text-transform: none; + text-decoration: none; + transition: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.vjs-control .vjs-button { + width: 100%; + height: 100%; +} + +.video-js .vjs-control.vjs-close-button { + cursor: pointer; + height: 3em; + position: absolute; + right: 0; + top: 0.5em; + z-index: 2; +} +.video-js .vjs-modal-dialog { + background: rgba(0, 0, 0, 0.8); + background: linear-gradient(180deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0)); + overflow: auto; +} + +.video-js .vjs-modal-dialog > * { + box-sizing: border-box; +} + +.vjs-modal-dialog .vjs-modal-dialog-content { + font-size: 1.2em; + line-height: 1.5; + padding: 20px 24px; + z-index: 1; +} + +.vjs-menu-button { + cursor: pointer; +} + +.vjs-menu-button.vjs-disabled { + cursor: default; +} + +.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu { + display: none; +} + +.vjs-menu .vjs-menu-content { + display: block; + padding: 0; + margin: 0; + font-family: Arial, Helvetica, sans-serif; + overflow: auto; +} + +.vjs-menu .vjs-menu-content > * { + box-sizing: border-box; +} + +.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu { + display: none; +} + +.vjs-menu li { + display: flex; + justify-content: center; + list-style: none; + margin: 0; + padding: 0.2em 0; + line-height: 1.4em; + font-size: 1.2em; + text-align: center; + text-transform: lowercase; +} + +.vjs-menu li.vjs-menu-item:focus, +.vjs-menu li.vjs-menu-item:hover, +.js-focus-visible .vjs-menu li.vjs-menu-item:hover { + background-color: #73859f; + background-color: rgba(115, 133, 159, 0.5); +} + +.vjs-menu li.vjs-selected, +.vjs-menu li.vjs-selected:focus, +.vjs-menu li.vjs-selected:hover, +.js-focus-visible .vjs-menu li.vjs-selected:hover { + background-color: #fff; + color: #2B333F; +} +.vjs-menu li.vjs-selected .vjs-svg-icon, +.vjs-menu li.vjs-selected:focus .vjs-svg-icon, +.vjs-menu li.vjs-selected:hover .vjs-svg-icon, +.js-focus-visible .vjs-menu li.vjs-selected:hover .vjs-svg-icon { + fill: #000000; +} + +.video-js .vjs-menu *:not(.vjs-selected):focus:not(:focus-visible), +.js-focus-visible .vjs-menu *:not(.vjs-selected):focus:not(.focus-visible) { + background: none; +} + +.vjs-menu li.vjs-menu-title { + text-align: center; + text-transform: uppercase; + font-size: 1em; + line-height: 2em; + padding: 0; + margin: 0 0 0.3em 0; + font-weight: bold; + cursor: default; +} + +.vjs-menu-button-popup .vjs-menu { + display: none; + position: absolute; + bottom: 0; + width: 10em; + left: -3em; + height: 0em; + margin-bottom: 1.5em; + border-top-color: rgba(43, 51, 63, 0.7); +} + +.vjs-pip-window .vjs-menu-button-popup .vjs-menu { + left: unset; + right: 1em; +} + +.vjs-menu-button-popup .vjs-menu .vjs-menu-content { + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.7); + position: absolute; + width: 100%; + bottom: 1.5em; + max-height: 15em; +} + +.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content, +.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content { + max-height: 5em; +} + +.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content { + max-height: 10em; +} + +.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content { + max-height: 14em; +} + +.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content, +.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content, +.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content { + max-height: 25em; +} + +.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu, +.vjs-menu-button-popup .vjs-menu.vjs-lock-showing { + display: block; +} + +.video-js .vjs-menu-button-inline { + transition: all 0.4s; + overflow: hidden; +} + +.video-js .vjs-menu-button-inline:before { + width: 2.222222222em; +} + +.video-js .vjs-menu-button-inline:hover, +.video-js .vjs-menu-button-inline:focus, +.video-js .vjs-menu-button-inline.vjs-slider-active { + width: 12em; +} + +.vjs-menu-button-inline .vjs-menu { + opacity: 0; + height: 100%; + width: auto; + position: absolute; + left: 4em; + top: 0; + padding: 0; + margin: 0; + transition: all 0.4s; +} + +.vjs-menu-button-inline:hover .vjs-menu, +.vjs-menu-button-inline:focus .vjs-menu, +.vjs-menu-button-inline.vjs-slider-active .vjs-menu { + display: block; + opacity: 1; +} + +.vjs-menu-button-inline .vjs-menu-content { + width: auto; + height: 100%; + margin: 0; + overflow: hidden; +} + +.video-js .vjs-control-bar { + display: none; + width: 100%; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 3em; + background-color: rgba(0,0,0,0.54); + /*background-color: rgba(0,0,0,0.54) !important;*/ +} + +.vjs-has-started .vjs-control-bar, +.vjs-audio-only-mode .vjs-control-bar { + display: flex; + visibility: visible; + opacity: 1; + transition: visibility 0.1s, opacity 0.1s; +} + +.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar { + visibility: visible; + opacity: 0; + pointer-events: none; + transition: visibility 1s, opacity 1s; +} + +.vjs-controls-disabled .vjs-control-bar, +.vjs-using-native-controls .vjs-control-bar, +.vjs-error .vjs-control-bar { + display: none !important; +} + +.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar, +.vjs-audio-only-mode.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar { + opacity: 1; + visibility: visible; + pointer-events: auto; +} + +.video-js .vjs-control { + position: relative; + text-align: center; + margin: 0; + padding: 0; + height: 100%; + width: 4em; + flex: none; +} + +.video-js .vjs-control.vjs-visible-text { + width: auto; + padding-left: 1em; + padding-right: 1em; +} + +.vjs-button > .vjs-icon-placeholder:before { + font-size: 1.8em; + line-height: 1.67; +} + +.vjs-button > .vjs-icon-placeholder { + display: block; +} + +.vjs-button > .vjs-svg-icon { + display: inline-block; +} + +.video-js .vjs-control:focus:before, +.video-js .vjs-control:hover:before, +.video-js .vjs-control:focus { + text-shadow: 0em 0em 1em white; +} + +.video-js *:not(.vjs-visible-text) > .vjs-control-text { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.video-js .vjs-custom-control-spacer { + display: none; +} + +.video-js .vjs-progress-control { + cursor: pointer; + flex: auto; + display: flex; + align-items: center; + min-width: 4em; + touch-action: none; +} + +.video-js .vjs-progress-control.disabled { + cursor: default; +} + +.vjs-live .vjs-progress-control { + display: none; +} + +.vjs-liveui .vjs-progress-control { + display: flex; + align-items: center; +} + +.video-js .vjs-progress-holder { + flex: auto; + transition: all 0.2s; + height: 0.3em; +} + +.video-js .vjs-progress-control .vjs-progress-holder { + margin: 0 10px; +} + +.video-js .vjs-progress-control:hover .vjs-progress-holder { + font-size: 1.6666666667em; +} + +.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled { + font-size: 1em; +} + +.video-js .vjs-progress-holder .vjs-play-progress, +.video-js .vjs-progress-holder .vjs-load-progress, +.video-js .vjs-progress-holder .vjs-load-progress div { + position: absolute; + display: block; + height: 100%; + margin: 0; + padding: 0; + width: 0; +} + +.video-js .vjs-play-progress { + background-color: #fff; +} +.video-js .vjs-play-progress:before { + font-size: 0.9em; + position: absolute; + right: -0.5em; + line-height: 0.35em; + z-index: 1; +} + +.vjs-svg-icons-enabled .vjs-play-progress:before { + content: none !important; +} + +.vjs-play-progress .vjs-svg-icon { + position: absolute; + top: -0.35em; + right: -0.4em; + width: 1em; + height: 1em; + pointer-events: none; + line-height: 0.15em; + z-index: 1; +} + +.video-js .vjs-load-progress { + background: rgba(115, 133, 159, 0.5); +} + +.video-js .vjs-load-progress div { + background: #383838; +} + +.video-js .vjs-time-tooltip { + background-color: #fff; + background-color: rgba(255, 255, 255, 0.8); + border-radius: 0.3em; + color: #000; + float: right; + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; + padding: 6px 8px 8px 8px; + pointer-events: none; + position: absolute; + top: -3.4em; + visibility: hidden; + z-index: 1; +} + +.vjs-progress-control:hover .vjs-progress-holder .vjs-play-progress .vjs-svg-icon { + width: 0.8em; + height: 0.8em; + top: -0.25em; + right: -0.5em; + line-height: 0.35em; +} + +.video-js .vjs-progress-holder:focus .vjs-time-tooltip { + display: none; +} + +.video-js .vjs-progress-control:hover .vjs-time-tooltip, +.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip { + display: block; + font-size: 0.6em; + visibility: visible; +} + +.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip { + font-size: 1em; +} + +.video-js .vjs-progress-control .vjs-mouse-display { + display: none; + position: absolute; + width: 1px; + height: 100%; + background-color: #000; + z-index: 1; +} + +.video-js .vjs-progress-control:hover .vjs-mouse-display { + display: block; +} + +.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display { + visibility: hidden; + opacity: 0; + transition: visibility 1s, opacity 1s; +} + +.vjs-mouse-display .vjs-time-tooltip { + color: #fff; + background-color: #000; + background-color: rgba(0, 0, 0, 0.8); +} + +.video-js .vjs-slider { + position: relative; + cursor: pointer; + padding: 0; + margin: 0 0.45em 0 0.45em; + /* iOS Safari */ + -webkit-touch-callout: none; + /* Safari, and Chrome 53 */ + -webkit-user-select: none; + /* Non-prefixed version, currently supported by Chrome and Opera */ + -moz-user-select: none; + user-select: none; + background-color: #73859f; + background-color: rgba(115, 133, 159, 0.5); +} + +.video-js .vjs-slider.disabled { + cursor: default; +} + +.video-js .vjs-slider:focus { + text-shadow: 0em 0em 1em white; + box-shadow: 0 0 1em #fff; +} + +.video-js .vjs-mute-control { + cursor: pointer; + flex: none; +} +.video-js .vjs-volume-control { + cursor: pointer; + margin-right: 1em; + display: flex; +} + +.video-js .vjs-volume-control.vjs-volume-horizontal { + width: 5em; +} + +.video-js .vjs-volume-panel .vjs-volume-control { + visibility: visible; + opacity: 0; + width: 1px; + height: 1px; + margin-left: -1px; +} + +.video-js .vjs-volume-panel { + transition: width 1s; +} +.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control, .video-js .vjs-volume-panel:active .vjs-volume-control, .video-js .vjs-volume-panel:focus .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control:active, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active { + visibility: visible; + opacity: 1; + position: relative; + transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s; +} +.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal { + width: 5em; + height: 3em; + margin-right: 0; +} +.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical { + left: -3.5em; + transition: left 0s; +} +.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active { + width: 10em; + transition: width 0.1s; +} +.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only { + width: 4em; +} + +.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical { + height: 8em; + width: 3em; + left: -3000em; + transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s; +} + +.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal { + transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s; +} + +.video-js .vjs-volume-panel { + display: flex; +} + +.video-js .vjs-volume-bar { + margin: 1.35em 0.45em; +} + +.vjs-volume-bar.vjs-slider-horizontal { + width: 5em; + height: 0.3em; +} + +.vjs-volume-bar.vjs-slider-vertical { + width: 0.3em; + height: 5em; + margin: 1.35em auto; +} + +.video-js .vjs-volume-level { + position: absolute; + bottom: 0; + left: 0; + background-color: #fff; +} +.video-js .vjs-volume-level:before { + position: absolute; + font-size: 0.9em; + z-index: 1; +} + +.vjs-slider-vertical .vjs-volume-level { + width: 0.3em; +} +.vjs-slider-vertical .vjs-volume-level:before { + top: -0.5em; + left: -0.3em; + z-index: 1; +} + +.vjs-svg-icons-enabled .vjs-volume-level:before { + content: none; +} + +.vjs-volume-level .vjs-svg-icon { + position: absolute; + width: 0.6em; + height: 0.6em; + top: -0.55em; + pointer-events: none; +} + +.vjs-mute-control .vjs-svg-icon { + width: 1.75em; + height: 1.75em; +} + +.vjs-slider-horizontal .vjs-volume-level { + height: 0.3em; +} +.vjs-slider-horizontal .vjs-volume-level:before { + line-height: 0.35em; + right: -0.5em; +} + +.vjs-slider-horizontal .vjs-volume-level .vjs-svg-icon { + top: -0.15em; + right: -0.3em; + line-height: 0.05em; +} + +.vjs-slider-vertical .vjs-volume-level .vjs-svg-icon { + top: -0.9em; + right: -0.15em; +} + +.video-js .vjs-volume-panel.vjs-volume-panel-vertical { + width: 4em; +} + +.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level { + height: 100%; +} + +.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level { + width: 100%; +} + +.video-js .vjs-volume-vertical { + width: 3em; + height: 8em; + bottom: 8em; + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.7); +} + +.video-js .vjs-volume-horizontal .vjs-menu { + left: -2em; +} + +.video-js .vjs-volume-tooltip { + background-color: #fff; + background-color: rgba(255, 255, 255, 0.8); + border-radius: 0.3em; + color: #000; + float: right; + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; + padding: 6px 8px 8px 8px; + pointer-events: none; + position: absolute; + top: -3.4em; + visibility: hidden; + z-index: 1; +} + +.video-js .vjs-volume-control:hover .vjs-volume-tooltip, +.video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip { + display: block; + font-size: 1em; + visibility: visible; +} + +.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip, +.video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip { + left: 1em; + top: -12px; +} + +.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip { + font-size: 1em; +} + +.video-js .vjs-volume-control .vjs-mouse-display { + display: none; + position: absolute; + width: 100%; + height: 1px; + background-color: #000; + z-index: 1; +} + +.video-js .vjs-volume-horizontal .vjs-mouse-display { + width: 1px; + height: 100%; +} + +.video-js .vjs-volume-control:hover .vjs-mouse-display { + display: block; +} + +.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display { + visibility: hidden; + opacity: 0; + transition: visibility 1s, opacity 1s; +} + +.vjs-mouse-display .vjs-volume-tooltip { + color: #fff; + background-color: #000; + background-color: rgba(0, 0, 0, 0.8); +} + +.vjs-poster { + display: inline-block; + vertical-align: middle; + cursor: pointer; + margin: 0; + padding: 0; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + height: 100%; +} + +.vjs-has-started .vjs-poster, +.vjs-using-native-controls .vjs-poster { + display: none; +} + +.vjs-audio.vjs-has-started .vjs-poster, +.vjs-has-started.vjs-audio-poster-mode .vjs-poster, +.vjs-pip-container.vjs-has-started .vjs-poster { + display: block; +} + +.vjs-poster img { + width: 100%; + height: 100%; + -o-object-fit: contain; + object-fit: contain; +} + +.video-js .vjs-live-control { + display: flex; + align-items: flex-start; + flex: auto; + font-size: 1em; + line-height: 3em; +} + +.video-js:not(.vjs-live) .vjs-live-control, +.video-js.vjs-liveui .vjs-live-control { + display: none; +} + +.video-js .vjs-seek-to-live-control { + align-items: center; + cursor: pointer; + flex: none; + display: inline-flex; + height: 100%; + padding-left: 0.5em; + padding-right: 0.5em; + font-size: 1em; + line-height: 3em; + width: auto; + min-width: 4em; +} + +.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control, +.video-js:not(.vjs-live) .vjs-seek-to-live-control { + display: none; +} + +.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge { + cursor: auto; +} + +.vjs-seek-to-live-control .vjs-icon-placeholder { + margin-right: 0.5em; + color: #888; +} + +.vjs-svg-icons-enabled .vjs-seek-to-live-control { + line-height: 0; +} + +.vjs-seek-to-live-control .vjs-svg-icon { + width: 1em; + height: 1em; + pointer-events: none; + fill: #888888; +} + +.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder { + color: red; +} + +.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-svg-icon { + fill: red; +} + +.video-js .vjs-time-control { + flex: none; + font-size: 1em; + line-height: 3em; + min-width: 2em; + width: auto; + padding-left: 1em; + padding-right: 1em; +} + +.vjs-live .vjs-time-control, +.vjs-live .vjs-time-divider, +.video-js .vjs-current-time, +.video-js .vjs-duration { + display: none; +} + +.vjs-time-divider { + display: none; + line-height: 3em; +} + +.video-js .vjs-play-control { + cursor: pointer; +} + +.video-js .vjs-play-control .vjs-icon-placeholder { + flex: none; +} + +.vjs-text-track-display { + position: absolute; + bottom: 3em; + left: 0; + right: 0; + top: 0; + pointer-events: none; +} + +.video-js.vjs-controls-disabled .vjs-text-track-display, +.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display { + bottom: 1em; +} + +.video-js .vjs-text-track { + font-size: 1.4em; + text-align: center; + margin-bottom: 0.1em; +} + +.vjs-subtitles { + color: #fff; +} + +.vjs-captions { + color: #fc6; +} + +.vjs-tt-cue { + display: block; +} + +video::-webkit-media-text-track-display { + transform: translateY(-3em); +} + +.video-js.vjs-controls-disabled video::-webkit-media-text-track-display, +.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display { + transform: translateY(-1.5em); +} + +.video-js .vjs-picture-in-picture-control { + cursor: pointer; + flex: none; +} +.video-js.vjs-audio-only-mode .vjs-picture-in-picture-control, +.vjs-pip-window .vjs-picture-in-picture-control { + display: none; +} + +.video-js .vjs-fullscreen-control { + cursor: pointer; + flex: none; +} +.video-js.vjs-audio-only-mode .vjs-fullscreen-control, +.vjs-pip-window .vjs-fullscreen-control { + display: none; +} + +.vjs-playback-rate > .vjs-menu-button, +.vjs-playback-rate .vjs-playback-rate-value { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.vjs-playback-rate .vjs-playback-rate-value { + pointer-events: none; + font-size: 1.5em; + line-height: 2; + text-align: center; +} + +.vjs-playback-rate .vjs-menu { + width: 4em; + left: 0em; +} + +.vjs-error .vjs-error-display .vjs-modal-dialog-content { + font-size: 1.4em; + text-align: center; +} + +.vjs-error .vjs-error-display:before { + color: #fff; + content: "X"; + font-family: Arial, Helvetica, sans-serif; + font-size: 4em; + left: 0; + line-height: 1; + margin-top: -0.5em; + position: absolute; + text-shadow: 0.05em 0.05em 0.1em #000; + text-align: center; + top: 50%; + vertical-align: middle; + width: 100%; +} + +.vjs-loading-spinner { + display: none; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + opacity: 0.85; + text-align: left; + border: 0.6em solid rgba(43, 51, 63, 0.7); + box-sizing: border-box; + background-clip: padding-box; + width: 5em; + height: 5em; + border-radius: 50%; + visibility: hidden; +} + +.vjs-seeking .vjs-loading-spinner, +.vjs-waiting .vjs-loading-spinner { + display: block; + animation: vjs-spinner-show 0s linear 0.3s forwards; +} + +.vjs-loading-spinner:before, +.vjs-loading-spinner:after { + content: ""; + position: absolute; + margin: -0.6em; + box-sizing: inherit; + width: inherit; + height: inherit; + border-radius: inherit; + opacity: 1; + border: inherit; + border-color: transparent; + border-top-color: white; +} + +.vjs-seeking .vjs-loading-spinner:before, +.vjs-seeking .vjs-loading-spinner:after, +.vjs-waiting .vjs-loading-spinner:before, +.vjs-waiting .vjs-loading-spinner:after { + animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite; +} + +.vjs-seeking .vjs-loading-spinner:before, +.vjs-waiting .vjs-loading-spinner:before { + border-top-color: rgb(255, 255, 255); +} + +.vjs-seeking .vjs-loading-spinner:after, +.vjs-waiting .vjs-loading-spinner:after { + border-top-color: rgb(255, 255, 255); + animation-delay: 0.44s; +} + +@keyframes vjs-spinner-show { + to { + visibility: visible; + } +} +@keyframes vjs-spinner-spin { + 100% { + transform: rotate(360deg); + } +} +@keyframes vjs-spinner-fade { + 0% { + border-top-color: #73859f; + } + 20% { + border-top-color: #73859f; + } + 35% { + border-top-color: white; + } + 60% { + border-top-color: #73859f; + } + 100% { + border-top-color: #73859f; + } +} +.video-js.vjs-audio-only-mode .vjs-captions-button { + display: none; +} + +.vjs-chapters-button .vjs-menu ul { + width: 24em; +} + +.video-js.vjs-audio-only-mode .vjs-descriptions-button { + display: none; +} + +.vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-svg-icon { + margin-left: 0.3em; +} + +.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder { + vertical-align: middle; + display: inline-block; + margin-bottom: -0.1em; +} + +.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before { + font-family: VideoJS; + content: "\f10c"; + font-size: 1.5em; + line-height: inherit; +} + +.video-js.vjs-audio-only-mode .vjs-subs-caps-button { + display: none; +} + +.video-js .vjs-audio-button + .vjs-menu .vjs-description-menu-item .vjs-menu-item-text .vjs-icon-placeholder, +.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder { + vertical-align: middle; + display: inline-block; + margin-bottom: -0.1em; +} + +.video-js .vjs-audio-button + .vjs-menu .vjs-description-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before, +.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before { + font-family: VideoJS; + content: " \f12e"; + font-size: 1.5em; + line-height: inherit; +} + +.video-js.vjs-layout-small .vjs-current-time, +.video-js.vjs-layout-small .vjs-time-divider, +.video-js.vjs-layout-small .vjs-duration, +.video-js.vjs-layout-small .vjs-remaining-time, +.video-js.vjs-layout-small .vjs-playback-rate, +.video-js.vjs-layout-small .vjs-volume-control, .video-js.vjs-layout-x-small .vjs-current-time, +.video-js.vjs-layout-x-small .vjs-time-divider, +.video-js.vjs-layout-x-small .vjs-duration, +.video-js.vjs-layout-x-small .vjs-remaining-time, +.video-js.vjs-layout-x-small .vjs-playback-rate, +.video-js.vjs-layout-x-small .vjs-volume-control, .video-js.vjs-layout-tiny .vjs-current-time, +.video-js.vjs-layout-tiny .vjs-time-divider, +.video-js.vjs-layout-tiny .vjs-duration, +.video-js.vjs-layout-tiny .vjs-remaining-time, +.video-js.vjs-layout-tiny .vjs-playback-rate, +.video-js.vjs-layout-tiny .vjs-volume-control { + display: none; +} +.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover { + width: auto; + width: initial; +} +.video-js.vjs-layout-x-small .vjs-progress-control, .video-js.vjs-layout-tiny .vjs-progress-control { + display: none; +} +.video-js.vjs-layout-x-small .vjs-custom-control-spacer { + flex: auto; + display: block; +} + +.vjs-modal-dialog.vjs-text-track-settings { + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.75); + color: #fff; + height: 70%; +} + +.vjs-text-track-settings .vjs-modal-dialog-content { + display: table; +} + +.vjs-text-track-settings .vjs-track-settings-colors, +.vjs-text-track-settings .vjs-track-settings-font, +.vjs-text-track-settings .vjs-track-settings-controls { + display: table-cell; +} + +.vjs-text-track-settings .vjs-track-settings-controls { + text-align: right; + vertical-align: bottom; +} + +@supports (display: grid) { + .vjs-text-track-settings .vjs-modal-dialog-content { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr; + padding: 20px 24px 0px 24px; + } + .vjs-track-settings-controls .vjs-default-button { + margin-bottom: 20px; + } + .vjs-text-track-settings .vjs-track-settings-controls { + grid-column: 1/-1; + } + .vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content, + .vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content, + .vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content { + grid-template-columns: 1fr; + } +} +.vjs-text-track-settings select { + font-size: inherit; +} + +.vjs-track-setting > select { + margin-right: 1em; + margin-bottom: 0.5em; +} + +.vjs-text-track-settings fieldset { + margin: 10px; + border: none; +} + +.vjs-text-track-settings fieldset span { + display: inline-block; + padding: 0 0.6em 0.8em; +} + +.vjs-text-track-settings fieldset span > select { + max-width: 7.3em; +} + +.vjs-text-track-settings legend { + color: #fff; + font-weight: bold; + font-size: 1.2em; +} + +.vjs-text-track-settings .vjs-label { + margin: 0 0.5em 0.5em 0; +} + +.vjs-track-settings-controls button:focus, +.vjs-track-settings-controls button:active { + outline-style: solid; + outline-width: medium; + background-image: linear-gradient(0deg, #fff 88%, #73859f 100%); +} + +.vjs-track-settings-controls button:hover { + color: rgba(43, 51, 63, 0.75); +} + +.vjs-track-settings-controls button { + background-color: #fff; + background-image: linear-gradient(-180deg, #fff 88%, #73859f 100%); + color: #2B333F; + cursor: pointer; + border-radius: 2px; +} + +.vjs-track-settings-controls .vjs-default-button { + margin-right: 1em; +} + +.vjs-title-bar { + background: rgba(0, 0, 0, 0.9); + background: linear-gradient(180deg, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.7) 60%, rgba(0, 0, 0, 0) 100%); + font-size: 1.2em; + line-height: 1.5; + transition: opacity 0.1s; + padding: 0.666em 1.333em 4em; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; +} + +.vjs-title-bar-title, +.vjs-title-bar-description { + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vjs-title-bar-title { + font-weight: bold; + margin-bottom: 0.333em; +} + +.vjs-playing.vjs-user-inactive .vjs-title-bar { + opacity: 0; + transition: opacity 1s; +} + +.video-js .vjs-skip-forward-5 { + cursor: pointer; +} +.video-js .vjs-skip-forward-10 { + cursor: pointer; +} +.video-js .vjs-skip-forward-30 { + cursor: pointer; +} +.video-js .vjs-skip-backward-5 { + cursor: pointer; +} +.video-js .vjs-skip-backward-10 { + cursor: pointer; +} +.video-js .vjs-skip-backward-30 { + cursor: pointer; +} +@media print { + .video-js > *:not(.vjs-tech):not(.vjs-poster) { + visibility: hidden; + } +} +.vjs-resize-manager { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border: none; + z-index: -1000; +} + +.js-focus-visible .video-js *:focus:not(.focus-visible) { + outline: none; +} + +.video-js *:focus:not(:focus-visible) { + outline: none; +} diff --git a/src/components/VideoPlayer/videojs-new-markers.js b/src/components/VideoPlayer/videojs-new-markers.js new file mode 100644 index 0000000..96cc46c --- /dev/null +++ b/src/components/VideoPlayer/videojs-new-markers.js @@ -0,0 +1,172 @@ +import videojs from 'video.js'; + +const Plugin = videojs.getPlugin('plugin'); + + +let is_jump = false; +class Advanced extends Plugin { + + constructor(player, options) { + super(player, options); + + + this.on(player, ['playing', 'pause'], this.updateState); + this.on('statechanged', this.logState); + player.ready(()=>{ + player.controlBar.progressControl.on('keyup', (event) => { + const keyCode = event.which || event.keyCode; + + // 检查是否按下左箭头键 + if (keyCode === 37) { + // 处理左箭头键事件 + console.log('左箭头键被按下'); + // 在这里执行你的逻辑 + } + + // 检查是否按下右箭头键 + if (keyCode === 39) { + // 处理右箭头键事件 + console.log('右箭头键被按下'); + // 在这里执行你的逻辑 + } + }) + + player.controlBar.progressControl.on('mousemove', (event) => { + is_jump = false; + }) + + player.controlBar.progressControl.on('mouseup', (event) => { + is_jump = true; + }) + }) + + this.player.on('loadedmetadata', () => { + // 获取视频的持续时间 + let markers = [] + if (options && 'video_config_options' in options) { + markers = Object.values(options['video_config_options'].result).map((v) => { + return { + time: Math.floor(v.time/options['video_config_options'].info.fps), + duration: Math.ceil(v.duration/options['video_config_options'].info.fps), + } + }) + } + const duration = this.player.duration(); + markers.forEach((v)=>{ + let redBlock = document.createElement("div"); + let tooltip = document.createElement('div'); + let markerBlock = document.createElement('div'); + let tooltip_text = document.createElement('div'); + + markerBlock.style.height= '200px' + markerBlock.appendChild(tooltip); + markerBlock.appendChild(redBlock); + // 将文本提示添加到红色块 + redBlock.style.position = "absolute"; + redBlock.style.width = "10px"; + redBlock.style.height = "20px"; + redBlock.style.backgroundColor = "rgba(219,55, 4, 0.6)"; + + // 计算红色块的位置 + const left = (v.time / this.player.duration()) * 100; + const width = ((v.time + v.duration)/ this.player.duration()) * 100 - left; + const zIndex = 100 - Math.floor(width) || 100; + let progress = this.player.controlBar.progressControl.el(); + let progressBar = progress.querySelector(".vjs-progress-holder"); + let progressBarWidth = progressBar.offsetWidth; + let leftPosition = (50 / this.player.duration()) * progressBarWidth - 5; + + // 设置红色块的位置 + redBlock.style.left = left+"%"; + redBlock.style.width = width +'%'; + redBlock.style.zIndex = 1; + redBlock.style.top = "-8px"; + redBlock.style.borderRadius = '2px' + redBlock.addEventListener('click', () => { + // 弹出警报 + // if (is_jump) { + // this.player.currentTime(v.time); + // } + + }); + tooltip.className = 'tooltip'; + tooltip.style.height = '20px' + tooltip.style.display = 'flex' + tooltip.style.justifyContent = 'center' + tooltip.style.alignItems = 'center' + + tooltip_text.className='bubble' + tooltip_text.style.height = '30px' + tooltip_text.style.width = '80px' + tooltip_text.style.padding = '6px' + tooltip_text.style.height = '30px' + tooltip_text.textContent = options?.error_type + tooltip.appendChild(tooltip_text) + + tooltip.style.position = "absolute"; + tooltip.style.top = "-76px"; + tooltip.style.left = left+"%"; + tooltip.style.display = 'none'; + redBlock.addEventListener('mouseenter', function () { + tooltip.style.display = 'block'; + redBlock.style.transform = 'scale(1.1)'; + }); + + // 鼠标移出红色块时隐藏文本提示 + redBlock.addEventListener('mouseleave', function () { + tooltip.style.display = 'none'; + redBlock.style.transform = 'scale(1)'; + }); + // 将红色块添加到进度条中 + progressBar.appendChild(markerBlock); + }) + + // 在这里可以执行其他与视频持续时间相关的操作 + }); + } + + + + updateOverlay() { + // console.log(22222222) + // const overlayPosition = 5; // 在5秒处显示红色块 + // + // if (currentTime >= overlayPosition && currentTime <= overlayPosition + 5) { + // // 创建一个覆盖层 + // const overlay = document.createElement('div'); + // overlay.className = 'overlay'; + // overlay.style.position = 'absolute'; + // overlay.style.left = '50%'; + // overlay.style.transform = 'translateX(-50%)'; + // overlay.style.top = '50%'; + // overlay.style.transform = 'translateY(-50%)'; + // overlay.style.width = '10px'; + // overlay.style.height = '10px'; + // overlay.style.backgroundColor = 'red'; + // + // // 将覆盖层添加到视频容器中 + // this.player().el().appendChild(overlay); + // } else { + // // 如果不在5秒处,移除覆盖层 + // const overlay = this.player().el().querySelector('.overlay'); + // if (overlay) { + // overlay.remove(); + // } + // } + } + + dispose() { + super.dispose(); + videojs.log('the advanced plugin is being disposed'); + } + + updateState() { + this.setState({playing: !this.player.paused()}); + } + + logState(changed) { + videojs.log(`the player is now ${this.state.playing ? 'playing' : 'paused'}`); + } +} + +videojs.registerPlugin('advanced', Advanced); diff --git a/src/components/WebRtcPlayer/index.tsx b/src/components/WebRtcPlayer/index.tsx new file mode 100644 index 0000000..2a96abc --- /dev/null +++ b/src/components/WebRtcPlayer/index.tsx @@ -0,0 +1,32 @@ +import React, {useEffect} from 'react'; +// @ts-ignore +import WebRtcStreamer from 'webrtc-streamer/html/webrtcstreamer.js'; +export type Props = { + stream_url?: string; + server_url: string; + is_open: boolean; +}; +const WebRTCStreamer : React.FC<Props> = (props) =>{ + let webRtcServer: { connect: (arg0: string) => void; disconnect: () => void; } | null = null; + + useEffect(() => { + if (props.is_open) { + webRtcServer = new WebRtcStreamer("video", props.server_url); + if (webRtcServer && props.stream_url) { + webRtcServer.connect(props.stream_url); + + } + } + if (webRtcServer) { + webRtcServer.disconnect(); + } + }, [props.is_open, props.server_url, props.stream_url]); + + return ( + <div style={{height: '100%', width: '100%'}}> + <video style={{height: '100%', width: '100%'}} id="video" muted={true} controls={true} autoPlay={true} /> + </div> + ); +} + +export default WebRTCStreamer; diff --git a/src/components/index.ts b/src/components/index.ts new file mode 100644 index 0000000..ca88a6d --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1,12 @@ +/** + * 这个文件作为组件的目录 + * 目的是统一管理对外输出的组件,方便分类 + */ +/** + * 布局组件 + */ +import Footer from './Footer'; +import { Question, SelectLang } from './RightContent'; +import { AvatarDropdown, AvatarName } from './RightContent/AvatarDropdown'; + +export { Footer, Question, SelectLang, AvatarDropdown, AvatarName }; diff --git a/src/enums/common.ts b/src/enums/common.ts new file mode 100644 index 0000000..47e9ee7 --- /dev/null +++ b/src/enums/common.ts @@ -0,0 +1,9 @@ +// 是否启用 +export const isEnableEnum = { + '0' : { + color: '#999999', + }, + '1' : { + color: '#52C41A', + } +} \ No newline at end of file diff --git a/src/global.css b/src/global.css new file mode 100644 index 0000000..e11a1a9 --- /dev/null +++ b/src/global.css @@ -0,0 +1,280 @@ +html, +body, +#root { + height: 100%; + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; +} +.colorWeak { + filter: invert(80%); +} +.ant-layout { + min-height: 100vh; +} +.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed { + left: unset; +} +canvas { + display: block; +} +body { + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +ul, +ol { + list-style: none; +} +@media (max-width: 768px) { + .ant-table { + width: 100%; + overflow-x: auto; + } + .ant-table-thead > tr > th, + .ant-table-tbody > tr > th, + .ant-table-thead > tr > td, + .ant-table-tbody > tr > td { + white-space: pre; + } + .ant-table-thead > tr > th > span, + .ant-table-tbody > tr > th > span, + .ant-table-thead > tr > td > span, + .ant-table-tbody > tr > td > span { + display: block; + } +} +.keep-alive-tabs .ant-tabs-nav { + margin: 0; +} +.ant-pro .ant-pro-layout .ant-pro-layout-content { + padding: 0; +} +.ant-pro-form-login-page-left { + max-width: none !important; +} +.ant-pro-card-col.ant-pro-card-split-vertical { + border-inline-end: none; +} +.ant-pro-card-col.ant-pro-card-split-horizontal { + border-block-end: none; +} +/* 1108 update 全局样式新增调整 */ +.ant-table-cell .ant-btn.ant-btn-sm { + padding: 0; +} +.ant-pro-table-search .ant-form-item .ant-form-item-label { + text-align: left; +} +.ant-btn-link { + color: #155BD4; +} +.ant-pro-card .ant-pro-card-title { + color: #333333; + font-weight: 700; + font-size: 16px; +} +.ant-modal .ant-modal-content { + padding: 20px 24px; +} +.ant-modal-header { + padding-bottom: 10px; +} +/* 单行文本溢出显示省略号 */ +.single_line { + white-space: nowrap; + /* 防止文本换行 */ + overflow: hidden; + /* 隐藏溢出的文本 */ + text-overflow: ellipsis; + /* 显示省略号 */ +} +/* 多行文本溢出显示省略号 */ +.two_line { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + /* 限制显示的行数 */ + overflow: hidden; + /* 隐藏溢出的文本 */ +} +* { + padding: 0; + margin: 0; +} +/* 颜色 */ +.theme_color, +.ant-table-cell > a, +.ant-descriptions-item-content > a, +a.ant-dropdown-trigger { + color: #155BD4; +} +.theme_bg_color { + background-color: #155BD4; +} +.ant-btn-link.ant-btn-dangerous, +.ant-btn-default.ant-btn-dangerous { + color: #E80D0D; +} +.ant-btn-default.ant-btn-dangerous { + border-color: #E80D0D; +} +.ant-menu-light .ant-menu-item-selected, +.ant-menu-light > .ant-menu .ant-menu-item-selected { + background-color: #e8effb; +} +.ant-select-dropdown .ant-select-item-option-active:not(.ant-select-item-option-disabled) { + background-color: #e8effb; +} +.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected, +.ant-tree .ant-tree-checkbox + span.ant-tree-node-selected { + background-color: #e8effb; + color: #155BD4; +} +.ant-steps .ant-steps-item-active > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title { + color: #155BD4; +} +.ant-steps .ant-steps-item-active > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description { + color: #155BD4; +} +/* 表单 */ +.ant-form-item { + margin-bottom: 16px; +} +.ant-steps .ant-steps-item-finish .ant-steps-item-icon { + background-color: rgba(21, 91, 212, 0.1); + border-color: #155BD4; +} +.ant-pro-form-group-container { + gap: 0px 16px !important; +} +.ant-modal .ant-modal-title { + font-size: 18px; +} +.ant-modal-body .ant-pro-steps-form-steps-container { + max-width: 1900px !important; +} +/* 列表table && proTable */ +.ant-pro-table .ant-pro-table-list-toolbar-left { + flex: 0.3; +} +.ant-pro-table .ant-pro-table-search .ant-form .ant-pro-query-filter-row-split { + padding-right: 0 !important; +} +.rc-virtual-list-scrollbar-thumb { + display: none; +} +/* ant-descriptions */ +.ant-descriptions .ant-descriptions-row > th, +.ant-descriptions .ant-descriptions-row > td { + padding-right: 12px; +} +::-webkit-scrollbar-track-piece { + -webkit-border-radius: 0; +} +::-webkit-scrollbar { + width: 5px; + height: 10px; +} +::-webkit-scrollbar-thumb { + height: 50px; + background-color: #CCC; + -webkit-border-radius: 6px; + outline-offset: -2px; + -moz-opacity: 0.5; + -khtml-opacity: 0.5; + opacity: 0.5; +} +::-webkit-scrollbar-thumb:hover { + height: 50px; + background-color: #878987; + -webkit-border-radius: 6px; +} +.gn { + /* UI 规范表 // update 使用中 + 适用说明 + 字体大小、颜色、粗细 + 页面间距 +*/ +} +.gn .ant-pro-checkcard-content { + padding-inline: 0; + padding-block: 0; +} +.gn .ant-table-wrapper table tr th.ant-table-selection-column, +.gn .ant-table-wrapper table tr td.ant-table-selection-column, +.gn .ant-table-wrapper .ant-table-selection-column { + text-align: left; +} +.gn .ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column { + padding-left: 12px; +} +.gn .ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-nav-list { + padding: 0 24px; + margin-block-start: 0; +} +.gn .ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-nav-list .ant-tabs-tab-active { + font-weight: 700; +} +.gn .ant-pro-table-list-toolbar-container { + padding-block: 8px; +} +.gn .ant-pro-global-header-header-actions-item > * { + padding-block: 0; +} +.gn .ant-radio-group-large .ant-radio-button-wrapper { + height: 32px; + line-height: 32px; +} +.gn .ant-input-affix-wrapper-lg { + height: 32px; + line-height: 32px; + font-size: 14px; +} +.gn .ant-btn.ant-btn-lg { + font-size: 14px; + height: 32px; + border-radius: 4px; +} +.gn .ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child) { + border-start-start-radius: 4px; + border-end-start-radius: 4px; +} +.gn.h2 { + font-size: 18px; +} +.gn.h3 { + font-weight: 600; +} +.gn.h4 { + font-size: 14px; + font-weight: 700; + line-height: 18px; + color: #333333; +} +.gn .des_1 { + font-size: 12px; + font-weight: 400; + line-height: 22px; + color: #666666; +} +.gn .border_bottom_1 { + border-bottom: 1px solid #E0E0E0; +} +.gn.themeBgHover:hover { + background-color: #155BD4; +} +.showInfoDemo_wrap .ant-upload-wrapper .ant-upload-list.ant-upload-list-picture .ant-upload-list-item .ant-upload-list-item-thumbnail { + width: 100px; + height: auto; +} +.showInfoDemo_wrap .ant-upload-wrapper .ant-upload-list.ant-upload-list-picture .ant-upload-list-item { + height: auto; +} +.showInfoDemo_wrap .ant-upload-list-item-name { + display: none; +} +.showInfoDemo_wrap .ant-upload-extra { + padding: 0 !important; +} diff --git a/src/global.less b/src/global.less new file mode 100644 index 0000000..126df4f --- /dev/null +++ b/src/global.less @@ -0,0 +1,358 @@ +html, +body, +#root { + height: 100%; + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Noto Color Emoji'; +} + +.colorWeak { + filter: invert(80%); +} + +.ant-layout { + min-height: 100vh; +} +.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed { + left: unset; +} + +canvas { + display: block; +} + +body { + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +ul, +ol { + list-style: none; +} + +@media (max-width: 768px) { + .ant-table { + width: 100%; + overflow-x: auto; + &-thead > tr, + &-tbody > tr { + > th, + > td { + white-space: pre; + > span { + display: block; + } + } + } + } +} + +.keep-alive-tabs { + .ant-tabs-nav { + margin: 0; + } +} + +.ant-pro .ant-pro-layout .ant-pro-layout-content { + padding: 0; +} + + +.ant-pro-form-login-page-left{ + max-width: none !important; +} + +.ant-pro-card-col.ant-pro-card-split-vertical { + border-inline-end: none; +} + +.ant-pro-card-col.ant-pro-card-split-horizontal { + border-block-end: none; +} +/* 1108 update 全局样式新增调整 */ + + +// TODO_update 全局小尺寸按钮,统一间距 (列表操作栏位按钮) +.ant-table-cell .ant-btn.ant-btn-sm{ + padding: 0; +} +// 更多 +.ant-pro-table-search .ant-form-item .ant-form-item-label{ + text-align: left +} + +.ant-btn-link{ + color: #155BD4; +} + +.ant-pro-card .ant-pro-card-title { + color: #333333; + font-weight: 700; + font-size: 16px; +} + +// 弹出框 +.ant-modal .ant-modal-content{ + padding: 20px 24px; +} +.ant-modal-header{ + padding-bottom: 10px; +} + +// TODO_update 自定义样式块 + +/* 单行文本溢出显示省略号 */ +.single_line { + white-space: nowrap; /* 防止文本换行 */ + overflow: hidden; /* 隐藏溢出的文本 */ + text-overflow: ellipsis; /* 显示省略号 */ +} + +/* 多行文本溢出显示省略号 */ +.two_line { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; /* 限制显示的行数 */ + overflow: hidden; /* 隐藏溢出的文本 */ +} + +* { + padding: 0; + margin: 0; +} + + +/* 颜色 */ +.theme_color, .ant-table-cell>a, +.ant-descriptions-item-content>a, +a.ant-dropdown-trigger{ + color: #155BD4; +} + +.theme_bg_color{ + background-color: #155BD4; +} + +.ant-btn-link.ant-btn-dangerous, .ant-btn-default.ant-btn-dangerous { + color: #E80D0D; +} +.ant-btn-default.ant-btn-dangerous{ + border-color: #E80D0D; +} + +.ant-menu-light .ant-menu-item-selected, .ant-menu-light>.ant-menu .ant-menu-item-selected { + background-color: #e8effb; +} + +.ant-select-dropdown .ant-select-item-option-active:not(.ant-select-item-option-disabled) { + background-color: #e8effb; +} +.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected, .ant-tree .ant-tree-checkbox+span.ant-tree-node-selected { + background-color: #e8effb; + color: #155BD4; +} + +.ant-steps .ant-steps-item-active>.ant-steps-item-container>.ant-steps-item-content{ + &> .ant-steps-item-title{ + color: #155BD4; + + } + &> .ant-steps-item-description{ + color: #155BD4; + // color: #155cd5; + + } +} + +/* 表单 */ +.ant-form-item { + margin-bottom: 16px; +} +// 分步表单步骤条 +.ant-steps .ant-steps-item-finish .ant-steps-item-icon{ + background-color: rgba(#155BD4, 0.1); + border-color: #155BD4; +} +// 表单项之间间距 +.ant-pro-form-group-container{ + gap: 0px 16px !important; +} +.ant-modal .ant-modal-title{ + font-size: 18px; +} + + +.ant-modal-body .ant-pro-steps-form-steps-container{ + max-width: 1900px !important; +} +/* 列表table && proTable */ +// proTable +.ant-pro-table{ + // 标题栏左侧文字最大弹性占比 + .ant-pro-table-list-toolbar-left{ + flex: 0.3 + } + // 筛选表单 + .ant-pro-table-search{ + .ant-form{ + .ant-pro-query-filter-row-split{ + padding-right: 0 !important; + } + } + } +} +.rc-virtual-list-scrollbar-thumb{ + display: none +} +/* ant-descriptions */ +.ant-descriptions{ + .ant-descriptions-row >th, + .ant-descriptions-row >td { + padding-right: 12px; + } +} + +// 美化滚动条 +::-webkit-scrollbar-track-piece { + -webkit-border-radius: 0 +} +::-webkit-scrollbar { + width: 5px; + height: 10px +} +::-webkit-scrollbar-thumb { + height: 50px; + background-color: #CCC; + -webkit-border-radius: 6px; + outline-offset: -2px; + -moz-opacity: 0.5; + -khtml-opacity: 0.5; + opacity: 0.5 +} +::-webkit-scrollbar-thumb:hover { + height: 50px; + background-color: #878987; + -webkit-border-radius: 6px +} + +.gn { + // TODO_update 重置覆盖默认样式,使用统一类名gn + 需要覆盖的类名 + .ant-pro-checkcard-content { + padding-inline: 0; + padding-block: 0; + } + .ant-table-wrapper table tr th.ant-table-selection-column, + .ant-table-wrapper table tr td.ant-table-selection-column, + .ant-table-wrapper .ant-table-selection-column{ + text-align: left; + } + .ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column{ + padding-left: 12px; + } + + .ant-tabs >.ant-tabs-nav .ant-tabs-nav-wrap{ + .ant-tabs-nav-list{ + padding: 0 24px; + margin-block-start: 0; + .ant-tabs-tab-active{ + font-weight: 700 + } + } + } + + .ant-pro-table-list-toolbar-container { + padding-block: 8px; + } + + .ant-pro-global-header-header-actions-item >*{ + padding-block: 0; + } + + .ant-radio-group-large .ant-radio-button-wrapper { + height: 32px; + line-height: 32px; + } + .ant-input-affix-wrapper-lg{ + height: 32px; + line-height: 32px; + font-size: 14px; + } + .ant-btn.ant-btn-lg { + font-size: 14px; + height: 32px; + border-radius: 4px; + } + .ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child) { + border-start-start-radius: 4px; + border-end-start-radius: 4px; +} + + /* UI 规范表 // update 使用中 + 适用说明 + 字体大小、颜色、粗细 + 页面间距 +*/ + // &.p1 { + // line-height: ; + // font-weight: 600; + // } + &.h2{ + font-size: 18px; + } + + &.h3{ + font-weight: 600; + } + + &.h4{ + font-size: 14px; + font-weight: 700; + line-height: 18px; + color: rgba(51, 51, 51, 1); + + } + + .des_1{ + font-size: 12px; + font-weight: 400; + line-height: 22px; + color: rgba(102, 102, 102, 1) + } + // 边框 + .border_bottom_1 { + border-bottom: 1px solid #E0E0E0 + } + + &.themeBgHover:hover{ + background-color: #155BD4; + } +} +// .p1{ + +// } + +.showInfoDemo_wrap{ + .ant-upload-wrapper .ant-upload-list.ant-upload-list-picture .ant-upload-list-item .ant-upload-list-item-thumbnail{ + width: 100px; + height: auto; + } + .ant-upload-wrapper .ant-upload-list.ant-upload-list-picture .ant-upload-list-item{ + height: auto; + } +.ant-upload-list-item-name{ + display: none; + } + .ant-upload-extra{ + padding: 0 !important; + } +} + + + + + diff --git a/src/global.tsx b/src/global.tsx new file mode 100644 index 0000000..afa1fab --- /dev/null +++ b/src/global.tsx @@ -0,0 +1,91 @@ +import { useIntl } from '@umijs/max'; +import { Button, message, notification } from 'antd'; +import defaultSettings from '../config/defaultSettings'; + +const { pwa } = defaultSettings; +const isHttps = document.location.protocol === 'https:'; + +const clearCache = () => { + // remove all caches + if (window.caches) { + caches + .keys() + .then((keys) => { + keys.forEach((key) => { + caches.delete(key); + }); + }) + .catch((e) => console.log(e)); + } +}; + +// if pwa is true +if (pwa) { + // Notify user if offline now + window.addEventListener('sw.offline', () => { + message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' })); + }); + + // Pop up a prompt on the page asking the user if they want to use the latest version + window.addEventListener('sw.updated', (event: Event) => { + const e = event as CustomEvent; + const reloadSW = async () => { + // Check if there is sw whose state is waiting in ServiceWorkerRegistration + // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration + const worker = e.detail && e.detail.waiting; + if (!worker) { + return true; + } + // Send skip-waiting event to waiting SW with MessageChannel + await new Promise((resolve, reject) => { + const channel = new MessageChannel(); + channel.port1.onmessage = (msgEvent) => { + if (msgEvent.data.error) { + reject(msgEvent.data.error); + } else { + resolve(msgEvent.data); + } + }; + worker.postMessage({ type: 'skip-waiting' }, [channel.port2]); + }); + + clearCache(); + window.location.reload(); + return true; + }; + const key = `open${Date.now()}`; + const btn = ( + <Button + type="primary" + onClick={() => { + notification.destroy(key); + reloadSW(); + }} + > + {useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })} + </Button> + ); + notification.open({ + message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }), + description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }), + btn, + key, + onClose: async () => null, + }); + }); +} else if ('serviceWorker' in navigator && isHttps) { + // unregister service worker + const { serviceWorker } = navigator; + if (serviceWorker.getRegistrations) { + serviceWorker.getRegistrations().then((sws) => { + sws.forEach((sw) => { + sw.unregister(); + }); + }); + } + serviceWorker.getRegistration().then((sw) => { + if (sw) sw.unregister(); + }); + + clearCache(); +} diff --git a/src/hooks/useUuid.ts b/src/hooks/useUuid.ts new file mode 100644 index 0000000..ef58cfc --- /dev/null +++ b/src/hooks/useUuid.ts @@ -0,0 +1,15 @@ +import { v4 as uuidv4 } from 'uuid'; + +export type useUuidProps = { + fetchUuid: () => string; +}; +export const useUuid = (): useUuidProps => { + const fetchUuid = () => { + const id = uuidv4(); + console.log(id); + return id; + }; + return { + fetchUuid, + }; +}; diff --git a/src/layouts/context.tsx b/src/layouts/context.tsx new file mode 100644 index 0000000..68754a7 --- /dev/null +++ b/src/layouts/context.tsx @@ -0,0 +1,20 @@ +import { createContext } from 'react' + +interface KeepAliveTabContextType { + refreshTab: (path?: string) => void; + closeTab: (path?: string) => void; + closeOtherTab: (path?: string) => void; + onShow: (cb: () => void) => void; + onHidden: (cb: () => void) => void; +} + +const defaultValue = { + refreshTab: () => { }, + closeTab: () => { }, + closeOtherTab: () => { }, + onShow: () => { }, + onHidden: () => { }, +} + + +export const KeepAliveTabContext = createContext<KeepAliveTabContextType>(defaultValue); diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx new file mode 100644 index 0000000..1dfb9fb --- /dev/null +++ b/src/layouts/index.tsx @@ -0,0 +1,138 @@ +import { Dropdown, Tabs } from 'antd'; +import { useCallback, useMemo } from 'react'; +import { history } from '@umijs/max'; + +import { KeepAliveTab, useKeepAliveTabs } from './useKeepAliveTabs'; +import type { ItemType, MenuInfo } from 'rc-menu/lib/interface'; +import { KeepAliveTabContext } from './context'; +enum OperationType { + REFRESH = 'refresh', + CLOSE = 'close', + CLOSEOTHER = 'close-other', +} + + +type MenuItemType = ItemType & { key: OperationType } | null; + +const KeepAliveLayout = () => { + + const { + keepAliveTabs, + activeTabRoutePath, + closeTab, + refreshTab, + closeOtherTab, + onHidden, + onShow, + } = useKeepAliveTabs(); + + const menuItems: MenuItemType[] = useMemo(() => [ + { + label: '刷新', + key: OperationType.REFRESH, + }, + keepAliveTabs.length <= 1 ? null : { + label: '关闭', + key: OperationType.CLOSE, + }, + keepAliveTabs.length <= 1 ? null : { + label: '关闭其他', + key: OperationType.CLOSEOTHER, + }, + ].filter(o => o), [keepAliveTabs]); + + const menuClick = useCallback(({ key, domEvent }: MenuInfo, tab: KeepAliveTab) => { + domEvent.stopPropagation(); + + if (key === OperationType.REFRESH) { + refreshTab(tab.routePath); + } else if (key === OperationType.CLOSE) { + closeTab(tab.routePath); + } else if (key === OperationType.CLOSEOTHER) { + closeOtherTab(tab.routePath); + } + }, [closeOtherTab, closeTab, refreshTab]); + + + const renderTabTitle = useCallback((tab: KeepAliveTab) => { + return ( + <Dropdown + menu={{ items: menuItems, onClick: (e) => menuClick(e, tab) }} + trigger={['contextMenu']} + > + <div style={{ margin: '-12px 0', padding: '12px 0' }}> + {/*{tab.icon}*/} + {tab.title} + </div> + </Dropdown> + ) + }, [menuItems]); + + const tabItems = useMemo(() => { + let finalKeepAliveTabs = keepAliveTabs + // .filter(item => !item?.isHideTab) + return finalKeepAliveTabs.map(tab => { + console.log(tab,'tabItems') + // TODO 未找到合适办法只去除tab标题栏位,保留页面内容 + return { + key: tab.routePath, + label: renderTabTitle(tab), + children: ( + <div + key={tab.key} + style={{ height: 'calc(100vh - 232px)', overflow: 'auto' }} + > + {tab.children} + </div> + ), + // style: {display: 'none'}, + closable: keepAliveTabs.length > 1, + forceRender: true + } + }) + }, [keepAliveTabs]); + + const onTabsChange = useCallback((tabRoutePath: string) => { + const curTab = keepAliveTabs.find(o => o.routePath === tabRoutePath); + if (curTab) { + history.push(curTab?.pathname); + } + }, [keepAliveTabs]); + + const onTabEdit = ( + targetKey: React.MouseEvent | React.KeyboardEvent | string, + action: 'add' | 'remove', + ) => { + if (action === 'remove') { + closeTab(targetKey as string); + } + }; + + const keepAliveContextValue = useMemo( + () => ({ + closeTab, + closeOtherTab, + refreshTab, + onHidden, + onShow, + }), + [closeTab, closeOtherTab, refreshTab, onHidden, onShow] + ); + + return ( + <KeepAliveTabContext.Provider value={keepAliveContextValue}> + <Tabs + type="editable-card" + items={tabItems} + activeKey={activeTabRoutePath} + onChange={onTabsChange} + className='keep-alive-tabs' + hideAdd + animated={false} + onEdit={onTabEdit} + /> + </KeepAliveTabContext.Provider> + ) +} + +export default KeepAliveLayout; diff --git a/src/layouts/treeAndTableList.tsx b/src/layouts/treeAndTableList.tsx new file mode 100644 index 0000000..88f272d --- /dev/null +++ b/src/layouts/treeAndTableList.tsx @@ -0,0 +1,69 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-21 13:42:31 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-24 16:01:20 + * @FilePath: \general-ai-platform-web\src\layouts\treeAndTableList.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { ProCard } from '@ant-design/pro-components'; +import { CardProps } from 'antd'; +// 此模块使用的 ProCardType +export interface ProCardTypeProps extends CardProps { + colSpan?: string; + headerBordered?: boolean; +} + +// 当前组件类型 +type TreeAndTableListProps = { + leftCard?: ProCardTypeProps; + rightCard?: ProCardTypeProps; + leftDom: any; + rightDom: any; +}; + +const TreeAndTableList: React.FC<TreeAndTableListProps> = (props) => { + // 业务层接收 + const { leftCard, rightCard, leftDom, rightDom } = props; + + // 统一配置 + let finalLeftCard: ProCardTypeProps = { + // 左侧卡片 + headStyle: { paddingTop: 24, paddingLeft: 20, paddingRight: 20, paddingBottom:12 ,borderBottom: '1px solid #E0E0E0' }, + bodyStyle: {paddingLeft: 20, paddingRight: 20}, + colSpan: '22%', + }; + let finalRightCard: ProCardTypeProps = { + headStyle: { padding: 0, margin: 0, background: 'transparent' }, + bodyStyle: { padding: 0, margin: 0 }, + headerBordered: true, + // 右侧卡片 + colSpan: '76.5%', + }; + if (leftCard) { + Object.assign(finalLeftCard, leftCard); + } + + if (rightCard) { + Object.assign(finalRightCard, rightCard); + } + return ( + <> + <ProCard + style={{ display: 'flex', width: '100%', background: 'transparent' }} + bodyStyle={{ + padding: 0, + margin: 0, + display: 'flex', + justifyContent: 'space-between', + }} + > + {/* 后续依据业务需要动态调整 */} + <ProCard {...finalLeftCard}>{leftDom}</ProCard> + <ProCard {...finalRightCard}>{rightDom}</ProCard> + </ProCard> + </> + ); +}; + +export default TreeAndTableList; diff --git a/src/layouts/useKeepAliveTabs.tsx b/src/layouts/useKeepAliveTabs.tsx new file mode 100644 index 0000000..4d369fb --- /dev/null +++ b/src/layouts/useKeepAliveTabs.tsx @@ -0,0 +1,152 @@ +import { useCallback, useEffect, useState, useRef } from 'react'; +import { useMatchRoute } from './useMatchRoute'; +import { history } from '@umijs/max'; + +export interface KeepAliveTab { + isHideTab: any; + title: string; + routePath: string; + key: string; // 这个key,后面刷新有用到它 + pathname: string; + icon?: any; + children: any; +} + +function getKey() { + return new Date().getTime().toString(); +} + +export function useKeepAliveTabs() { + const [keepAliveTabs, setKeepAliveTabs] = useState<KeepAliveTab[]>([]); + const [activeTabRoutePath, setActiveTabRoutePath] = useState<string>(''); + + const keepAliveShowEvents = useRef<Record<string, Array<() => void>>>({}); + const keepAliveHiddenEvents = useRef<Record<string, Array<() => void>>>({}); + + const matchRoute = useMatchRoute(); + + const onShow = useCallback((cb: () => void) => { + if (!keepAliveShowEvents.current[activeTabRoutePath]) { + keepAliveShowEvents.current[activeTabRoutePath] = []; + } + keepAliveShowEvents.current[activeTabRoutePath].push(cb); + }, [activeTabRoutePath]) + + const onHidden = useCallback((cb: () => void) => { + if (!keepAliveHiddenEvents.current[activeTabRoutePath]) { + keepAliveHiddenEvents.current[activeTabRoutePath] = []; + } + keepAliveHiddenEvents.current[activeTabRoutePath].push(cb); + }, [activeTabRoutePath]) + + // 关闭tab + const closeTab = useCallback( + (routePath: string = activeTabRoutePath) => { + + const index = keepAliveTabs.findIndex(o => o.routePath === routePath); + if (keepAliveTabs[index].routePath === activeTabRoutePath) { + if (index > 0) { + history.push(keepAliveTabs[index - 1].routePath); + } else { + history.push(keepAliveTabs[index + 1].routePath); + } + } + keepAliveTabs.splice(index, 1); + + delete keepAliveHiddenEvents.current[routePath]; + delete keepAliveShowEvents.current[routePath]; + + setKeepAliveTabs([...keepAliveTabs]); + }, + [activeTabRoutePath], + ); + + // 关闭其他 + const closeOtherTab = useCallback((routePath: string = activeTabRoutePath) => { + const toCloseTabs = keepAliveTabs.filter(o => o.routePath !== routePath); + // 清除被关闭的tab注册的onShow事件和onHidden事件 + toCloseTabs.forEach(tab => { + delete keepAliveHiddenEvents.current[tab.routePath]; + delete keepAliveShowEvents.current[tab.routePath]; + }); + + setKeepAliveTabs(prev => prev.filter(o => o.routePath === routePath)); + }, [activeTabRoutePath]); + + // 刷新tab + const refreshTab = useCallback((routePath: string = activeTabRoutePath) => { + setKeepAliveTabs(prev => { + const index = prev.findIndex(tab => tab.routePath === routePath); + + if (index >= 0) { + // 这个react的特性,key变了,组件会卸载重新渲染 + prev[index].key = getKey(); + } + + delete keepAliveHiddenEvents.current[prev[index].routePath]; + delete keepAliveShowEvents.current[prev[index].routePath]; + + return [...prev]; + }); + }, [activeTabRoutePath]); + + useEffect(() => { + + if (!matchRoute) return; + + const existKeepAliveTab = keepAliveTabs.find(o => o.routePath === matchRoute?.routePath); + + setActiveTabRoutePath(matchRoute.routePath); + + // 如果不存在则需要插入 + if (!existKeepAliveTab) { + setKeepAliveTabs(prev => [...prev, { + title: matchRoute.title, + key: getKey(), + routePath: matchRoute.routePath, + pathname: matchRoute.pathname, + children: matchRoute.children, + icon: matchRoute.icon, + isHideTab: matchRoute.isHideTab + }]); + } else if (existKeepAliveTab.pathname !== matchRoute.pathname) { + // 如果是同一个路由,但是参数不同,我们只需要刷新当前页签并且把pathname设置为新的pathname, children设置为新的children + setKeepAliveTabs(prev => { + const index = prev.findIndex(tab => tab.routePath === matchRoute.routePath); + + if (index >= 0) { + prev[index].key = getKey(); + prev[index].pathname = matchRoute.pathname; + prev[index].children = matchRoute.children; + } + + delete keepAliveHiddenEvents.current[prev[index].routePath]; + delete keepAliveShowEvents.current[prev[index].routePath]; + + return [...prev]; + }); + } else { + // 如果存在,触发组件的onShow的回调 + (keepAliveShowEvents.current[existKeepAliveTab.routePath] || []).forEach(cb => { + cb(); + }); + } + + // 路由改变,执行上一个tab的onHidden事件 + (keepAliveHiddenEvents.current[activeTabRoutePath] || []).forEach(cb => { + cb(); + }); + + }, [matchRoute]) + + + return { + keepAliveTabs, + activeTabRoutePath, + closeTab, + refreshTab, + closeOtherTab, + onShow, + onHidden, + } +} diff --git a/src/layouts/useMatchRoute.tsx b/src/layouts/useMatchRoute.tsx new file mode 100644 index 0000000..f5ae488 --- /dev/null +++ b/src/layouts/useMatchRoute.tsx @@ -0,0 +1,88 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-01 13:56:33 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-10 11:26:54 + * @FilePath: \general-ai-platform-web\src\layouts\useMatchRoute.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { IRoute, history, useAppData, useIntl, useLocation, useOutlet, useSelectedRoutes } from '@umijs/max'; +import { useEffect, useState } from 'react'; + +type CustomIRoute = IRoute & { + name: string; +} + +interface MatchRouteType { + title: string; + pathname: string; // /user/1 + children: any; + routePath: string; // /user/:id + icon?: any; + isHideTab?: boolean +} + +export function useMatchRoute() { + // 获取匹配到的路由 + const selectedRoutes = useSelectedRoutes(); + // 获取路由组件实例 + const children = useOutlet(); + // 获取所有路由 + const { routes } = useAppData(); + // 获取当前url + const { pathname } = useLocation(); + // 国际化方法,因为默认菜单做了国际化,所以需要把菜单转成中文 + const { formatMessage } = useIntl(); + + const [matchRoute, setMatchRoute] = useState<MatchRouteType | undefined>(); + + // 处理菜单名称 + const getMenuTitle = (lastRoute: any) => { + let curRoute = lastRoute.route; + let names = ['menu']; + while (curRoute.parentId && !curRoute.isLayout) { + if ((routes[curRoute.parentId] as CustomIRoute).name) { + names.push((routes[curRoute.parentId] as CustomIRoute).name); + } else { + break; + } + curRoute = routes[curRoute.parentId]; + } + names.push(lastRoute.route.name); + + return formatMessage({ id: names.join('.') }); + } + + // 监听pathname变了,说明路由有变化,重新匹配,返回新路由信息 + useEffect(() => { + + // 获取当前匹配的路由 + const lastRoute = selectedRoutes.at(-1); + + if (!lastRoute?.route?.path) return; + + const routeDetail = routes[(lastRoute.route as any).id]; + + // 如果匹配的路由需要重定向,这里直接重定向 + if (routeDetail?.redirect) { + history.replace(routeDetail?.redirect); + return; + } + + // 获取菜单名称 + const title = getMenuTitle(lastRoute); + console.log(lastRoute,'lastRoute') + setMatchRoute({ + title, + pathname, + children, + routePath: lastRoute.route.path, + icon: (lastRoute.route as any).icon, // icon是拓展出来的字段 + isHideTab: (lastRoute.route as any)?.isHideTab || false, //isHideTab 是否在tab栏位中隐藏 + }); + + }, [pathname]) + + + return matchRoute; +} diff --git a/src/locales/bn-BD.ts b/src/locales/bn-BD.ts new file mode 100644 index 0000000..f9f6afd --- /dev/null +++ b/src/locales/bn-BD.ts @@ -0,0 +1,26 @@ +import component from './bn-BD/component'; +import globalHeader from './bn-BD/globalHeader'; +import menu from './bn-BD/menu'; +import pages from './bn-BD/pages'; +import pwa from './bn-BD/pwa'; +import settingDrawer from './bn-BD/settingDrawer'; +import settings from './bn-BD/settings'; + +export default { + 'navBar.lang': 'ভাষা', + 'layout.user.link.help': 'সহায়তা', + 'layout.user.link.privacy': 'গোপনীয়তা', + 'layout.user.link.terms': 'শর্তাদি', + 'app.copyright.produced': 'প্রযোজনা করেছেন অ্যান্ট ফিনান্সিয়াল এক্সপেরিয়েন্স ডিপার্টমেন্ট', + 'app.preview.down.block': 'আপনার স্থানীয় প্রকল্পে এই পৃষ্ঠাটি ডাউনলোড করুন', + 'app.welcome.link.fetch-blocks': 'সমস্ত ব্লক পান', + 'app.welcome.link.block-list': + '`block` ডেভেলপমেন্ট এর উপর ভিত্তি করে দ্রুত স্ট্যান্ডার্ড, পৃষ্ঠাসমূহ তৈরি করুন।', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...pages, +}; diff --git a/src/locales/bn-BD/component.ts b/src/locales/bn-BD/component.ts new file mode 100644 index 0000000..a546e75 --- /dev/null +++ b/src/locales/bn-BD/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'বিস্তৃত', + 'component.tagSelect.collapse': 'সঙ্কুচিত', + 'component.tagSelect.all': 'সব', +}; diff --git a/src/locales/bn-BD/globalHeader.ts b/src/locales/bn-BD/globalHeader.ts new file mode 100644 index 0000000..2679be4 --- /dev/null +++ b/src/locales/bn-BD/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'অনুসন্ধান করুন', + 'component.globalHeader.search.example1': 'অনুসন্ধান উদাহরণ ১', + 'component.globalHeader.search.example2': 'অনুসন্ধান উদাহরণ ২', + 'component.globalHeader.search.example3': 'অনুসন্ধান উদাহরণ ৩', + 'component.globalHeader.help': 'সহায়তা', + 'component.globalHeader.notification': 'বিজ্ঞপ্তি', + 'component.globalHeader.notification.empty': 'আপনি সমস্ত বিজ্ঞপ্তি দেখেছেন।', + 'component.globalHeader.message': 'বার্তা', + 'component.globalHeader.message.empty': 'আপনি সমস্ত বার্তা দেখেছেন।', + 'component.globalHeader.event': 'ঘটনা', + 'component.globalHeader.event.empty': 'আপনি সমস্ত ইভেন্ট দেখেছেন।', + 'component.noticeIcon.clear': 'সাফ', + 'component.noticeIcon.cleared': 'সাফ করা হয়েছে', + 'component.noticeIcon.empty': 'বিজ্ঞপ্তি নেই', + 'component.noticeIcon.view-more': 'আরো দেখুন', +}; diff --git a/src/locales/bn-BD/menu.ts b/src/locales/bn-BD/menu.ts new file mode 100644 index 0000000..ae511a0 --- /dev/null +++ b/src/locales/bn-BD/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'স্বাগতম', + 'menu.more-blocks': 'আরও ব্লক', + 'menu.home': 'নীড়', + 'menu.admin': 'অ্যাডমিন', + 'menu.admin.sub-page': 'উপ-পৃষ্ঠা', + 'menu.login': 'প্রবেশ', + 'menu.register': 'নিবন্ধন', + 'menu.register-result': 'নিবন্ধনে ফলাফল', + 'menu.dashboard': 'ড্যাশবোর্ড', + 'menu.dashboard.analysis': 'বিশ্লেষণ', + 'menu.dashboard.monitor': 'নিরীক্ষণ', + 'menu.dashboard.workplace': 'কর্মক্ষেত্র', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'ফর্ম', + 'menu.form.basic-form': 'বেসিক ফর্ম', + 'menu.form.step-form': 'পদক্ষেপ ফর্ম', + 'menu.form.step-form.info': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য লিখুন)', + 'menu.form.step-form.confirm': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য নিশ্চিত করুন)', + 'menu.form.step-form.result': 'পদক্ষেপ ফর্ম (সমাপ্ত)', + 'menu.form.advanced-form': 'উন্নত ফর্ম', + 'menu.list': 'তালিকা', + 'menu.list.table-list': 'অনুসন্ধানের টেবিল', + 'menu.list.basic-list': 'বেসিক তালিকা', + 'menu.list.card-list': 'কার্ডের তালিকা', + 'menu.list.search-list': 'অনুসন্ধানের তালিকা', + 'menu.list.search-list.articles': 'অনুসন্ধানের তালিকা (নিবন্ধসমূহ)', + 'menu.list.search-list.projects': 'অনুসন্ধানের তালিকা (প্রকল্পগুলি)', + 'menu.list.search-list.applications': 'অনুসন্ধানের তালিকা (অ্যাপ্লিকেশন)', + 'menu.profile': 'প্রোফাইল', + 'menu.profile.basic': 'বেসিক প্রোফাইল', + 'menu.profile.advanced': 'উন্নত প্রোফাইল', + 'menu.result': 'ফলাফল', + 'menu.result.success': 'সাফল্য', + 'menu.result.fail': 'ব্যর্থ', + 'menu.exception': 'ব্যতিক্রম', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'ট্রিগার', + 'menu.account': 'হিসাব', + 'menu.account.center': 'অ্যাকাউন্ট কেন্দ্র', + 'menu.account.settings': 'অ্যাকাউন্ট সেটিংস', + 'menu.account.trigger': 'ট্রিগার ত্রুটি', + 'menu.account.logout': 'প্রস্থান', + 'menu.editor': 'গ্রাফিক সম্পাদক', + 'menu.editor.flow': 'ফ্লো এডিটর', + 'menu.editor.mind': 'মাইন্ড এডিটর', + 'menu.editor.koni': 'কোনি সম্পাদক', +}; diff --git a/src/locales/bn-BD/pages.ts b/src/locales/bn-BD/pages.ts new file mode 100644 index 0000000..529900a --- /dev/null +++ b/src/locales/bn-BD/pages.ts @@ -0,0 +1,68 @@ +export default { + 'pages.layouts.userLayout.title': + 'পিঁপড়া ডিজাইন হচ্ছে সিহু জেলার সবচেয়ে প্রভাবশালী ওয়েব ডিজাইনের স্পেসিফিকেশন', + 'pages.login.accountLogin.tab': 'অ্যাকাউন্টে লগইন', + 'pages.login.accountLogin.errorMessage': 'ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড(admin/ant.design)', + 'pages.login.failure': 'লগইন ব্যর্থ হয়েছে। আবার চেষ্টা করুন!', + 'pages.login.success': 'সফল লগইন!', + 'pages.login.username.placeholder': 'ব্যবহারকারীর নাম: admin or user', + 'pages.login.username.required': 'আপনার ব্যবহারকারীর নাম ইনপুট করুন!', + 'pages.login.password.placeholder': 'পাসওয়ার্ড: ant.design', + 'pages.login.password.required': 'আপনার পাসওয়ার্ড ইনপুট করুন!', + 'pages.login.phoneLogin.tab': 'ফোন লগইন', + 'pages.login.phoneLogin.errorMessage': 'যাচাইকরণ কোড ত্রুটি', + 'pages.login.phoneNumber.placeholder': 'ফোন নম্বর', + 'pages.login.phoneNumber.required': 'আপনার ফোন নম্বর ইনপুট করুন!', + 'pages.login.phoneNumber.invalid': 'ফোন নম্বরটি সঠিক নয়!', + 'pages.login.captcha.placeholder': 'যাচাইকরণের কোড', + 'pages.login.captcha.required': 'দয়া করে ভেরিফিকেশন কোডটি ইনপুট করুন!', + 'pages.login.phoneLogin.getVerificationCode': 'কোড পান', + 'pages.getCaptchaSecondText': 'সেকেন্ড', + 'pages.login.rememberMe': 'আমাকে মনে রাখুন', + 'pages.login.forgotPassword': 'পাসওয়ার্ড ভুলে গেছেন?', + 'pages.login.submit': 'প্রবেশ করুন', + 'pages.login.loginWith': 'লগইন করতে পারেন:', + 'pages.login.registerAccount': 'অ্যাকাউন্ট নিবন্ধন করুন', + 'pages.welcome.link': 'স্বাগতম', + 'pages.welcome.alertMessage': 'দ্রুত এবং শক্তিশালী ভারী শুল্ক উপাদান প্রকাশ করা হয়েছে।', + 'pages.admin.subPage.title': 'এই পৃষ্ঠাটি কেবল অ্যাডমিন দ্বারা দেখা যাবে', + 'pages.admin.subPage.alertMessage': + 'UMI UI এখন প্রকাশিত হয়েছে, অভিজ্ঞতা শুরু করতে npm run ui ব্যবহার করতে স্বাগতম।', + 'pages.searchTable.createForm.newRule': 'নতুন বিধি', + 'pages.searchTable.updateForm.ruleConfig': 'বিধি কনফিগারেশন', + 'pages.searchTable.updateForm.basicConfig': 'মৌলিক তথ্য', + 'pages.searchTable.updateForm.ruleName.nameLabel': 'বিধি নাম', + 'pages.searchTable.updateForm.ruleName.nameRules': 'বিধির নাম লিখুন!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': 'বিধির বিবরণ', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'কমপক্ষে পাঁচটি অক্ষর লিখুন', + 'pages.searchTable.updateForm.ruleDesc.descRules': + 'কমপক্ষে পাঁচটি অক্ষরের একটি বিধান বিবরণ লিখুন!', + 'pages.searchTable.updateForm.ruleProps.title': 'বৈশিষ্ট্য কনফিগার করুন', + 'pages.searchTable.updateForm.object': 'নিরীক্ষণ অবজেক্ট', + 'pages.searchTable.updateForm.ruleProps.templateLabel': 'বিধি টেম্পলেট', + 'pages.searchTable.updateForm.ruleProps.typeLabel': 'বিধি প্রকার', + 'pages.searchTable.updateForm.schedulingPeriod.title': 'সময়সূচী নির্ধারণ করুন', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'শুরুর সময়', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'একটি শুরুর সময় চয়ন করুন!', + 'pages.searchTable.titleDesc': 'বর্ণনা', + 'pages.searchTable.ruleName': 'বিধি নাম প্রয়োজন', + 'pages.searchTable.titleCallNo': 'পরিষেবা কল সংখ্যা', + 'pages.searchTable.titleStatus': 'অবস্থা', + 'pages.searchTable.nameStatus.default': 'ডিফল্ট', + 'pages.searchTable.nameStatus.running': 'চলমান', + 'pages.searchTable.nameStatus.online': 'অনলাইন', + 'pages.searchTable.nameStatus.abnormal': 'অস্বাভাবিক', + 'pages.searchTable.titleUpdatedAt': 'সর্বশেষ নির্ধারিত', + 'pages.searchTable.exception': 'ব্যতিক্রম জন্য কারণ লিখুন!', + 'pages.searchTable.titleOption': 'অপশন', + 'pages.searchTable.config': 'কনফিগারেশন', + 'pages.searchTable.subscribeAlert': 'সতর্কতা সাবস্ক্রাইব করুন', + 'pages.searchTable.title': 'ইনকয়েরি ফরম', + 'pages.searchTable.new': 'নতুন', + 'pages.searchTable.chosen': 'নির্বাচিত', + 'pages.searchTable.item': 'আইটেম', + 'pages.searchTable.totalServiceCalls': 'পরিষেবা কলগুলির মোট সংখ্যা', + 'pages.searchTable.tenThousand': '000', + 'pages.searchTable.batchDeletion': 'একসাখে ডিলিট', + 'pages.searchTable.batchApproval': 'একসাখে অনুমোদন', +}; diff --git a/src/locales/bn-BD/pwa.ts b/src/locales/bn-BD/pwa.ts new file mode 100644 index 0000000..233fb30 --- /dev/null +++ b/src/locales/bn-BD/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'আপনি এখন অফলাইন', + 'app.pwa.serviceworker.updated': 'নতুন সামগ্রী উপলব্ধ', + 'app.pwa.serviceworker.updated.hint': + 'বর্তমান পৃষ্ঠাটি পুনরায় লোড করতে দয়া করে "রিফ্রেশ" বোতাম টিপুন', + 'app.pwa.serviceworker.updated.ok': 'রিফ্রেশ', +}; diff --git a/src/locales/bn-BD/settingDrawer.ts b/src/locales/bn-BD/settingDrawer.ts new file mode 100644 index 0000000..2bd1d04 --- /dev/null +++ b/src/locales/bn-BD/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'পৃষ্ঠা স্টাইল সেটিং', + 'app.setting.pagestyle.dark': 'ডার্ক স্টাইল', + 'app.setting.pagestyle.light': 'লাইট স্টাইল', + 'app.setting.content-width': 'সামগ্রীর প্রস্থ', + 'app.setting.content-width.fixed': 'স্থির', + 'app.setting.content-width.fluid': 'প্রবাহী', + 'app.setting.themecolor': 'থিম রঙ', + 'app.setting.themecolor.dust': 'ডাস্ট রেড', + 'app.setting.themecolor.volcano': 'আগ্নেয়গিরি', + 'app.setting.themecolor.sunset': 'সানসেট কমলা', + 'app.setting.themecolor.cyan': 'সবুজাভ নীল', + 'app.setting.themecolor.green': 'পোলার সবুজ', + 'app.setting.themecolor.daybreak': 'দিবস ব্রেক ব্লু (ডিফল্ট)', + 'app.setting.themecolor.geekblue': 'গিক আঠালো', + 'app.setting.themecolor.purple': 'গোল্ডেন বেগুনি', + 'app.setting.navigationmode': 'নেভিগেশন মোড', + 'app.setting.sidemenu': 'সাইড মেনু লেআউট', + 'app.setting.topmenu': 'টপ মেনু লেআউট', + 'app.setting.fixedheader': 'স্থির হেডার', + 'app.setting.fixedsidebar': 'স্থির সাইডবার', + 'app.setting.fixedsidebar.hint': 'সাইড মেনু বিন্যাসে কাজ করে', + 'app.setting.hideheader': 'স্ক্রোল করার সময় হেডার লুকানো', + 'app.setting.hideheader.hint': 'লুকানো হেডার সক্ষম থাকলে কাজ করে', + 'app.setting.othersettings': 'অন্যান্য সেটিংস্', + 'app.setting.weakmode': 'দুর্বল মোড', + 'app.setting.copy': 'সেটিং কপি করুন', + 'app.setting.copyinfo': 'সাফল্যের অনুলিপি করুন - প্রতিস্থাপন করুন: src/models/setting.js', + 'app.setting.production.hint': + 'কেবল বিকাশের পরিবেশে প্যানেল শো সেট করা হচ্ছে, দয়া করে ম্যানুয়ালি সংশোধন করুন', +}; diff --git a/src/locales/bn-BD/settings.ts b/src/locales/bn-BD/settings.ts new file mode 100644 index 0000000..93cf904 --- /dev/null +++ b/src/locales/bn-BD/settings.ts @@ -0,0 +1,59 @@ +export default { + 'app.settings.menuMap.basic': 'মৌলিক বৈশিষ্ট্যসহ', + 'app.settings.menuMap.security': 'নিরাপত্তা বিন্যাস', + 'app.settings.menuMap.binding': 'অ্যাকাউন্ট বাঁধাই', + 'app.settings.menuMap.notification': 'নতুন বার্তা বিজ্ঞপ্তি', + 'app.settings.basic.avatar': 'অবতার', + 'app.settings.basic.change-avatar': 'অবতার পরিবর্তন করুন', + 'app.settings.basic.email': 'ইমেইল', + 'app.settings.basic.email-message': 'আপনার ইমেইল ইনপুট করুন!', + 'app.settings.basic.nickname': 'ডাক নাম', + 'app.settings.basic.nickname-message': 'আপনার ডাকনামটি ইনপুট করুন!', + 'app.settings.basic.profile': 'ব্যক্তিগত প্রোফাইল', + 'app.settings.basic.profile-message': 'আপনার ব্যক্তিগত প্রোফাইল ইনপুট করুন!', + 'app.settings.basic.profile-placeholder': 'নিজের সাথে সংক্ষিপ্ত পরিচয়', + 'app.settings.basic.country': 'দেশ/অঞ্চল', + 'app.settings.basic.country-message': 'আপনার দেশ ইনপুট করুন!', + 'app.settings.basic.geographic': 'প্রদেশ বা শহর', + 'app.settings.basic.geographic-message': 'আপনার ভৌগলিক তথ্য ইনপুট করুন!', + 'app.settings.basic.address': 'রাস্তার ঠিকানা', + 'app.settings.basic.address-message': 'দয়া করে আপনার ঠিকানা ইনপুট করুন!', + 'app.settings.basic.phone': 'ফোন নম্বর', + 'app.settings.basic.phone-message': 'আপনার ফোন ইনপুট করুন!', + 'app.settings.basic.update': 'তথ্য হালনাগাদ', + 'app.settings.security.strong': 'শক্তিশালী', + 'app.settings.security.medium': 'মধ্যম', + 'app.settings.security.weak': 'দুর্বল', + 'app.settings.security.password': 'অ্যাকাউন্টের পাসওয়ার্ড', + 'app.settings.security.password-description': 'বর্তমান পাসওয়ার্ড শক্তি', + 'app.settings.security.phone': 'সুরক্ষা ফোন', + 'app.settings.security.phone-description': 'আবদ্ধ ফোন', + 'app.settings.security.question': 'নিরাপত্তা প্রশ্ন', + 'app.settings.security.question-description': + 'সুরক্ষা প্রশ্ন সেট করা নেই, এবং সুরক্ষা নীতি কার্যকরভাবে অ্যাকাউন্ট সুরক্ষা রক্ষা করতে পারে', + 'app.settings.security.email': 'ব্যাকআপ ইমেইল', + 'app.settings.security.email-description': 'বাউন্ড ইমেইল', + 'app.settings.security.mfa': 'MFA ডিভাইস', + 'app.settings.security.mfa-description': + "আনবাউন্ড এমএফএ ডিভাইস, বাঁধাইয়ের পরে, দু'বার নিশ্চিত করা যায়", + 'app.settings.security.modify': 'পরিবর্তন করুন', + 'app.settings.security.set': 'সেট', + 'app.settings.security.bind': 'বাঁধাই', + 'app.settings.binding.taobao': 'বাঁধাই তাওবাও', + 'app.settings.binding.taobao-description': 'বর্তমানে আনবাউন্ড তাওবাও অ্যাকাউন্ট', + 'app.settings.binding.alipay': 'বাইন্ডিং আলিপে', + 'app.settings.binding.alipay-description': 'বর্তমানে আনবাউন্ড আলিপে অ্যাকাউন্ট', + 'app.settings.binding.dingding': 'বাঁধাই ডিঙ্গটালক', + 'app.settings.binding.dingding-description': 'বর্তমানে আনবাউন্ড ডিঙ্গটাল অ্যাকাউন্ট', + 'app.settings.binding.bind': 'বাঁধাই', + 'app.settings.notification.password': 'অ্যাকাউন্টের পাসওয়ার্ড', + 'app.settings.notification.password-description': + 'অন্যান্য ব্যবহারকারীর বার্তাগুলি স্টেশন চিঠি আকারে জানানো হবে', + 'app.settings.notification.messages': 'সিস্টেম বার্তা', + 'app.settings.notification.messages-description': + 'সিস্টেম বার্তাগুলি স্টেশন চিঠির আকারে জানানো হবে', + 'app.settings.notification.todo': 'করণীয় বিজ্ঞপ্তি', + 'app.settings.notification.todo-description': 'করণীয় তালিকাটি স্টেশন থেকে চিঠি আকারে জানানো হবে', + 'app.settings.open': 'খোলা', + 'app.settings.close': 'বন্ধ', +}; diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts new file mode 100644 index 0000000..b84dade --- /dev/null +++ b/src/locales/en-US.ts @@ -0,0 +1,29 @@ +import component from './en-US/component'; +import globalHeader from './en-US/globalHeader'; +import menu from './en-US/menu'; +import pages from './en-US/pages'; +import pwa from './en-US/pwa'; +import settingDrawer from './en-US/settingDrawer'; +import settings from './en-US/settings'; +import * as deviceEn from "@/locales/en-US/device"; +import * as resourceEn from "@/locales/en-US/resource"; + +export default { + 'navBar.lang': 'Languages', + 'layout.user.link.help': 'Help', + 'layout.user.link.privacy': 'Privacy', + 'layout.user.link.terms': 'Terms', + 'app.copyright.produced': 'Produced by Ant Financial Experience Department', + 'app.preview.down.block': 'Download this page to your local project', + 'app.welcome.link.fetch-blocks': 'Get all block', + 'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...pages, + ...Object.assign({}, ...Object.values(deviceEn)), + ...Object.assign({}, ...Object.values(resourceEn)), +}; diff --git a/src/locales/en-US/component.ts b/src/locales/en-US/component.ts new file mode 100644 index 0000000..3ba7eed --- /dev/null +++ b/src/locales/en-US/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Expand', + 'component.tagSelect.collapse': 'Collapse', + 'component.tagSelect.all': 'All', +}; diff --git a/src/locales/en-US/device.ts b/src/locales/en-US/device.ts new file mode 100644 index 0000000..99300ff --- /dev/null +++ b/src/locales/en-US/device.ts @@ -0,0 +1,4 @@ +export const device: {[key: string]: string} = {'device.device.table.list.id': 'id', 'device.device.table.list.name': 'name', 'device.device.table.list.code': 'code', 'device.device.table.list.position': 'position', 'device.device.table.list.param': 'param', 'device.device.table.list.spec': 'spec', 'device.device.table.list.categoryFkId': 'category_fk_id', 'device.device.table.list.groupFkId': 'group_fk_id', 'device.device.table.list.isEnable': 'is_enable', 'device.device.table.list.remark': 'remark', 'device.device.table.list.createTime': 'create_time', 'device.device.table.list.updateTime': 'update_time', 'device.device.table.rule.required.name': 'name is required', 'device.device.table.rule.required.code': 'code is required'} +export const device_category: {[key: string]: string} = {'device.device_category.table.list.id': 'id', 'device.device_category.table.list.name': 'name', 'device.device_category.table.list.code': 'code', 'device.device_category.table.list.remark': 'remark', 'device.device_category.table.list.createTime': 'create_time', 'device.device_category.table.list.updateTime': 'update_time', 'device.device_category.table.rule.required.name': 'name is required', 'device.device_category.table.rule.required.code': 'code is required'} +export const device_group: {[key: string]: string} = {'device.device_group.table.list.id': 'id', 'device.device_group.table.list.name': 'name', 'device.device_group.table.list.code': 'code', 'device.device_group.table.list.address': 'address', 'device.device_group.table.list.telephone': 'telephone', 'device.device_group.table.list.lon': 'lon', 'device.device_group.table.list.lat': 'lat', 'device.device_group.table.list.managerName': 'manager_name', 'device.device_group.table.list.managerPhone': 'manager_phone', 'device.device_group.table.list.isEnable': 'is_enable', 'device.device_group.table.list.parentFkId': 'parent_fk_id', 'device.device_group.table.list.remark': 'remark', 'device.device_group.table.list.createTime': 'create_time', 'device.device_group.table.list.updateTime': 'update_time', 'device.device_group.table.rule.required.name': 'name is required', 'device.device_group.table.rule.required.code': 'code is required', 'device.device_group.table.rule.required.managerName': 'manager_name is required', 'device.device_group.table.rule.required.managerPhone': 'manager_phone is required', 'device.device_group.table.rule.required.parentFkId': 'parent_fk_id is required'} +export const device_relation: {[key: string]: string} = {'device.device_relation.table.list.id': 'id', 'device.device_relation.table.list.deviceParentFkId': 'device_parent_fk_id', 'device.device_relation.table.list.deviceSonFkId': 'device_son_fk_id', 'device.device_relation.table.list.createTime': 'create_time', 'device.device_relation.table.list.updateTime': 'update_time', 'device.device_relation.table.rule.required.deviceParentFkId': 'device_parent_fk_id is required', 'device.device_relation.table.rule.required.deviceSonFkId': 'device_son_fk_id is required'} diff --git a/src/locales/en-US/globalHeader.ts b/src/locales/en-US/globalHeader.ts new file mode 100644 index 0000000..60b6d4e --- /dev/null +++ b/src/locales/en-US/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'Search', + 'component.globalHeader.search.example1': 'Search example 1', + 'component.globalHeader.search.example2': 'Search example 2', + 'component.globalHeader.search.example3': 'Search example 3', + 'component.globalHeader.help': 'Help', + 'component.globalHeader.notification': 'Notification', + 'component.globalHeader.notification.empty': 'You have viewed all notifications.', + 'component.globalHeader.message': 'Message', + 'component.globalHeader.message.empty': 'You have viewed all messsages.', + 'component.globalHeader.event': 'Event', + 'component.globalHeader.event.empty': 'You have viewed all events.', + 'component.noticeIcon.clear': 'Clear', + 'component.noticeIcon.cleared': 'Cleared', + 'component.noticeIcon.empty': 'No notifications', + 'component.noticeIcon.view-more': 'View more', +}; diff --git a/src/locales/en-US/menu.ts b/src/locales/en-US/menu.ts new file mode 100644 index 0000000..eae3e53 --- /dev/null +++ b/src/locales/en-US/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Welcome', + 'menu.more-blocks': 'More Blocks', + 'menu.home': 'Home', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Page', + 'menu.login': 'Login', + 'menu.register': 'Register', + 'menu.register-result': 'Register Result', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': 'Analysis', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Workplace', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Form', + 'menu.form.basic-form': 'Basic Form', + 'menu.form.step-form': 'Step Form', + 'menu.form.step-form.info': 'Step Form(write transfer information)', + 'menu.form.step-form.confirm': 'Step Form(confirm transfer information)', + 'menu.form.step-form.result': 'Step Form(finished)', + 'menu.form.advanced-form': 'Advanced Form', + 'menu.list': 'List', + 'menu.list.table-list': 'Search Table', + 'menu.list.basic-list': 'Basic List', + 'menu.list.card-list': 'Card List', + 'menu.list.search-list': 'Search List', + 'menu.list.search-list.articles': 'Search List(articles)', + 'menu.list.search-list.projects': 'Search List(projects)', + 'menu.list.search-list.applications': 'Search List(applications)', + 'menu.profile': 'Profile', + 'menu.profile.basic': 'Basic Profile', + 'menu.profile.advanced': 'Advanced Profile', + 'menu.result': 'Result', + 'menu.result.success': 'Success', + 'menu.result.fail': 'Fail', + 'menu.exception': 'Exception', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Trigger', + 'menu.account': 'Account', + 'menu.account.center': 'Account Center', + 'menu.account.settings': 'Account Settings', + 'menu.account.trigger': 'Trigger Error', + 'menu.account.logout': 'Logout', + 'menu.editor': 'Graphic Editor', + 'menu.editor.flow': 'Flow Editor', + 'menu.editor.mind': 'Mind Editor', + 'menu.editor.koni': 'Koni Editor', +}; diff --git a/src/locales/en-US/pages.ts b/src/locales/en-US/pages.ts new file mode 100644 index 0000000..486f5e8 --- /dev/null +++ b/src/locales/en-US/pages.ts @@ -0,0 +1,68 @@ +export default { + 'pages.layouts.userLayout.title': + 'Ant Design is the most influential web design specification in Xihu district', + 'pages.login.accountLogin.tab': 'Account Login', + 'pages.login.accountLogin.errorMessage': 'Incorrect username/password(admin/ant.design)', + 'pages.login.failure': 'Login failed, please try again!', + 'pages.login.success': 'Login successful!', + 'pages.login.username.placeholder': 'Username: admin or user', + 'pages.login.username.required': 'Please input your username!', + 'pages.login.password.placeholder': 'Password: ant.design', + 'pages.login.password.required': 'Please input your password!', + 'pages.login.phoneLogin.tab': 'Phone Login', + 'pages.login.phoneLogin.errorMessage': 'Verification Code Error', + 'pages.login.phoneNumber.placeholder': 'Phone Number', + 'pages.login.phoneNumber.required': 'Please input your phone number!', + 'pages.login.phoneNumber.invalid': 'Phone number is invalid!', + 'pages.login.captcha.placeholder': 'Verification Code', + 'pages.login.captcha.required': 'Please input verification code!', + 'pages.login.phoneLogin.getVerificationCode': 'Get Code', + 'pages.getCaptchaSecondText': 'sec(s)', + 'pages.login.rememberMe': 'Remember me', + 'pages.login.forgotPassword': 'Forgot Password ?', + 'pages.login.submit': 'Login', + 'pages.login.loginWith': 'Login with :', + 'pages.login.registerAccount': 'Register Account', + 'pages.welcome.link': 'Welcome', + 'pages.welcome.alertMessage': 'Faster and stronger heavy-duty components have been released.', + 'pages.admin.subPage.title': 'This page can only be viewed by Admin', + 'pages.admin.subPage.alertMessage': + 'Umi ui is now released, welcome to use npm run ui to start the experience.', + 'pages.searchTable.createForm.newRule': 'New Rule', + 'pages.searchTable.updateForm.ruleConfig': 'Rule configuration', + 'pages.searchTable.updateForm.basicConfig': 'Basic Information', + 'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name', + 'pages.searchTable.updateForm.ruleName.nameRules': 'Please enter the rule name!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'Please enter at least five characters', + 'pages.searchTable.updateForm.ruleDesc.descRules': + 'Please enter a rule description of at least five characters!', + 'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties', + 'pages.searchTable.updateForm.object': 'Monitoring Object', + 'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template', + 'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type', + 'pages.searchTable.updateForm.schedulingPeriod.title': 'Set Scheduling Period', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Please choose a start time!', + 'pages.searchTable.titleDesc': 'Description', + 'pages.searchTable.ruleName': 'Rule name is required', + 'pages.searchTable.titleCallNo': 'Number of Service Calls', + 'pages.searchTable.titleStatus': 'Status', + 'pages.searchTable.nameStatus.default': 'default', + 'pages.searchTable.nameStatus.running': 'running', + 'pages.searchTable.nameStatus.online': 'online', + 'pages.searchTable.nameStatus.abnormal': 'abnormal', + 'pages.searchTable.titleUpdatedAt': 'Last Scheduled at', + 'pages.searchTable.exception': 'Please enter the reason for the exception!', + 'pages.searchTable.titleOption': 'Option', + 'pages.searchTable.config': 'Configuration', + 'pages.searchTable.subscribeAlert': 'Subscribe to alerts', + 'pages.searchTable.title': 'Enquiry Form', + 'pages.searchTable.new': 'New', + 'pages.searchTable.chosen': 'chosen', + 'pages.searchTable.item': 'item', + 'pages.searchTable.totalServiceCalls': 'Total Number of Service Calls', + 'pages.searchTable.tenThousand': '0000', + 'pages.searchTable.batchDeletion': 'batch deletion', + 'pages.searchTable.batchApproval': 'batch approval', +}; diff --git a/src/locales/en-US/pwa.ts b/src/locales/en-US/pwa.ts new file mode 100644 index 0000000..ed8d199 --- /dev/null +++ b/src/locales/en-US/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': 'You are offline now', + 'app.pwa.serviceworker.updated': 'New content is available', + 'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page', + 'app.pwa.serviceworker.updated.ok': 'Refresh', +}; diff --git a/src/locales/en-US/resource.ts b/src/locales/en-US/resource.ts new file mode 100644 index 0000000..da11e6c --- /dev/null +++ b/src/locales/en-US/resource.ts @@ -0,0 +1,3 @@ +export const algorithm_model: {[key: string]: string} = {'resource.algorithm_model.table.list.id': 'id', 'resource.algorithm_model.table.list.name': 'name', 'resource.algorithm_model.table.list.type': 'type', 'resource.algorithm_model.table.list.remark': 'remark', 'resource.algorithm_model.table.list.createTime': 'create_time', 'resource.algorithm_model.table.list.updateTime': 'update_time', 'resource.algorithm_model.table.rule.required.name': 'name is required'} +export const container_image: {[key: string]: string} = {'resource.container_image.table.list.id': 'id', 'resource.container_image.table.list.name': 'name', 'resource.container_image.table.list.version': 'version', 'resource.container_image.table.list.path': 'path', 'resource.container_image.table.list.startCode': 'start_code', 'resource.container_image.table.list.type': 'type', 'resource.container_image.table.list.remark': 'remark', 'resource.container_image.table.list.createTime': 'create_time', 'resource.container_image.table.list.updateTime': 'update_time', 'resource.container_image.table.rule.required.name': 'name is required', 'resource.container_image.table.rule.required.version': 'version is required'} +export const model_version: {[key: string]: string} = {'resource.model_version.table.list.id': 'id', 'resource.model_version.table.list.modelFkId': 'model_fk_id', 'resource.model_version.table.list.version': 'version', 'resource.model_version.table.list.path': 'path', 'resource.model_version.table.list.startCode': 'start_code', 'resource.model_version.table.list.isEnable': 'is_enable', 'resource.model_version.table.list.remark': 'remark', 'resource.model_version.table.list.createTime': 'create_time', 'resource.model_version.table.list.updateTime': 'update_time', 'resource.model_version.table.rule.required.modelFkId': 'model_fk_id is required', 'resource.model_version.table.rule.required.path': 'path is required'} diff --git a/src/locales/en-US/settingDrawer.ts b/src/locales/en-US/settingDrawer.ts new file mode 100644 index 0000000..a644905 --- /dev/null +++ b/src/locales/en-US/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'Page style setting', + 'app.setting.pagestyle.dark': 'Dark style', + 'app.setting.pagestyle.light': 'Light style', + 'app.setting.content-width': 'Content Width', + 'app.setting.content-width.fixed': 'Fixed', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.themecolor': 'Theme Color', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Navigation Mode', + 'app.setting.sidemenu': 'Side Menu Layout', + 'app.setting.topmenu': 'Top Menu Layout', + 'app.setting.fixedheader': 'Fixed Header', + 'app.setting.fixedsidebar': 'Fixed Sidebar', + 'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout', + 'app.setting.hideheader': 'Hidden Header when scrolling', + 'app.setting.hideheader.hint': 'Works when Hidden Header is enabled', + 'app.setting.othersettings': 'Other Settings', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copy Setting', + 'app.setting.copyinfo': 'copy success,please replace defaultSettings in src/models/setting.js', + 'app.setting.production.hint': + 'Setting panel shows in development environment only, please manually modify', +}; diff --git a/src/locales/en-US/settings.ts b/src/locales/en-US/settings.ts new file mode 100644 index 0000000..822dd00 --- /dev/null +++ b/src/locales/en-US/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Basic Settings', + 'app.settings.menuMap.security': 'Security Settings', + 'app.settings.menuMap.binding': 'Account Binding', + 'app.settings.menuMap.notification': 'New Message Notification', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Change avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Please input your email!', + 'app.settings.basic.nickname': 'Nickname', + 'app.settings.basic.nickname-message': 'Please input your Nickname!', + 'app.settings.basic.profile': 'Personal profile', + 'app.settings.basic.profile-message': 'Please input your personal profile!', + 'app.settings.basic.profile-placeholder': 'Brief introduction to yourself', + 'app.settings.basic.country': 'Country/Region', + 'app.settings.basic.country-message': 'Please input your country!', + 'app.settings.basic.geographic': 'Province or city', + 'app.settings.basic.geographic-message': 'Please input your geographic info!', + 'app.settings.basic.address': 'Street Address', + 'app.settings.basic.address-message': 'Please input your address!', + 'app.settings.basic.phone': 'Phone Number', + 'app.settings.basic.phone-message': 'Please input your phone!', + 'app.settings.basic.update': 'Update Information', + 'app.settings.security.strong': 'Strong', + 'app.settings.security.medium': 'Medium', + 'app.settings.security.weak': 'Weak', + 'app.settings.security.password': 'Account Password', + 'app.settings.security.password-description': 'Current password strength', + 'app.settings.security.phone': 'Security Phone', + 'app.settings.security.phone-description': 'Bound phone', + 'app.settings.security.question': 'Security Question', + 'app.settings.security.question-description': + 'The security question is not set, and the security policy can effectively protect the account security', + 'app.settings.security.email': 'Backup Email', + 'app.settings.security.email-description': 'Bound Email', + 'app.settings.security.mfa': 'MFA Device', + 'app.settings.security.mfa-description': + 'Unbound MFA device, after binding, can be confirmed twice', + 'app.settings.security.modify': 'Modify', + 'app.settings.security.set': 'Set', + 'app.settings.security.bind': 'Bind', + 'app.settings.binding.taobao': 'Binding Taobao', + 'app.settings.binding.taobao-description': 'Currently unbound Taobao account', + 'app.settings.binding.alipay': 'Binding Alipay', + 'app.settings.binding.alipay-description': 'Currently unbound Alipay account', + 'app.settings.binding.dingding': 'Binding DingTalk', + 'app.settings.binding.dingding-description': 'Currently unbound DingTalk account', + 'app.settings.binding.bind': 'Bind', + 'app.settings.notification.password': 'Account Password', + 'app.settings.notification.password-description': + 'Messages from other users will be notified in the form of a station letter', + 'app.settings.notification.messages': 'System Messages', + 'app.settings.notification.messages-description': + 'System messages will be notified in the form of a station letter', + 'app.settings.notification.todo': 'To-do Notification', + 'app.settings.notification.todo-description': + 'The to-do list will be notified in the form of a letter from the station', + 'app.settings.open': 'Open', + 'app.settings.close': 'Close', +}; diff --git a/src/locales/fa-IR.ts b/src/locales/fa-IR.ts new file mode 100644 index 0000000..c27343d --- /dev/null +++ b/src/locales/fa-IR.ts @@ -0,0 +1,24 @@ +import component from './fa-IR/component'; +import globalHeader from './fa-IR/globalHeader'; +import menu from './fa-IR/menu'; +import pages from './fa-IR/pages'; +import pwa from './fa-IR/pwa'; +import settingDrawer from './fa-IR/settingDrawer'; +import settings from './fa-IR/settings'; + +export default { + 'navBar.lang': 'زبان ها ', + 'layout.user.link.help': 'کمک', + 'layout.user.link.privacy': 'حریم خصوصی', + 'layout.user.link.terms': 'مقررات', + 'app.preview.down.block': 'این صفحه را در پروژه محلی خود بارگیری کنید', + 'app.welcome.link.fetch-blocks': 'دریافت تمام بلوک', + 'app.welcome.link.block-list': 'به سرعت صفحات استاندارد مبتنی بر توسعه "بلوک" را بسازید', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...pages, +}; diff --git a/src/locales/fa-IR/component.ts b/src/locales/fa-IR/component.ts new file mode 100644 index 0000000..91e7a05 --- /dev/null +++ b/src/locales/fa-IR/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'باز', + 'component.tagSelect.collapse': 'بسته ', + 'component.tagSelect.all': 'همه', +}; diff --git a/src/locales/fa-IR/globalHeader.ts b/src/locales/fa-IR/globalHeader.ts new file mode 100644 index 0000000..1a92fbb --- /dev/null +++ b/src/locales/fa-IR/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'جستجو ', + 'component.globalHeader.search.example1': 'مثال 1 را جستجو کنید', + 'component.globalHeader.search.example2': 'مثال 2 را جستجو کنید', + 'component.globalHeader.search.example3': 'مثال 3 را جستجو کنید', + 'component.globalHeader.help': 'کمک', + 'component.globalHeader.notification': 'اعلان', + 'component.globalHeader.notification.empty': 'شما همه اعلان ها را مشاهده کرده اید.', + 'component.globalHeader.message': 'پیام', + 'component.globalHeader.message.empty': 'شما همه پیام ها را مشاهده کرده اید.', + 'component.globalHeader.event': 'رویداد', + 'component.globalHeader.event.empty': 'شما همه رویدادها را مشاهده کرده اید.', + 'component.noticeIcon.clear': 'پاک کردن', + 'component.noticeIcon.cleared': 'پاک شد', + 'component.noticeIcon.empty': 'بدون اعلان', + 'component.noticeIcon.view-more': 'نمایش بیشتر', +}; diff --git a/src/locales/fa-IR/menu.ts b/src/locales/fa-IR/menu.ts new file mode 100644 index 0000000..c67e003 --- /dev/null +++ b/src/locales/fa-IR/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'خوش آمدید', + 'menu.more-blocks': 'بلوک های بیشتر', + 'menu.home': 'خانه', + 'menu.admin': 'مدیر', + 'menu.admin.sub-page': 'زیر صفحه', + 'menu.login': 'ورود', + 'menu.register': 'ثبت نام', + 'menu.register-result': 'ثبت نام نتیجه', + 'menu.dashboard': 'داشبورد', + 'menu.dashboard.analysis': 'تحلیل و بررسی', + 'menu.dashboard.monitor': 'نظارت', + 'menu.dashboard.workplace': 'محل کار', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'فرم', + 'menu.form.basic-form': 'فرم اساسی', + 'menu.form.step-form': 'فرم مرحله', + 'menu.form.step-form.info': 'فرم مرحله (نوشتن اطلاعات انتقال)', + 'menu.form.step-form.confirm': 'فرم مرحله (تأیید اطلاعات انتقال)', + 'menu.form.step-form.result': 'فرم مرحله (تمام شده)', + 'menu.form.advanced-form': 'فرم پیشرفته', + 'menu.list': 'لیست', + 'menu.list.table-list': 'جدول جستجو', + 'menu.list.basic-list': 'لیست اصلی', + 'menu.list.card-list': 'لیست کارت', + 'menu.list.search-list': 'لیست جستجو', + 'menu.list.search-list.articles': 'لیست جستجو (مقالات)', + 'menu.list.search-list.projects': 'لیست جستجو (پروژه ها)', + 'menu.list.search-list.applications': 'لیست جستجو (برنامه ها)', + 'menu.profile': 'مشخصات', + 'menu.profile.basic': 'مشخصات عمومی', + 'menu.profile.advanced': 'مشخصات پیشرفته', + 'menu.result': 'نتیجه', + 'menu.result.success': 'موفق', + 'menu.result.fail': 'ناموفق', + 'menu.exception': 'استثنا', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'راه اندازی', + 'menu.account': 'حساب', + 'menu.account.center': 'مرکز حساب', + 'menu.account.settings': 'تنظیمات حساب', + 'menu.account.trigger': 'خطای راه اندازی', + 'menu.account.logout': 'خروج', + 'menu.editor': 'ویرایشگر گرافیک', + 'menu.editor.flow': 'ویرایشگر جریان', + 'menu.editor.mind': 'ویرایشگر ذهن', + 'menu.editor.koni': 'ویرایشگر Koni', +}; diff --git a/src/locales/fa-IR/pages.ts b/src/locales/fa-IR/pages.ts new file mode 100644 index 0000000..8b949b6 --- /dev/null +++ b/src/locales/fa-IR/pages.ts @@ -0,0 +1,67 @@ +export default { + 'pages.layouts.userLayout.title': 'طراحی مورچه تأثیرگذارترین مشخصات طراحی وب در منطقه Xihu است', + 'pages.login.accountLogin.tab': 'ورود به حساب کاربری', + 'pages.login.accountLogin.errorMessage': 'نام کاربری / رمزعبور نادرست (مدیر / ant.design)', + 'pages.login.failure': 'ورود به سیستم با شکست مواجه شد، لطفا دوباره سعی کنید!', + 'pages.login.success': 'ورود موفق!', + 'pages.login.username.placeholder': 'نام کاربری: مدیر یا کاربر', + 'pages.login.username.required': 'لطفا نام کاربری خود را وارد کنید!', + 'pages.login.password.placeholder': 'رمز عبور: ant.design', + 'pages.login.password.required': 'لطفاً رمز ورود خود را وارد کنید!', + 'pages.login.phoneLogin.tab': 'ورود به سیستم تلفن', + 'pages.login.phoneLogin.errorMessage': 'خطای کد تأیید', + 'pages.login.phoneNumber.placeholder': 'شماره تلفن', + 'pages.login.phoneNumber.required': 'لطفاً شماره تلفن خود را وارد کنید!', + 'pages.login.phoneNumber.invalid': 'شماره تلفن نامعتبر است!', + 'pages.login.captcha.placeholder': 'کد تایید', + 'pages.login.captcha.required': 'لطفا کد تأیید را وارد کنید!', + 'pages.login.phoneLogin.getVerificationCode': 'دریافت کد', + 'pages.getCaptchaSecondText': 'ثانیه', + 'pages.login.rememberMe': 'مرا به خاطر بسپار', + 'pages.login.forgotPassword': 'رمز عبور را فراموش کرده اید ?', + 'pages.login.submit': 'ارسال', + 'pages.login.loginWith': 'وارد شوید با :', + 'pages.login.registerAccount': 'ثبت نام', + 'pages.welcome.link': 'خوش آمدید', + 'pages.welcome.alertMessage': 'اجزای سنگین تر سریعتر و قوی تر آزاد شده اند.', + 'pages.admin.subPage.title': 'این صفحه فقط توسط مدیر قابل مشاهده است', + 'pages.admin.subPage.alertMessage': + 'رابط کاربری Umi اکنون منتشر شده است ، برای شروع تجربه استفاده از npm run ui خوش آمدید.', + 'pages.searchTable.createForm.newRule': 'قانون جدید', + 'pages.searchTable.updateForm.ruleConfig': 'پیکربندی قانون', + 'pages.searchTable.updateForm.basicConfig': 'اطلاعات اولیه', + 'pages.searchTable.updateForm.ruleName.nameLabel': ' نام قانون', + 'pages.searchTable.updateForm.ruleName.nameRules': 'لطفاً نام قانون را وارد کنید!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': 'شرح قانون', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'لطفاً حداقل پنج حرف وارد کنید', + 'pages.searchTable.updateForm.ruleDesc.descRules': + 'لطفاً حداقل یک قانون حاوی پنج کاراکتر شرح دهید!', + 'pages.searchTable.updateForm.ruleProps.title': 'پیکربندی خصوصیات', + 'pages.searchTable.updateForm.object': 'نظارت بر شی', + 'pages.searchTable.updateForm.ruleProps.templateLabel': 'الگوی قانون', + 'pages.searchTable.updateForm.ruleProps.typeLabel': 'نوع قانون', + 'pages.searchTable.updateForm.schedulingPeriod.title': 'تنظیم دوره زمان بندی', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'زمان شروع', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'لطفاً زمان شروع را انتخاب کنید!', + 'pages.searchTable.titleDesc': 'شرح', + 'pages.searchTable.ruleName': 'نام قانون لازم است', + 'pages.searchTable.titleCallNo': 'تعداد تماس های خدماتی', + 'pages.searchTable.titleStatus': 'وضعیت', + 'pages.searchTable.nameStatus.default': 'پیش فرض', + 'pages.searchTable.nameStatus.running': 'در حال دویدن', + 'pages.searchTable.nameStatus.online': 'برخط', + 'pages.searchTable.nameStatus.abnormal': 'غیرطبیعی', + 'pages.searchTable.titleUpdatedAt': 'آخرین برنامه ریزی در', + 'pages.searchTable.exception': 'لطفا دلیل استثنا را وارد کنید!', + 'pages.searchTable.titleOption': 'گزینه', + 'pages.searchTable.config': 'پیکربندی', + 'pages.searchTable.subscribeAlert': 'مشترک شدن در هشدارها', + 'pages.searchTable.title': 'فرم درخواست', + 'pages.searchTable.new': 'جدید', + 'pages.searchTable.chosen': 'انتخاب شده', + 'pages.searchTable.item': 'مورد', + 'pages.searchTable.totalServiceCalls': 'تعداد کل تماس های خدماتی', + 'pages.searchTable.tenThousand': '0000', + 'pages.searchTable.batchDeletion': 'حذف دسته ای', + 'pages.searchTable.batchApproval': 'تصویب دسته ای', +}; diff --git a/src/locales/fa-IR/pwa.ts b/src/locales/fa-IR/pwa.ts new file mode 100644 index 0000000..54831b4 --- /dev/null +++ b/src/locales/fa-IR/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'شما اکنون آفلاین هستید', + 'app.pwa.serviceworker.updated': 'مطالب جدید در دسترس است', + 'app.pwa.serviceworker.updated.hint': + 'لطفاً برای بارگیری مجدد صفحه فعلی ، دکمه "تازه سازی" را فشار دهید', + 'app.pwa.serviceworker.updated.ok': 'تازه سازی', +}; diff --git a/src/locales/fa-IR/settingDrawer.ts b/src/locales/fa-IR/settingDrawer.ts new file mode 100644 index 0000000..cb223d5 --- /dev/null +++ b/src/locales/fa-IR/settingDrawer.ts @@ -0,0 +1,32 @@ +export default { + 'app.setting.pagestyle': 'تنظیم نوع صفحه', + 'app.setting.pagestyle.dark': 'سبک تیره', + 'app.setting.pagestyle.light': 'سبک سبک', + 'app.setting.content-width': 'عرض محتوا', + 'app.setting.content-width.fixed': 'ثابت', + 'app.setting.content-width.fluid': 'شناور', + 'app.setting.themecolor': 'رنگ تم', + 'app.setting.themecolor.dust': 'گرد و غبار قرمز', + 'app.setting.themecolor.volcano': 'آتشفشان', + 'app.setting.themecolor.sunset': 'غروب نارنجی', + 'app.setting.themecolor.cyan': 'فیروزه ای', + 'app.setting.themecolor.green': 'سبز قطبی', + 'app.setting.themecolor.daybreak': 'آبی روشن(پیشفرض)', + 'app.setting.themecolor.geekblue': 'چسب گیک', + 'app.setting.themecolor.purple': 'بنفش طلایی', + 'app.setting.navigationmode': 'حالت پیمایش', + 'app.setting.sidemenu': 'طرح منوی کناری', + 'app.setting.topmenu': 'طرح منوی بالایی', + 'app.setting.fixedheader': 'سرصفحه ثابت', + 'app.setting.fixedsidebar': 'نوار کناری ثابت', + 'app.setting.fixedsidebar.hint': 'کار بر روی منوی کناری', + 'app.setting.hideheader': 'هدر پنهان هنگام پیمایش', + 'app.setting.hideheader.hint': 'وقتی Hidden Header فعال باشد کار می کند', + 'app.setting.othersettings': 'تنظیمات دیگر', + 'app.setting.weakmode': 'حالت ضعیف', + 'app.setting.copy': 'تنظیمات کپی', + 'app.setting.copyinfo': + 'موفقیت در کپی کردن , لطفا defaultSettings را در src / models / setting.js جایگزین کنید', + 'app.setting.production.hint': + 'صفحه تنظیم فقط در محیط توسعه نمایش داده می شود ، لطفاً دستی تغییر دهید', +}; diff --git a/src/locales/fa-IR/settings.ts b/src/locales/fa-IR/settings.ts new file mode 100644 index 0000000..040bc31 --- /dev/null +++ b/src/locales/fa-IR/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'تنظیمات پایه ', + 'app.settings.menuMap.security': 'تنظیمات امنیتی', + 'app.settings.menuMap.binding': 'صحافی حساب', + 'app.settings.menuMap.notification': 'اعلان پیام جدید', + 'app.settings.basic.avatar': 'آواتار', + 'app.settings.basic.change-avatar': 'آواتار را تغییر دهید', + 'app.settings.basic.email': 'ایمیل', + 'app.settings.basic.email-message': 'لطفا ایمیل خود را وارد کنید!', + 'app.settings.basic.nickname': 'نام مستعار', + 'app.settings.basic.nickname-message': 'لطفاً نام مستعار خود را وارد کنید!', + 'app.settings.basic.profile': 'پروفایل شخصی', + 'app.settings.basic.profile-message': 'لطفاً مشخصات شخصی خود را وارد کنید!', + 'app.settings.basic.profile-placeholder': 'معرفی مختصر خودتان', + 'app.settings.basic.country': 'کشور / منطقه', + 'app.settings.basic.country-message': 'لطفاً کشور خود را وارد کنید!', + 'app.settings.basic.geographic': 'استان یا شهر', + 'app.settings.basic.geographic-message': 'لطفاً اطلاعات جغرافیایی خود را وارد کنید!', + 'app.settings.basic.address': 'آدرس خیابان', + 'app.settings.basic.address-message': 'لطفا آدرس خود را وارد کنید!', + 'app.settings.basic.phone': 'شماره تلفن', + 'app.settings.basic.phone-message': 'لطفاً تلفن خود را وارد کنید!', + 'app.settings.basic.update': 'به روز رسانی اطلاعات', + 'app.settings.security.strong': 'قوی', + 'app.settings.security.medium': 'متوسط', + 'app.settings.security.weak': 'ضعیف', + 'app.settings.security.password': 'رمز عبور حساب کاربری', + 'app.settings.security.password-description': 'قدرت رمز عبور فعلی', + 'app.settings.security.phone': 'تلفن امنیتی', + 'app.settings.security.phone-description': 'تلفن مقید', + 'app.settings.security.question': 'سوال امنیتی', + 'app.settings.security.question-description': + 'سوال امنیتی تنظیم نشده است و سیاست امنیتی می تواند به طور موثر از امنیت حساب محافظت کند', + 'app.settings.security.email': 'ایمیل پشتیبان', + 'app.settings.security.email-description': 'ایمیل مقید', + 'app.settings.security.mfa': 'دستگاه MFA', + 'app.settings.security.mfa-description': + 'دستگاه MFA بسته نشده ، پس از اتصال ، می تواند دو بار تأیید شود', + 'app.settings.security.modify': 'تغییر', + 'app.settings.security.set': 'تنظیم', + 'app.settings.security.bind': 'بستن', + 'app.settings.binding.taobao': 'اتصال Taobao', + 'app.settings.binding.taobao-description': 'حساب Taobao در حال حاضر بسته نشده است', + 'app.settings.binding.alipay': 'اتصال Alipay', + 'app.settings.binding.alipay-description': 'حساب Alipay در حال حاضر بسته نشده است', + 'app.settings.binding.dingding': 'اتصال DingTalk', + 'app.settings.binding.dingding-description': 'حساب DingTalk در حال حاضر محدود نشده است', + 'app.settings.binding.bind': 'بستن', + 'app.settings.notification.password': 'رمز عبور حساب کاربری', + 'app.settings.notification.password-description': + 'پیام های سایر کاربران در قالب یک نامه ایستگاهی اعلام خواهد شد', + 'app.settings.notification.messages': 'پیام های سیستم', + 'app.settings.notification.messages-description': + 'پیام های سیستم به صورت نامه ایستگاه مطلع می شوند', + 'app.settings.notification.todo': 'اعلان کارها', + 'app.settings.notification.todo-description': + 'لیست کارها به صورت نامه ای از ایستگاه اطلاع داده می شود', + 'app.settings.open': 'باز کن', + 'app.settings.close': 'بستن', +}; diff --git a/src/locales/id-ID.ts b/src/locales/id-ID.ts new file mode 100644 index 0000000..aecd2bd --- /dev/null +++ b/src/locales/id-ID.ts @@ -0,0 +1,25 @@ +import component from './id-ID/component'; +import globalHeader from './id-ID/globalHeader'; +import menu from './id-ID/menu'; +import pages from './id-ID/pages'; +import pwa from './id-ID/pwa'; +import settingDrawer from './id-ID/settingDrawer'; +import settings from './id-ID/settings'; + +export default { + 'navbar.lang': 'Bahasa', + 'layout.user.link.help': 'Bantuan', + 'layout.user.link.privacy': 'Privasi', + 'layout.user.link.terms': 'Ketentuan', + 'app.preview.down.block': 'Unduh halaman ini dalam projek lokal anda', + 'app.welcome.link.fetch-blocks': 'Dapatkan semua blok', + 'app.welcome.link.block-list': + 'Buat standar dengan cepat, halaman-halaman berdasarkan pengembangan `block`', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...pages, +}; diff --git a/src/locales/id-ID/component.ts b/src/locales/id-ID/component.ts new file mode 100644 index 0000000..fe583af --- /dev/null +++ b/src/locales/id-ID/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Perluas', + 'component.tagSelect.collapse': 'Lipat', + 'component.tagSelect.all': 'Semua', +}; diff --git a/src/locales/id-ID/globalHeader.ts b/src/locales/id-ID/globalHeader.ts new file mode 100644 index 0000000..e6283ea --- /dev/null +++ b/src/locales/id-ID/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'Pencarian', + 'component.globalHeader.search.example1': 'Contoh 1 Pencarian', + 'component.globalHeader.search.example2': 'Contoh 2 Pencarian', + 'component.globalHeader.search.example3': 'Contoh 3 Pencarian', + 'component.globalHeader.help': 'Bantuan', + 'component.globalHeader.notification': 'Notifikasi', + 'component.globalHeader.notification.empty': 'Anda telah membaca semua notifikasi', + 'component.globalHeader.message': 'Pesan', + 'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.', + 'component.globalHeader.event': 'Acara', + 'component.globalHeader.event.empty': 'Anda telah melihat semua acara.', + 'component.noticeIcon.clear': 'Kosongkan', + 'component.noticeIcon.cleared': 'Berhasil dikosongkan', + 'component.noticeIcon.empty': 'Tidak ada pemberitahuan', + 'component.noticeIcon.view-more': 'Melihat lebih', +}; diff --git a/src/locales/id-ID/menu.ts b/src/locales/id-ID/menu.ts new file mode 100644 index 0000000..254ff44 --- /dev/null +++ b/src/locales/id-ID/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Selamat Datang', + 'menu.more-blocks': 'Blocks Lainnya', + 'menu.home': 'Halaman Awal', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Halaman', + 'menu.login': 'Masuk', + 'menu.register': 'Pendaftaran', + 'menu.register-result': 'Hasil Pendaftaran', + 'menu.dashboard': 'Dasbor', + 'menu.dashboard.analysis': 'Analisis', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Workplace', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Form', + 'menu.form.basic-form': 'Form Dasar', + 'menu.form.step-form': 'Form Bertahap', + 'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)', + 'menu.form.step-form.confirm': 'Form Bertahap(konfirmasi informasi yang dibagikan)', + 'menu.form.step-form.result': 'Form Bertahap(selesai)', + 'menu.form.advanced-form': 'Form Lanjutan', + 'menu.list': 'Daftar', + 'menu.list.table-list': 'Tabel Pencarian', + 'menu.list.basic-list': 'Daftar Dasar', + 'menu.list.card-list': 'Daftar Kartu', + 'menu.list.search-list': 'Daftar Pencarian', + 'menu.list.search-list.articles': 'Daftar Pencarian(artikel)', + 'menu.list.search-list.projects': 'Daftar Pencarian(projek)', + 'menu.list.search-list.applications': 'Daftar Pencarian(aplikasi)', + 'menu.profile': 'Profil', + 'menu.profile.basic': 'Profil Dasar', + 'menu.profile.advanced': 'Profile Lanjutan', + 'menu.result': 'Hasil', + 'menu.result.success': 'Sukses', + 'menu.result.fail': 'Gagal', + 'menu.exception': 'Pengecualian', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Jalankan', + 'menu.account': 'Akun', + 'menu.account.center': 'Detail Akun', + 'menu.account.settings': 'Pengaturan Akun', + 'menu.account.trigger': 'Mengaktivasi Error', + 'menu.account.logout': 'Keluar', + 'menu.editor': 'Penyusun Grafis', + 'menu.editor.flow': 'Penyusun Alur', + 'menu.editor.mind': 'Penyusun Mind', + 'menu.editor.koni': 'Penyusun Koni', +}; diff --git a/src/locales/id-ID/pages.ts b/src/locales/id-ID/pages.ts new file mode 100644 index 0000000..50b7e20 --- /dev/null +++ b/src/locales/id-ID/pages.ts @@ -0,0 +1,70 @@ +export default { + 'pages.layouts.userLayout.title': + 'Ant Design adalah spesifikasi desain Web yang paling berpengaruh di Kabupaten Xihu', + 'pages.login.accountLogin.tab': 'Login dengan akun', + 'pages.login.accountLogin.errorMessage': 'Nama pengguna dan kata sandi salah(admin/ant.design)', + 'pages.login.failure': 'Log masuk gagal, silakan coba lagi!', + 'pages.login.success': 'Login berhasil!', + 'pages.login.username.placeholder': 'nama pengguna: admin atau user', + 'pages.login.username.required': 'Nama pengguna harus diisi!', + 'pages.login.password.placeholder': 'kata sandi: ant.design', + 'pages.login.password.required': 'Kata sandi harus diisi!', + 'pages.login.phoneLogin.tab': 'Login dengan ponsel', + 'pages.login.phoneLogin.errorMessage': 'Kesalahan kode verifikasi', + 'pages.login.phoneNumber.placeholder': 'masukkan nomor telepon', + 'pages.login.phoneNumber.required': 'Nomor ponsel harus diisi!', + 'pages.login.phoneNumber.invalid': 'Nomor ponsel tidak valid!', + 'pages.login.captcha.placeholder': 'kode verifikasi', + 'pages.login.captcha.required': 'Kode verifikasi diperlukan!', + 'pages.login.phoneLogin.getVerificationCode': 'Dapatkan kode', + 'pages.getCaptchaSecondText': 'detik tersisa', + 'pages.login.rememberMe': 'Ingat saya', + 'pages.login.forgotPassword': 'Lupa Kata Sandi?', + 'pages.login.submit': 'Masuk', + 'pages.login.loginWith': 'Masuk dengan :', + 'pages.login.registerAccount': 'Daftar Akun', + 'pages.welcome.link': 'Selamat datang', + 'pages.welcome.alertMessage': + 'Komponen heavy-duty yang lebih cepat dan lebih kuat telah dirilis.', + 'pages.admin.subPage.title': 'Halaman ini hanya dapat dilihat oleh admin', + 'pages.admin.subPage.alertMessage': + 'umi ui telah dirilis, silahkan gunakan npm run ui untuk memulai pengalaman.', + 'pages.searchTable.createForm.newRule': 'Aturan baru', + 'pages.searchTable.updateForm.ruleConfig': 'Konfigurasi aturan', + 'pages.searchTable.updateForm.basicConfig': 'Informasi dasar', + 'pages.searchTable.updateForm.ruleName.nameLabel': 'Nama aturan', + 'pages.searchTable.updateForm.ruleName.nameRules': 'Harap masukkan nama aturan!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': 'Deskripsi aturan', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': + 'Harap masukkan setidaknya lima karakter', + 'pages.searchTable.updateForm.ruleDesc.descRules': + 'Harap masukkan deskripsi aturan setidaknya lima karakter!', + 'pages.searchTable.updateForm.ruleProps.title': 'Properti aturan', + 'pages.searchTable.updateForm.object': 'Objek pemantauan', + 'pages.searchTable.updateForm.ruleProps.templateLabel': 'Template aturan', + 'pages.searchTable.updateForm.ruleProps.typeLabel': 'Jenis aturan', + 'pages.searchTable.updateForm.schedulingPeriod.title': 'Periode penjadwalan', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Waktu mulai', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Pilih waktu mulai!', + 'pages.searchTable.titleDesc': 'deskripsi', + 'pages.searchTable.ruleName': 'Nama aturan wajib diisi', + 'pages.searchTable.titleCallNo': 'Jumlah panggilan', + 'pages.searchTable.titleStatus': 'Status', + 'pages.searchTable.nameStatus.default': 'default', + 'pages.searchTable.nameStatus.running': 'menyala', + 'pages.searchTable.nameStatus.online': 'online', + 'pages.searchTable.nameStatus.abnormal': 'abnormal', + 'pages.searchTable.titleUpdatedAt': 'Waktu terjadwal', + 'pages.searchTable.exception': 'Harap masukkan alasan pengecualian!', + 'pages.searchTable.titleOption': 'Pengoperasian', + 'pages.searchTable.config': 'Konfigurasi', + 'pages.searchTable.subscribeAlert': 'Berlangganan notifikasi', + 'pages.searchTable.title': 'Formulir pertanyaan', + 'pages.searchTable.new': 'Baru', + 'pages.searchTable.chosen': 'Terpilih', + 'pages.searchTable.item': 'item', + 'pages.searchTable.totalServiceCalls': 'Jumlah total panggilan layanan', + 'pages.searchTable.tenThousand': '0000', + 'pages.searchTable.batchDeletion': 'Penghapusan batch', + 'pages.searchTable.batchApproval': 'Persetujuan batch', +}; diff --git a/src/locales/id-ID/pwa.ts b/src/locales/id-ID/pwa.ts new file mode 100644 index 0000000..b2cb8a1 --- /dev/null +++ b/src/locales/id-ID/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'Koneksi anda terputus', + 'app.pwa.serviceworker.updated': 'Konten baru sudah tersedia', + 'app.pwa.serviceworker.updated.hint': + 'Silahkan klik tombol "Refresh" untuk memuat ulang halaman ini', + 'app.pwa.serviceworker.updated.ok': 'Memuat ulang', +}; diff --git a/src/locales/id-ID/settingDrawer.ts b/src/locales/id-ID/settingDrawer.ts new file mode 100644 index 0000000..f2d3e40 --- /dev/null +++ b/src/locales/id-ID/settingDrawer.ts @@ -0,0 +1,32 @@ +export default { + 'app.setting.pagestyle': 'Pengaturan style Halaman', + 'app.setting.pagestyle.dark': 'Style Gelap', + 'app.setting.pagestyle.light': 'Style Cerah', + 'app.setting.content-width': 'Lebar Konten', + 'app.setting.content-width.fixed': 'Tetap', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.themecolor': 'Theme Color', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (bawaan)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Mode Navigasi', + 'app.setting.sidemenu': 'Susunan Menu Samping', + 'app.setting.topmenu': 'Susunan Menu Atas', + 'app.setting.fixedheader': 'Header Tetap', + 'app.setting.fixedsidebar': 'Sidebar Tetap', + 'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping', + 'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah', + 'app.setting.hideheader.hint': 'Bekerja ketika Header tersembunyi dimunculkan', + 'app.setting.othersettings': 'Pengaturan Lainnya', + 'app.setting.weakmode': 'Mode Lemah', + 'app.setting.copy': 'Salin Pengaturan', + 'app.setting.copyinfo': + 'Berhasil disalin,tolong ubah defaultSettings pada src/models/setting.js', + 'app.setting.production.hint': + 'Panel pengaturan hanya muncul pada lingkungan pengembangan, silahkan modifikasi secara menual', +}; diff --git a/src/locales/id-ID/settings.ts b/src/locales/id-ID/settings.ts new file mode 100644 index 0000000..04b7d12 --- /dev/null +++ b/src/locales/id-ID/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Pengaturan Dasar', + 'app.settings.menuMap.security': 'Pengaturan Keamanan', + 'app.settings.menuMap.binding': 'Pengikatan Akun', + 'app.settings.menuMap.notification': 'Notifikasi Pesan Baru', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Ubah avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Tolong masukkan email!', + 'app.settings.basic.nickname': 'Nickname', + 'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!', + 'app.settings.basic.profile': 'Profil Personal', + 'app.settings.basic.profile-message': 'Tolong masukkan profil personal!', + 'app.settings.basic.profile-placeholder': 'Perkenalan Singkat tentang Diri Anda', + 'app.settings.basic.country': 'Negara/Wilayah', + 'app.settings.basic.country-message': 'Tolong masukkan negara anda!', + 'app.settings.basic.geographic': 'Provinsi atau kota', + 'app.settings.basic.geographic-message': 'Tolong masukkan info geografis anda!', + 'app.settings.basic.address': 'Alamat Jalan', + 'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!', + 'app.settings.basic.phone': 'Nomor Ponsel', + 'app.settings.basic.phone-message': 'Tolong masukkan Nomor Ponsel anda!', + 'app.settings.basic.update': 'Perbarui Informasi', + 'app.settings.security.strong': 'Kuat', + 'app.settings.security.medium': 'Sedang', + 'app.settings.security.weak': 'Lemah', + 'app.settings.security.password': 'Kata Sandi Akun', + 'app.settings.security.password-description': 'Kekuatan Kata Sandi saat ini', + 'app.settings.security.phone': 'Keamanan Ponsel', + 'app.settings.security.phone-description': 'Mengikat Ponsel', + 'app.settings.security.question': 'Pertanyaan Keamanan', + 'app.settings.security.question-description': + 'Pertanyaan Keamanan belum diatur, dan kebijakan keamanan dapat melindungi akun secara efektif', + 'app.settings.security.email': 'Email Cadangan', + 'app.settings.security.email-description': 'Mengikat Email', + 'app.settings.security.mfa': 'Perangka MFA', + 'app.settings.security.mfa-description': + 'Tidak mengikat Perangkat MFA, setelah diikat, dapat dikonfirmasi dua kali', + 'app.settings.security.modify': 'Modifikasi', + 'app.settings.security.set': 'Setel', + 'app.settings.security.bind': 'Ikat', + 'app.settings.binding.taobao': 'Mengikat Taobao', + 'app.settings.binding.taobao-description': 'Tidak mengikat akun Taobao saat ini', + 'app.settings.binding.alipay': 'Mengikat Alipay', + 'app.settings.binding.alipay-description': 'Tidak mengikat akun Alipay saat ini', + 'app.settings.binding.dingding': 'Mengikat DingTalk', + 'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk', + 'app.settings.binding.bind': 'Ikat', + 'app.settings.notification.password': 'Kata Sandi Akun', + 'app.settings.notification.password-description': + 'Pesan dari pengguna lain akan diberitahu dalam bentuk surat', + 'app.settings.notification.messages': 'Pesan Sistem', + 'app.settings.notification.messages-description': + 'Pesan sistem akan diberitahu dalam bentuk surat', + 'app.settings.notification.todo': 'Notifikasi daftar To-do', + 'app.settings.notification.todo-description': + 'Daftar to-do akan diberitahukan dalam bentuk surat dari stasiun', + 'app.settings.open': 'Buka', + 'app.settings.close': 'Tutup', +}; diff --git a/src/locales/ja-JP.ts b/src/locales/ja-JP.ts new file mode 100644 index 0000000..1602887 --- /dev/null +++ b/src/locales/ja-JP.ts @@ -0,0 +1,24 @@ +import component from './ja-JP/component'; +import globalHeader from './ja-JP/globalHeader'; +import menu from './ja-JP/menu'; +import pages from './ja-JP/pages'; +import pwa from './ja-JP/pwa'; +import settingDrawer from './ja-JP/settingDrawer'; +import settings from './ja-JP/settings'; + +export default { + 'navBar.lang': '言語', + 'layout.user.link.help': 'ヘルプ', + 'layout.user.link.privacy': 'プライバシー', + 'layout.user.link.terms': '利用規約', + 'app.preview.down.block': 'このページをローカルプロジェクトにダウンロードしてください', + 'app.welcome.link.fetch-blocks': '', + 'app.welcome.link.block-list': '', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...pages, +}; diff --git a/src/locales/ja-JP/component.ts b/src/locales/ja-JP/component.ts new file mode 100644 index 0000000..40f238c --- /dev/null +++ b/src/locales/ja-JP/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': '展開', + 'component.tagSelect.collapse': '折りたたむ', + 'component.tagSelect.all': 'すべて', +}; diff --git a/src/locales/ja-JP/globalHeader.ts b/src/locales/ja-JP/globalHeader.ts new file mode 100644 index 0000000..1642938 --- /dev/null +++ b/src/locales/ja-JP/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': '検索', + 'component.globalHeader.search.example1': '検索例1', + 'component.globalHeader.search.example2': '検索例2', + 'component.globalHeader.search.example3': '検索例3', + 'component.globalHeader.help': 'ヘルプ', + 'component.globalHeader.notification': '通知', + 'component.globalHeader.notification.empty': 'すべての通知を表示しました。', + 'component.globalHeader.message': 'メッセージ', + 'component.globalHeader.message.empty': 'すべてのメッセージを表示しました。', + 'component.globalHeader.event': 'イベント', + 'component.globalHeader.event.empty': 'すべてのイベントを表示しました。', + 'component.noticeIcon.clear': 'クリア', + 'component.noticeIcon.cleared': 'クリア済み', + 'component.noticeIcon.empty': '通知なし', + 'component.noticeIcon.view-more': 'もっと見る', +}; diff --git a/src/locales/ja-JP/menu.ts b/src/locales/ja-JP/menu.ts new file mode 100644 index 0000000..af6ed0e --- /dev/null +++ b/src/locales/ja-JP/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'ようこそ', + 'menu.more-blocks': 'その他のブロック', + 'menu.home': 'ホーム', + 'menu.admin': '管理者', + 'menu.admin.sub-page': 'サブページ', + 'menu.login': 'ログイン', + 'menu.register': '登録', + 'menu.register-result': '登録結果', + 'menu.dashboard': 'ダッシュボード', + 'menu.dashboard.analysis': '分析', + 'menu.dashboard.monitor': 'モニター', + 'menu.dashboard.workplace': '職場', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'フォーム', + 'menu.form.basic-form': '基本フォーム', + 'menu.form.step-form': 'ステップフォーム', + 'menu.form.step-form.info': 'ステップフォーム(転送情報の書き込み)', + 'menu.form.step-form.confirm': 'ステップフォーム(転送情報の確認)', + 'menu.form.step-form.result': 'ステップフォーム(完成)', + 'menu.form.advanced-form': '高度なフォーム', + 'menu.list': 'リスト', + 'menu.list.table-list': '検索テーブル', + 'menu.list.basic-list': '基本リスト', + 'menu.list.card-list': 'カードリスト', + 'menu.list.search-list': '検索リスト', + 'menu.list.search-list.articles': '検索リスト(記事)', + 'menu.list.search-list.projects': '検索リスト(プロジェクト)', + 'menu.list.search-list.applications': '検索リスト(アプリ)', + 'menu.profile': 'プロフィール', + 'menu.profile.basic': '基本プロフィール', + 'menu.profile.advanced': '高度なプロフィール', + 'menu.result': '結果', + 'menu.result.success': '成功', + 'menu.result.fail': '失敗', + 'menu.exception': '例外', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'トリガー', + 'menu.account': 'アカウント', + 'menu.account.center': 'アカウントセンター', + 'menu.account.settings': 'アカウント設定', + 'menu.account.trigger': 'トリガーエラー', + 'menu.account.logout': 'ログアウト', + 'menu.editor': 'グラフィックエディタ', + 'menu.editor.flow': 'フローエディタ', + 'menu.editor.mind': 'マインドエディター', + 'menu.editor.koni': 'コニエディター', +}; diff --git a/src/locales/ja-JP/pages.ts b/src/locales/ja-JP/pages.ts new file mode 100644 index 0000000..11b4514 --- /dev/null +++ b/src/locales/ja-JP/pages.ts @@ -0,0 +1,67 @@ +export default { + 'pages.layouts.userLayout.title': 'Ant Designは、西湖区で最も影響力のあるWebデザイン仕様です。', + 'pages.login.accountLogin.tab': 'アカウントログイン', + 'pages.login.accountLogin.errorMessage': + 'ユーザー名/パスワードが正しくありません(admin/ant.design)', + 'pages.login.failure': 'ログインに失敗したら、もう一度試してください!', + 'pages.login.success': 'ログイン成功!', + 'pages.login.username.placeholder': 'ユーザー名:adminまたはuser', + 'pages.login.username.required': 'ユーザー名を入力してください!', + 'pages.login.password.placeholder': 'パスワード:ant.design', + 'pages.login.password.required': 'パスワードを入力してください!', + 'pages.login.phoneLogin.tab': '電話ログイン', + 'pages.login.phoneLogin.errorMessage': '検証コードエラー', + 'pages.login.phoneNumber.placeholder': '電話番号', + 'pages.login.phoneNumber.required': '電話番号を入力してください!', + 'pages.login.phoneNumber.invalid': '電話番号が無効です!', + 'pages.login.captcha.placeholder': '確認コード', + 'pages.login.captcha.required': '確認コードを入力してください!', + 'pages.login.phoneLogin.getVerificationCode': '確認コードを取得', + 'pages.getCaptchaSecondText': '秒', + 'pages.login.rememberMe': 'Remember me', + 'pages.login.forgotPassword': 'パスワードをお忘れですか?', + 'pages.login.submit': 'ログイン', + 'pages.login.loginWith': 'その他のログイン方法:', + 'pages.login.registerAccount': 'アカウント登録', + 'pages.welcome.link': 'ようこそ', + 'pages.welcome.alertMessage': 'より高速で強力な頑丈なコンポーネントがリリースされました。', + 'pages.admin.subPage.title': 'このページは管理者のみが表示できます', + 'pages.admin.subPage.alertMessage': + 'Umi uiがリリースされました。npm run uiを使用して体験してください。', + 'pages.searchTable.createForm.newRule': '新しいルール', + 'pages.searchTable.updateForm.ruleConfig': 'ルール構成', + 'pages.searchTable.updateForm.basicConfig': '基本情報', + 'pages.searchTable.updateForm.ruleName.nameLabel': 'ルール名', + 'pages.searchTable.updateForm.ruleName.nameRules': 'ルール名を入力してください!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': 'ルールの説明', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '5文字以上入力してください', + 'pages.searchTable.updateForm.ruleDesc.descRules': '5文字以上のルールの説明を入力してください!', + 'pages.searchTable.updateForm.ruleProps.title': 'プロパティの構成', + 'pages.searchTable.updateForm.object': '監視対象', + 'pages.searchTable.updateForm.ruleProps.templateLabel': 'ルールテンプレート', + 'pages.searchTable.updateForm.ruleProps.typeLabel': 'ルールタイプ', + 'pages.searchTable.updateForm.schedulingPeriod.title': 'スケジュール期間の設定', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': '開始時間を選択してください!', + 'pages.searchTable.titleDesc': '説明', + 'pages.searchTable.ruleName': 'ルール名が必要です', + 'pages.searchTable.titleCallNo': 'サービスコール数', + 'pages.searchTable.titleStatus': 'ステータス', + 'pages.searchTable.nameStatus.default': 'デフォルト', + 'pages.searchTable.nameStatus.running': '起動中', + 'pages.searchTable.nameStatus.online': 'オンライン', + 'pages.searchTable.nameStatus.abnormal': '異常', + 'pages.searchTable.titleUpdatedAt': '最終スケジュール', + 'pages.searchTable.exception': '例外の理由を入力してください!', + 'pages.searchTable.titleOption': 'オプション', + 'pages.searchTable.config': '構成', + 'pages.searchTable.subscribeAlert': 'アラートを購読する', + 'pages.searchTable.title': 'お問い合わせフォーム', + 'pages.searchTable.new': '新しい', + 'pages.searchTable.chosen': '選んだ項目', + 'pages.searchTable.item': '項目', + 'pages.searchTable.totalServiceCalls': 'サービスコールの総数', + 'pages.searchTable.tenThousand': '万', + 'pages.searchTable.batchDeletion': 'バッチ削除', + 'pages.searchTable.batchApproval': 'バッチ承認', +}; diff --git a/src/locales/ja-JP/pwa.ts b/src/locales/ja-JP/pwa.ts new file mode 100644 index 0000000..ace23ae --- /dev/null +++ b/src/locales/ja-JP/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'あなたは今オフラインです', + 'app.pwa.serviceworker.updated': '新しいコンテンツが利用可能です', + 'app.pwa.serviceworker.updated.hint': + '現在のページをリロードするには、「更新」ボタンを押してください', + 'app.pwa.serviceworker.updated.ok': 'リフレッシュ', +}; diff --git a/src/locales/ja-JP/settingDrawer.ts b/src/locales/ja-JP/settingDrawer.ts new file mode 100644 index 0000000..67a22df --- /dev/null +++ b/src/locales/ja-JP/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'ページスタイル設定', + 'app.setting.pagestyle.dark': 'ダークスタイル', + 'app.setting.pagestyle.light': 'ライトスタイル', + 'app.setting.content-width': 'コンテンツの幅', + 'app.setting.content-width.fixed': '固定', + 'app.setting.content-width.fluid': '流体', + 'app.setting.themecolor': 'テーマカラー', + 'app.setting.themecolor.dust': 'ダストレッド', + 'app.setting.themecolor.volcano': 'ボルケ-ノ', + 'app.setting.themecolor.sunset': 'サンセットオレンジ', + 'app.setting.themecolor.cyan': 'シアン', + 'app.setting.themecolor.green': 'ポーラーグリーン', + 'app.setting.themecolor.daybreak': '夜明けの青(デフォルト)', + 'app.setting.themecolor.geekblue': 'ギーク ブルー', + 'app.setting.themecolor.purple': 'ゴールデンパープル', + 'app.setting.navigationmode': 'ナビゲーションモード', + 'app.setting.sidemenu': 'サイドメニューのレイアウト', + 'app.setting.topmenu': 'トップメニューのレイアウト', + 'app.setting.fixedheader': '固定ヘッダー', + 'app.setting.fixedsidebar': '固定サイドバー', + 'app.setting.fixedsidebar.hint': 'サイドメニューのレイアウトで動作します', + 'app.setting.hideheader': 'スクロール時の非表示ヘッダー', + 'app.setting.hideheader.hint': '非表示ヘッダーが有効になっている場合に機能します', + 'app.setting.othersettings': 'その他の設定', + 'app.setting.weakmode': 'ウィークモード', + 'app.setting.copy': 'コピー設定', + 'app.setting.copyinfo': + 'コピーが成功しました。src/models/setting.jsのdefaultSettingsを置き換えてください', + 'app.setting.production.hint': '設定パネルは開発環境でのみ表示されます。手動で変更してください', +}; diff --git a/src/locales/ja-JP/settings.ts b/src/locales/ja-JP/settings.ts new file mode 100644 index 0000000..de52481 --- /dev/null +++ b/src/locales/ja-JP/settings.ts @@ -0,0 +1,59 @@ +export default { + 'app.settings.menuMap.basic': '基本設定', + 'app.settings.menuMap.security': 'セキュリティ設定', + 'app.settings.menuMap.binding': 'アカウントのバインド', + 'app.settings.menuMap.notification': '新しいメッセージの通知', + 'app.settings.basic.avatar': 'アバター', + 'app.settings.basic.change-avatar': 'アバターを変更する', + 'app.settings.basic.email': 'メール', + 'app.settings.basic.email-message': 'メールアドレスを入力してください!', + 'app.settings.basic.nickname': 'ニックネーム', + 'app.settings.basic.nickname-message': 'ニックネームを入力してください!', + 'app.settings.basic.profile': '個人プロフィール', + 'app.settings.basic.profile-message': '個人プロフィールを入力してください!', + 'app.settings.basic.profile-placeholder': '自己紹介', + 'app.settings.basic.country': '国/地域', + 'app.settings.basic.country-message': 'あなたの国を入力してください!', + 'app.settings.basic.geographic': '州または市', + 'app.settings.basic.geographic-message': '地理情報を入力してください!', + 'app.settings.basic.address': '住所', + 'app.settings.basic.address-message': '住所を入力してください!', + 'app.settings.basic.phone': '電話番号', + 'app.settings.basic.phone-message': '電話番号を入力してください!', + 'app.settings.basic.update': '更新情報', + 'app.settings.security.strong': '強い', + 'app.settings.security.medium': 'ミディアム', + 'app.settings.security.weak': '弱い', + 'app.settings.security.password': 'アカウントパスワード', + 'app.settings.security.password-description': '現在のパスワードの強度', + 'app.settings.security.phone': 'セキュリティ電話番号', + 'app.settings.security.phone-description': 'バインドされた電話番号', + 'app.settings.security.question': '秘密の質問', + 'app.settings.security.question-description': + 'セキュリティの質問が設定されてません。セキュリティポリシーはアカウントのセキュリティを効果的に保護できます', + 'app.settings.security.email': 'バックアップメール', + 'app.settings.security.email-description': 'バインドされたメール', + 'app.settings.security.mfa': '多要素認証デバイス', + 'app.settings.security.mfa-description': + 'バインドされていない多要素認証デバイスは、バインド後、2回確認できます', + 'app.settings.security.modify': '変更する', + 'app.settings.security.set': 'セットする', + 'app.settings.security.bind': 'バインド', + 'app.settings.binding.taobao': 'タオバオをバインドする', + 'app.settings.binding.taobao-description': '現在バインドされていないタオバオアカウント', + 'app.settings.binding.alipay': 'アリペイをバインドする', + 'app.settings.binding.alipay-description': '現在バインドされていないアリペイアカウント', + 'app.settings.binding.dingding': 'ディントークをバインドする', + 'app.settings.binding.dingding-description': '現在バインドされていないディントークアカウント', + 'app.settings.binding.bind': 'バインド', + 'app.settings.notification.password': 'アカウントパスワード', + 'app.settings.notification.password-description': + '他のユーザーからのメッセージは、ステーションレターの形式で通知されます', + 'app.settings.notification.messages': 'システムメッセージ', + 'app.settings.notification.messages-description': + 'システムメッセージは、ステーションレターの形式で通知されます', + 'app.settings.notification.todo': 'To Do(用事) 通知', + 'app.settings.notification.todo-description': 'To Doタスクは、内部レターの形式で通知されます', + 'app.settings.open': '開く', + 'app.settings.close': '閉じる', +}; diff --git a/src/locales/pt-BR.ts b/src/locales/pt-BR.ts new file mode 100644 index 0000000..d501a8a --- /dev/null +++ b/src/locales/pt-BR.ts @@ -0,0 +1,22 @@ +import component from './pt-BR/component'; +import globalHeader from './pt-BR/globalHeader'; +import menu from './pt-BR/menu'; +import pages from './pt-BR/pages'; +import pwa from './pt-BR/pwa'; +import settingDrawer from './pt-BR/settingDrawer'; +import settings from './pt-BR/settings'; + +export default { + 'navBar.lang': 'Idiomas', + 'layout.user.link.help': 'ajuda', + 'layout.user.link.privacy': 'política de privacidade', + 'layout.user.link.terms': 'termos de serviços', + 'app.preview.down.block': 'Download this page to your local project', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...pages, +}; diff --git a/src/locales/pt-BR/component.ts b/src/locales/pt-BR/component.ts new file mode 100644 index 0000000..7cf9999 --- /dev/null +++ b/src/locales/pt-BR/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Expandir', + 'component.tagSelect.collapse': 'Diminuir', + 'component.tagSelect.all': 'Todas', +}; diff --git a/src/locales/pt-BR/globalHeader.ts b/src/locales/pt-BR/globalHeader.ts new file mode 100644 index 0000000..d232ca7 --- /dev/null +++ b/src/locales/pt-BR/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'Busca', + 'component.globalHeader.search.example1': 'Exemplo de busca 1', + 'component.globalHeader.search.example2': 'Exemplo de busca 2', + 'component.globalHeader.search.example3': 'Exemplo de busca 3', + 'component.globalHeader.help': 'Ajuda', + 'component.globalHeader.notification': 'Notificação', + 'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.', + 'component.globalHeader.message': 'Mensagem', + 'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.', + 'component.globalHeader.event': 'Evento', + 'component.globalHeader.event.empty': 'Você visualizou todos os eventos.', + 'component.noticeIcon.clear': 'Limpar', + 'component.noticeIcon.cleared': 'Limpo', + 'component.noticeIcon.empty': 'Sem notificações', + 'component.noticeIcon.view-more': 'Veja mais', +}; diff --git a/src/locales/pt-BR/menu.ts b/src/locales/pt-BR/menu.ts new file mode 100644 index 0000000..aded8ff --- /dev/null +++ b/src/locales/pt-BR/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Welcome', + 'menu.more-blocks': 'More Blocks', + 'menu.home': 'Início', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Page', + 'menu.login': 'Login', + 'menu.register': 'Registro', + 'menu.register-result': 'Resultado de registro', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': 'Análise', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Ambiente de Trabalho', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Formulário', + 'menu.form.basic-form': 'Formulário Básico', + 'menu.form.step-form': 'Formulário Assistido', + 'menu.form.step-form.info': 'Formulário Assistido(gravar informações de transferência)', + 'menu.form.step-form.confirm': 'Formulário Assistido(confirmar informações de transferência)', + 'menu.form.step-form.result': 'Formulário Assistido(finalizado)', + 'menu.form.advanced-form': 'Formulário Avançado', + 'menu.list': 'Lista', + 'menu.list.table-list': 'Tabela de Busca', + 'menu.list.basic-list': 'Lista Básica', + 'menu.list.card-list': 'Lista de Card', + 'menu.list.search-list': 'Lista de Busca', + 'menu.list.search-list.articles': 'Lista de Busca(artigos)', + 'menu.list.search-list.projects': 'Lista de Busca(projetos)', + 'menu.list.search-list.applications': 'Lista de Busca(aplicações)', + 'menu.profile': 'Perfil', + 'menu.profile.basic': 'Perfil Básico', + 'menu.profile.advanced': 'Perfil Avançado', + 'menu.result': 'Resultado', + 'menu.result.success': 'Sucesso', + 'menu.result.fail': 'Falha', + 'menu.exception': 'Exceção', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Disparar', + 'menu.account': 'Conta', + 'menu.account.center': 'Central da Conta', + 'menu.account.settings': 'Configurar Conta', + 'menu.account.trigger': 'Disparar Erro', + 'menu.account.logout': 'Sair', + 'menu.editor': 'Graphic Editor', + 'menu.editor.flow': 'Flow Editor', + 'menu.editor.mind': 'Mind Editor', + 'menu.editor.koni': 'Koni Editor', +}; diff --git a/src/locales/pt-BR/pages.ts b/src/locales/pt-BR/pages.ts new file mode 100644 index 0000000..01522ff --- /dev/null +++ b/src/locales/pt-BR/pages.ts @@ -0,0 +1,70 @@ +export default { + 'pages.layouts.userLayout.title': + 'Ant Design é a especificação de web design mais influente no distrito de Xihu', + 'pages.login.accountLogin.tab': 'Login da conta', + 'pages.login.accountLogin.errorMessage': 'usuário/senha incorreto(admin/ant.design)', + 'pages.login.failure': 'Login falhou, por favor tente novamente!', + 'pages.login.success': 'Login efetuado com sucesso!', + 'pages.login.username.placeholder': 'Usuário: admin or user', + 'pages.login.username.required': 'Por favor insira seu usuário!', + 'pages.login.password.placeholder': 'Senha: ant.design', + 'pages.login.password.required': 'Por favor insira sua senha!', + 'pages.login.phoneLogin.tab': 'Login com Telefone', + 'pages.login.phoneLogin.errorMessage': 'Erro de Código de Verificação', + 'pages.login.phoneNumber.placeholder': 'Telefone', + 'pages.login.phoneNumber.required': 'Por favor entre com seu telefone!', + 'pages.login.phoneNumber.invalid': 'Telefone é inválido!', + 'pages.login.captcha.placeholder': 'Código de Verificação', + 'pages.login.captcha.required': 'Por favor entre com o código de verificação!', + 'pages.login.phoneLogin.getVerificationCode': 'Obter Código', + 'pages.getCaptchaSecondText': 'seg(s)', + 'pages.login.rememberMe': 'Lembre-me', + 'pages.login.forgotPassword': 'Perdeu a Senha ?', + 'pages.login.submit': 'Enviar', + 'pages.login.loginWith': 'Login com :', + 'pages.login.registerAccount': 'Registra Conta', + 'pages.welcome.link': 'Bem-vindo', + 'pages.welcome.alertMessage': 'Componentes pesados mais rápidos e mais fortes foram lançados.', + 'pages.admin.subPage.title': 'Esta página só pode ser vista pelo Admin', + 'pages.admin.subPage.alertMessage': + 'O Umi ui foi lançado, bem-vindo ao usar o npm run ui para iniciar a experiência.', + 'pages.searchTable.createForm.newRule': 'Neva Regra', + 'pages.searchTable.updateForm.ruleConfig': 'Configuração de Regra', + 'pages.searchTable.updateForm.basicConfig': 'Informação básica', + 'pages.searchTable.updateForm.ruleName.nameLabel': 'Nome da Regra', + 'pages.searchTable.updateForm.ruleName.nameRules': 'Por favor entre com o nome da regra!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': 'Descrição da Regra', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': + 'Por favor insira ao menos cinco caracteres', + 'pages.searchTable.updateForm.ruleDesc.descRules': + 'Insira uma descrição de regra de pelo menos cinco caracteres!', + 'pages.searchTable.updateForm.ruleProps.title': 'Configurar Propriedades', + 'pages.searchTable.updateForm.object': 'Objeto de Monitoramento', + 'pages.searchTable.updateForm.ruleProps.templateLabel': 'Modelo de Regra', + 'pages.searchTable.updateForm.ruleProps.typeLabel': 'Tipo de Regra', + 'pages.searchTable.updateForm.schedulingPeriod.title': 'Definir Período de Agendamento', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Hora de Início', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': + 'Por favor selecione um horáriod e início!', + 'pages.searchTable.titleDesc': 'Descrição', + 'pages.searchTable.ruleName': 'O nome da regra é obrigatório', + 'pages.searchTable.titleCallNo': 'Número de chamadas de serviço', + 'pages.searchTable.titleStatus': 'Status', + 'pages.searchTable.nameStatus.default': 'padrão', + 'pages.searchTable.nameStatus.running': 'executando', + 'pages.searchTable.nameStatus.online': 'online', + 'pages.searchTable.nameStatus.abnormal': 'anormal', + 'pages.searchTable.titleUpdatedAt': 'Última programação em', + 'pages.searchTable.exception': 'Por favor, indique o motivo da exceção!', + 'pages.searchTable.titleOption': 'Opção', + 'pages.searchTable.config': 'Configuração', + 'pages.searchTable.subscribeAlert': 'Inscreva-se para receber alertas', + 'pages.searchTable.title': 'Formulário de Consulta', + 'pages.searchTable.new': 'Novo', + 'pages.searchTable.chosen': 'selecionado', + 'pages.searchTable.item': 'item', + 'pages.searchTable.totalServiceCalls': 'Número total de chamadas de serviço', + 'pages.searchTable.tenThousand': '0000', + 'pages.searchTable.batchDeletion': 'deleção em lote', + 'pages.searchTable.batchApproval': 'aprovação em lote', +}; diff --git a/src/locales/pt-BR/pwa.ts b/src/locales/pt-BR/pwa.ts new file mode 100644 index 0000000..05cc797 --- /dev/null +++ b/src/locales/pt-BR/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'Você está offline agora', + 'app.pwa.serviceworker.updated': 'Novo conteúdo está disponível', + 'app.pwa.serviceworker.updated.hint': + 'Por favor, pressione o botão "Atualizar" para recarregar a página atual', + 'app.pwa.serviceworker.updated.ok': 'Atualizar', +}; diff --git a/src/locales/pt-BR/settingDrawer.ts b/src/locales/pt-BR/settingDrawer.ts new file mode 100644 index 0000000..8a10b57 --- /dev/null +++ b/src/locales/pt-BR/settingDrawer.ts @@ -0,0 +1,32 @@ +export default { + 'app.setting.pagestyle': 'Configuração de estilo da página', + 'app.setting.pagestyle.dark': 'Dark style', + 'app.setting.pagestyle.light': 'Light style', + 'app.setting.content-width': 'Largura do conteúdo', + 'app.setting.content-width.fixed': 'Fixo', + 'app.setting.content-width.fluid': 'Fluido', + 'app.setting.themecolor': 'Cor do Tema', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Modo de Navegação', + 'app.setting.sidemenu': 'Layout do Menu Lateral', + 'app.setting.topmenu': 'Layout do Menu Superior', + 'app.setting.fixedheader': 'Cabeçalho fixo', + 'app.setting.fixedsidebar': 'Barra lateral fixa', + 'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral', + 'app.setting.hideheader': 'Esconder o cabeçalho quando rolar', + 'app.setting.hideheader.hint': 'Funciona quando o esconder cabeçalho está abilitado', + 'app.setting.othersettings': 'Outras configurações', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copiar Configuração', + 'app.setting.copyinfo': + 'copiado com sucesso,por favor trocar o defaultSettings em src/models/setting.js', + 'app.setting.production.hint': + 'O painel de configuração apenas é exibido no ambiente de desenvolvimento, por favor modifique manualmente o', +}; diff --git a/src/locales/pt-BR/settings.ts b/src/locales/pt-BR/settings.ts new file mode 100644 index 0000000..aad2e38 --- /dev/null +++ b/src/locales/pt-BR/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Configurações Básicas', + 'app.settings.menuMap.security': 'Configurações de Segurança', + 'app.settings.menuMap.binding': 'Vinculação de Conta', + 'app.settings.menuMap.notification': 'Mensagens de Notificação', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Alterar avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Por favor insira seu email!', + 'app.settings.basic.nickname': 'Nome de usuário', + 'app.settings.basic.nickname-message': 'Por favor insira seu nome de usuário!', + 'app.settings.basic.profile': 'Perfil pessoal', + 'app.settings.basic.profile-message': 'Por favor insira seu perfil pessoal!', + 'app.settings.basic.profile-placeholder': 'Breve introdução sua', + 'app.settings.basic.country': 'País/Região', + 'app.settings.basic.country-message': 'Por favor insira país!', + 'app.settings.basic.geographic': 'Província, estado ou cidade', + 'app.settings.basic.geographic-message': 'Por favor insira suas informações geográficas!', + 'app.settings.basic.address': 'Endereço', + 'app.settings.basic.address-message': 'Por favor insira seu endereço!', + 'app.settings.basic.phone': 'Número de telefone', + 'app.settings.basic.phone-message': 'Por favor insira seu número de telefone!', + 'app.settings.basic.update': 'Atualizar Informações', + 'app.settings.security.strong': 'Forte', + 'app.settings.security.medium': 'Média', + 'app.settings.security.weak': 'Fraca', + 'app.settings.security.password': 'Senha da Conta', + 'app.settings.security.password-description': 'Força da senha', + 'app.settings.security.phone': 'Telefone de Seguraça', + 'app.settings.security.phone-description': 'Telefone vinculado', + 'app.settings.security.question': 'Pergunta de Segurança', + 'app.settings.security.question-description': + 'A pergunta de segurança não está definida e a política de segurança pode proteger efetivamente a segurança da conta', + 'app.settings.security.email': 'Email de Backup', + 'app.settings.security.email-description': 'Email vinculado', + 'app.settings.security.mfa': 'Dispositivo MFA', + 'app.settings.security.mfa-description': + 'O dispositivo MFA não vinculado, após a vinculação, pode ser confirmado duas vezes', + 'app.settings.security.modify': 'Modificar', + 'app.settings.security.set': 'Atribuir', + 'app.settings.security.bind': 'Vincular', + 'app.settings.binding.taobao': 'Vincular Taobao', + 'app.settings.binding.taobao-description': 'Atualmente não vinculado à conta Taobao', + 'app.settings.binding.alipay': 'Vincular Alipay', + 'app.settings.binding.alipay-description': 'Atualmente não vinculado à conta Alipay', + 'app.settings.binding.dingding': 'Vincular DingTalk', + 'app.settings.binding.dingding-description': 'Atualmente não vinculado à conta DingTalk', + 'app.settings.binding.bind': 'Vincular', + 'app.settings.notification.password': 'Senha da Conta', + 'app.settings.notification.password-description': + 'Mensagens de outros usuários serão notificadas na forma de uma estação de letra', + 'app.settings.notification.messages': 'Mensagens de Sistema', + 'app.settings.notification.messages-description': + 'Mensagens de sistema serão notificadas na forma de uma estação de letra', + 'app.settings.notification.todo': 'Notificação de To-do', + 'app.settings.notification.todo-description': + 'A lista de to-do será notificada na forma de uma estação de letra', + 'app.settings.open': 'Aberto', + 'app.settings.close': 'Fechado', +}; diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts new file mode 100644 index 0000000..322c136 --- /dev/null +++ b/src/locales/zh-CN.ts @@ -0,0 +1,41 @@ +import component from './zh-CN/component'; +import globalHeader from './zh-CN/globalHeader'; +import menu from './zh-CN/menu'; +import pages from './zh-CN/pages'; +import pwa from './zh-CN/pwa'; +import settingDrawer from './zh-CN/settingDrawer'; +import settings from './zh-CN/settings'; +import common from './zh-CN/common'; +import app from './zh-CN/app'; +import {interface_api, dynamic_menu, api, role, user, post, department, operation_record} from "@/locales/zh-CN/system"; +import * as analysisZh from "@/locales/zh-CN/analysis"; +import * as errorTypesZh from "@/locales/zh-CN/errorTypes"; +import * as deviceZh from "@/locales/zh-CN/device"; +import * as resourceZh from "@/locales/zh-CN/resource"; +import * as projectZh from "@/locales/zh-CN/project"; +export default { + 'navBar.lang': '语言', + 'layout.user.link.help': '帮助', + 'layout.user.link.privacy': '隐私', + 'layout.user.link.terms': '条款', + 'app.copyright.produced': 'fabric', + 'app.preview.down.block': '下载此页面到本地项目', + 'app.welcome.link.fetch-blocks': '获取全部区块', + 'app.welcome.link.block-list': '基于 block 开发,快速构建标准页面', + ...pages, + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...common, + ...component, + ...interface_api, ...dynamic_menu, ...api, ...role, ...user, ...post, ...department, ...operation_record, + ...app, + + ...Object.assign({}, ...Object.values(analysisZh)), + ...Object.assign({}, ...Object.values(errorTypesZh)), + ...Object.assign({}, ...Object.values(deviceZh)), + ...Object.assign({}, ...Object.values(resourceZh)), + ...Object.assign({}, ...Object.values(projectZh)), +}; diff --git a/src/locales/zh-CN/analysis.ts b/src/locales/zh-CN/analysis.ts new file mode 100644 index 0000000..9126934 --- /dev/null +++ b/src/locales/zh-CN/analysis.ts @@ -0,0 +1,19 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-22 10:02:59 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-05 14:30:17 + * @FilePath: \react-adpro-fabric\src\locales\zh-CN\analysis.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +export const action_detection: { [key: string]: string } = { + 'analysis.action_detection.table.list.position': '地点', + 'analysis.action_detection.table.list.imagesPath': '截图', + 'analysis.action_detection.table.list.id': 'ID', + 'analysis.action_detection.table.list.source': '视频来源', + 'analysis.action_detection.table.list.configFile': '配置文件路径', + 'analysis.action_detection.table.list.type': '类型', + 'analysis.action_detection.table.list.remark': '备注', + 'analysis.action_detection.table.list.createTime': '创建时间', + 'analysis.action_detection.table.list.updateTime': '更新时间', +}; diff --git a/src/locales/zh-CN/app.ts b/src/locales/zh-CN/app.ts new file mode 100644 index 0000000..5be68e2 --- /dev/null +++ b/src/locales/zh-CN/app.ts @@ -0,0 +1,23 @@ +export default { + 'app.docs.components.icon.search.placeholder': '在此搜索图标,点击图标可复制代码', + 'app.docs.components.icon.outlined': '线框风格', + 'app.docs.components.icon.filled': '实底风格', + 'app.docs.components.icon.two-tone': '双色风格', + 'app.docs.components.icon.category.direction': '方向性图标', + 'app.docs.components.icon.category.suggestion': '提示建议性图标', + 'app.docs.components.icon.category.editor': '编辑类图标', + 'app.docs.components.icon.category.data': '数据类图标', + 'app.docs.components.icon.category.other': '网站通用图标', + 'app.docs.components.icon.category.logo': '品牌和标识', + 'app.docs.components.icon.pic-searcher.intro': 'AI 截图搜索上线了,快来体验吧!🎉', + 'app.docs.components.icon.pic-searcher.title': '上传图片搜索图标', + 'app.docs.components.icon.pic-searcher.upload-text': '点击/拖拽/粘贴上传图片', + 'app.docs.components.icon.pic-searcher.upload-hint': + '我们会通过上传的图片进行匹配,得到最相似的图标', + 'app.docs.components.icon.pic-searcher.server-error': '识别服务暂不可用', + 'app.docs.components.icon.pic-searcher.matching': '匹配中...', + 'app.docs.components.icon.pic-searcher.modelloading': '神经网络模型加载中...', + 'app.docs.components.icon.pic-searcher.result-tip': '为您匹配到以下图标:', + 'app.docs.components.icon.pic-searcher.th-icon': '图标', + 'app.docs.components.icon.pic-searcher.th-score': '匹配度', +}; diff --git a/src/locales/zh-CN/common.ts b/src/locales/zh-CN/common.ts new file mode 100644 index 0000000..ef8ae6c --- /dev/null +++ b/src/locales/zh-CN/common.ts @@ -0,0 +1,275 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-01 13:56:33 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-05 14:53:28 + * @FilePath: \general-ai-platform-web\src\locales\zh-CN\common.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +export default { + 'common.modal.table.update.title': '更新表单', + 'common.modal.table.create.title': '新增表单', + 'common.modal.table.delete.title': '确定要删除吗?', + 'common.modal.table.delete.content': '确定删除吗,删除后将无法找回,请谨慎操作', + 'common.enable': '开启', + 'common.disable': '禁用', + 'common.yes': '是', + 'common.no': '否', + 'common.success': '成功', + 'common.error': '错误', + 'common.failure': '失败', + 'common.permission.no_permission': '无权', + 'common.permission.query': '查询', + 'common.permission.update': '更改', + 'common.permission.all': '所有权限', + 'common.click_download': '点击下载', + 'common.auto': '自动', + 'common.edit': '编辑', + 'common.has_required_no_input': '有必填项没有填', + 'common.more_than': '需要大于', + 'common.less_than': '需要小于', + 'common.required': '必须项', + 'common.please_input': '请输入', + 'common.please_select': '请选择', + 'common.open': '开启', + 'common.close': '关闭', + 'common.show': '展示', + 'common.hide': '隐藏', + 'common.open_video': '打开视频', + 'common.create_son': '新增子节点', + 'common.publish': '发布', + 'common.confirm_publish': '确认发布', + 'common.set_default': '设为默认版本', + 'common.bind_device': '绑定设备', + 'common.tip.title': '温馨提示', + 'common.video_opening': '视频打开中', + 'common.open_failure': '打开失败', + 'common.start_process': '开始运行', + 'common.finish_process': '关闭运行', + fabric: { + imagemap: { + imagemap: 'Image Map', + 'imagemap-editing-confirm': + 'The image map contents have been modified. Do you want to do that anyway?', + 'imagemap-editor': 'Image Map Editor', + marker: { + 'choose-icon': 'Choose icon from Fontawesome', + 'search-icon': 'Search {{length}} icons for...', + }, + link: { + 'link-enabled': 'Link Enabled', + }, + tooltip: { + 'tooltip-enabled': 'Tooltip Enabled', + }, + style: { + 'fill-color': 'Fill Color', + 'stroke-color': 'Stroke Color', + 'stroke-width': 'Stroke Width', + rx: 'Radius x', + ry: 'Radius y', + }, + shadow: { + 'shadow-enabled': 'Shadow Enabled', + 'offset-x': 'Offset X', + 'offset-y': 'Offset Y', + }, + animation: { + 'animation-type': 'Animation Type', + none: 'None', + fade: 'Fade', + bounce: 'Bounce', + shake: 'Shake', + scaling: 'Scaling', + rotation: 'Rotation', + flash: 'Flash', + 'auto-play': 'Auto Play', + playback: 'Playback', + 'bounce-type': 'Bounce Type', + 'shake-type': 'Shake Type', + }, + trigger: { + 'trigger-enabled': 'Trigger Enabled', + }, + image: { + 'image-load-type': 'Image Load Type', + 'file-upload': 'File Upload', + 'image-url': 'Image URL', + }, + svg: { + 'add-svg': 'Add SVG', + }, + filter: { + grayscale: 'Grayscale', + invert: 'Invert', + sepia: 'Sepia', + brownie: 'Brownie', + vintage: 'Vintage', + blackwhite: 'Black/White', + technicolor: 'Technicolor', + polaroid: 'Polaroid', + gamma: 'Gamma', + 'gamma-color': 'Gamma Color', + brightness: 'Brightness', + contrast: 'Contrast', + saturation: 'Saturation', + sharpen: 'Sharpen', + emboss: 'Emboss', + hue: 'Hue', + noise: 'Noise', + pixelate: 'Pixelate', + blur: 'Blur', + }, + element: { + 'mouse-hover-enabled': 'Hover enabled', + }, + }, + workflow: { + workflow: 'Workflow', + 'workflow-list': 'Workflow List', + 'workflow-editor': 'Workflow Editor', + 'workflow-info': 'Workflow Info', + 'workflow-editing-confirm': + 'Workflow content has been modified. Do you want to do that anyway?', + 'node-configuration': 'Node Configuration', + variables: 'Global Parameters', + 'variables-add': 'Add Global Parameters', + 'variables-modify': 'Modify Global Parameters', + 'virtual-button-execute-failed': '{{name}} execute failed', + 'virtual-button-execute-success': '{{name}} execute success', + 'validate-fields-error': 'A node with the wrong setting exists.', + 'node-name-required': 'Please input node name', + 'node-description-required': 'Please input node description', + }, + flow: { + flow: '流程图', + list: '流程列表', + editor: '流程编辑器', + info: '流程信息', + }, + hexgrid: { + hexgrid: 'HexGrid', + }, + action: { + selection: 'Selection mode(Q)', + grab: 'Grab mode(W or Alt + Drag)', + 'zoom-in': 'Zoom in', + 'zoom-out': 'Zoom out', + 'one-to-one': '1:1', + fit: 'Scale to fit', + preview: 'Preview', + 'canvas-list': 'Canvas list', + 'bring-forward': 'Bring forward', + 'send-backwards': 'Send backwards', + 'bring-to-front': 'Bring to front', + 'send-to-back': 'Send to back', + 'align-left': 'Align left', + 'align-center': 'Align center', + 'align-right': 'Align right', + 'object-group': 'Group', + 'object-ungroup': 'Ungroup', + crop: 'Crop image', + 'crop-save': 'Save crop image', + 'crop-cancel': 'Cancel crop image', + 'image-save': 'Save Image', + clone: 'Clone', + delete: 'Delete', + save: 'Save', + back: 'Back', + upload: 'Upload', + download: 'Download', + ok: 'Ok', + cancel: 'Cancel', + 'search-list': 'Search list', + add: 'Add', + modify: 'Modify', + 'all-delete': 'All delete', + clear: 'Clear', + start: 'Start', + pause: 'Pause', + stop: 'Stop', + execute: 'Execute', + 'go-github': 'Go Github!!', + 'go-docs': 'Go Documents!!', + }, + common: { + name: 'Name', + description: 'Description', + width: 'Width', + height: 'Height', + icon: 'Icon', + locked: 'Lock', + visible: 'Visible', + left: 'Left', + top: 'Top', + key: 'Key', + type: 'Type', + value: 'Value', + title: 'Title', + file: 'File', + image: 'Image', + enabled: 'Enabled', + angle: 'Angle', + state: 'State', + url: 'URL', + current: 'Current', + new: 'New', + color: 'Color', + blur: 'Blur', + loop: 'Loop', + delay: 'Delay', + duration: 'Duration', + offset: 'Offset', + horizontal: 'Horizontal', + vertical: 'Vertical', + opacity: 'Opacity', + code: 'Code', + layout: 'Layout', + fixed: 'Fixed', + responsive: 'Responsive', + fullscreen: 'Fullscreen', + src: 'Src', + svg: 'SVG', + }, + color: { + red: 'Red', + green: 'Green', + blue: 'Blue', + }, + validation: { + 'enter-property': '请输入', + 'already-property': '已存在', + }, + shortcut: { + q: 'Selection', + w: 'Grab', + plus: 'Zoom In', + minus: 'Zoom Out', + h: 'Shortcut Help', + escape: 'Deselect', + 'arrow-up': 'Move Up', + 'arrow-down': 'Move Down', + 'arrow-left': 'Move Left', + 'arrow-right': 'Move Right', + delete: 'Delete', + 'ctrl-a': 'Select All', + 'ctrl-c': 'Copy', + 'ctrl-v': 'Paste', + 'ctrl-x': 'Cut', + 'ctrl-z': 'Undo', + 'ctrl-y': 'Redo', + 'alt-mouse-left': 'Grab', + 'shfit-mouse-left': 'Multi Selection', + 'mouse-left': 'Select', + 'mouse-right': 'Context Memu', + o: 'Zoom 1:1', + p: 'Zoom Fit', + }, + placeholder: { + 'search-node': 'Search a node', + }, + fiber: { + fiber: 'FiberCable', + }, + }, +}; diff --git a/src/locales/zh-CN/component.ts b/src/locales/zh-CN/component.ts new file mode 100644 index 0000000..1f1fead --- /dev/null +++ b/src/locales/zh-CN/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': '展开', + 'component.tagSelect.collapse': '收起', + 'component.tagSelect.all': '全部', +}; diff --git a/src/locales/zh-CN/device.ts b/src/locales/zh-CN/device.ts new file mode 100644 index 0000000..7fff0ab --- /dev/null +++ b/src/locales/zh-CN/device.ts @@ -0,0 +1,71 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-01 13:56:33 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-21 14:23:38 + * @FilePath: \general-ai-platform-web\src\locales\zh-CN\device.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +export const device: { [key: string]: string } = { + 'device.device.table.list.id': 'ID', + 'device.device.table.list.name': '设备名称', + 'device.device.table.list.code': '设备代码', + 'device.device.table.list.position': '位置', + 'device.device.table.list.param': '设备参数', + 'device.device.table.list.spec': '设备规格', + 'device.device.table.list.categoryFkId': '设备类别', + 'device.device.table.list.groupFkId': '设备分组', + 'device.device.table.list.isEnable': '是否启用', + 'device.device.table.list.remark': '备注', + 'device.device.table.list.createTime': '创建时间', + 'device.device.table.list.updateTime': '更新时间', + 'device.device.table.rule.required.name': '设备名称为必填项', + 'device.device.table.rule.required.code': '设备代码为必填项', + 'device.device.table.list.add': '新建设备', + 'device.device.table.list.update': '更新设备', +}; +export const device_category: { [key: string]: string } = { + 'device.device_category.table.list.id': 'ID', + 'device.device_category.table.list.name': '类别名称', + 'device.device_category.table.list.code': '类别代码', + 'device.device_category.table.list.remark': '备注', + 'device.device_category.table.list.createTime': '创建时间', + 'device.device_category.table.list.updateTime': '更新时间', + 'device.device_category.table.rule.required.name': '类别名称为必填项', + 'device.device_category.table.rule.required.code': '类别代码为必填项', + 'device.device_category.table.list.add': '新建设备类别', + 'device.device_category.table.list.update': '更新设备类别', +}; +export const device_group: { [key: string]: string } = { + 'device.device_group.table.list.id': 'ID', + 'device.device_group.table.list.name': '分组名称', + 'device.device_group.table.list.code': '分组代码', + 'device.device_group.table.list.address': '地址', + 'device.device_group.table.list.telephone': '电话', + 'device.device_group.table.list.lon': '经度', + 'device.device_group.table.list.lat': '纬度', + 'device.device_group.table.list.managerName': '负责人姓名', + 'device.device_group.table.list.managerPhone': '负责人联系方式', + 'device.device_group.table.list.isEnable': '是否启用', + 'device.device_group.table.list.parentFkId': '父节点', + 'device.device_group.table.list.remark': '备注', + 'device.device_group.table.list.createTime': '创建时间', + 'device.device_group.table.list.updateTime': '更新时间', + 'device.device_group.table.rule.required.name': '分组名称为必填项', + 'device.device_group.table.rule.required.code': '分组代码为必填项', + 'device.device_group.table.rule.required.managerName': '负责人姓名为必填项', + 'device.device_group.table.rule.required.managerPhone': '负责人联系方式为必填项', + 'device.device_group.table.rule.required.parentFkId': '父节点为必填项', + 'device.device_group.table.list.add': '新建设备分组', + 'device.device_group.table.list.update': '更新设备分组', + 'device.device_group.table.list.treeAdd': '添加根节点', +}; +export const device_relation: { [key: string]: string } = { + 'device.device_relation.table.list.id': 'ID', + 'device.device_relation.table.list.deviceParentFkId': '设备父节点', + 'device.device_relation.table.list.deviceSonFkId': '设备父节点', + 'device.device_relation.table.list.createTime': '创建时间', + 'device.device_relation.table.list.updateTime': '更新时间', + 'device.device_relation.table.rule.required.deviceParentFkId': '设备父节点为必填项', + 'device.device_relation.table.rule.required.deviceSonFkId': '设备父节点为必填项', +}; diff --git a/src/locales/zh-CN/errorTypes.ts b/src/locales/zh-CN/errorTypes.ts new file mode 100644 index 0000000..3357bf1 --- /dev/null +++ b/src/locales/zh-CN/errorTypes.ts @@ -0,0 +1 @@ +export const errorTypes: {[key: string]: string} = {'error_type.playing_phone': '玩手机', 'error_type.person': '离岗', 'error_type.sleep': '睡觉'} diff --git a/src/locales/zh-CN/globalHeader.ts b/src/locales/zh-CN/globalHeader.ts new file mode 100644 index 0000000..9fd66a5 --- /dev/null +++ b/src/locales/zh-CN/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': '站内搜索', + 'component.globalHeader.search.example1': '搜索提示一', + 'component.globalHeader.search.example2': '搜索提示二', + 'component.globalHeader.search.example3': '搜索提示三', + 'component.globalHeader.help': '使用文档', + 'component.globalHeader.notification': '通知', + 'component.globalHeader.notification.empty': '你已查看所有通知', + 'component.globalHeader.message': '消息', + 'component.globalHeader.message.empty': '您已读完所有消息', + 'component.globalHeader.event': '待办', + 'component.globalHeader.event.empty': '你已完成所有待办', + 'component.noticeIcon.clear': '清空', + 'component.noticeIcon.cleared': '清空了', + 'component.noticeIcon.empty': '暂无数据', + 'component.noticeIcon.view-more': '查看更多', +}; diff --git a/src/locales/zh-CN/menu.ts b/src/locales/zh-CN/menu.ts new file mode 100644 index 0000000..98aef86 --- /dev/null +++ b/src/locales/zh-CN/menu.ts @@ -0,0 +1,75 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-01 13:56:33 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-10 14:44:54 + * @FilePath: \general-ai-platform-web\src\locales\zh-CN\menu.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +export default { + 'menu.fabricImageMapEditor': '图形预览', + 'menu.welcome': '欢迎', + 'menu.more-blocks': '更多区块', + 'menu.home': '首页', + 'menu.admin': '管理页', + 'menu.admin.sub-page': '二级管理页', + 'menu.login': '登录', + 'menu.register': '注册', + 'menu.register-result': '注册结果', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': '分析页', + 'menu.dashboard.monitor': '监控页', + 'menu.dashboard.workplace': '工作台', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': '表单页', + 'menu.form.basic-form': '基础表单', + 'menu.form.step-form': '分步表单', + 'menu.form.step-form.info': '分步表单(填写转账信息)', + 'menu.form.step-form.confirm': '分步表单(确认转账信息)', + 'menu.form.step-form.result': '分步表单(完成)', + 'menu.form.advanced-form': '高级表单', + 'menu.list': '列表页', + 'menu.list.table-list': '查询表格', + 'menu.list.basic-list': '标准列表', + 'menu.list.card-list': '卡片列表', + 'menu.list.search-list': '搜索列表', + 'menu.list.search-list.articles': '搜索列表(文章)', + 'menu.list.search-list.projects': '搜索列表(项目)', + 'menu.list.search-list.applications': '搜索列表(应用)', + 'menu.profile': '详情页', + 'menu.profile.basic': '基础详情页', + 'menu.profile.advanced': '高级详情页', + 'menu.result': '结果页', + 'menu.result.success': '成功页', + 'menu.result.fail': '失败页', + 'menu.exception': '异常页', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': '触发错误', + 'menu.account': '个人页', + 'menu.account.center': '个人中心', + 'menu.account.settings': '个人设置', + 'menu.account.trigger': '触发报错', + 'menu.account.logout': '退出登录', + 'menu.editor': '图形编辑器', + 'menu.editor.flow': '流程编辑器', + 'menu.editor.mind': '脑图编辑器', + 'menu.editor.koni': '拓扑编辑器', + 'menu.list.system': '系统设置', + 'menu.list.system.menu-list': '菜单列表', + 'menu.list.system.interface-list': '接口列表', + 'menu.list.system.api-list': '接口列表', + 'menu.list.system.role-list': '角色列表', + 'menu.list.system.user-list': '用户列表', + 'menu.list.system.post-list': '岗位列表', + 'menu.list.system.operation_record-list': '操作记录', + 'menu.list.system.dictionary-list': '字典列表', + 'menu.list.system.department-list': '部门列表', + 'menu.list.staff': '人力资源', + 'menu.list.staff.employee-list': '员工列表', + 'menu.device.device-relation-list': '设备版本列表', + 'menu.resource.algorithm-model-detail': '模型详情' +}; diff --git a/src/locales/zh-CN/pages.ts b/src/locales/zh-CN/pages.ts new file mode 100644 index 0000000..f38c701 --- /dev/null +++ b/src/locales/zh-CN/pages.ts @@ -0,0 +1,72 @@ +export default { + 'pages.layouts.userLayout.title': 'Ant Design 是西湖区最具影响力的 Web 设计规范', + 'pages.login.accountLogin.tab': '账户密码登录', + 'pages.login.accountLogin.errorMessage': '错误的用户名和密码(admin/ant.design)', + 'pages.login.failure': '登录失败,请重试!', + 'pages.login.success': '登录成功!', + 'pages.login.username.placeholder': '用户名: admin or user', + 'pages.login.username.required': '用户名是必填项!', + 'pages.login.password.placeholder': '密码: ant.design', + 'pages.login.password.required': '密码是必填项!', + 'pages.login.phoneLogin.tab': '手机号登录', + 'pages.login.phoneLogin.errorMessage': '验证码错误', + 'pages.login.phoneNumber.placeholder': '请输入手机号!', + 'pages.login.phoneNumber.required': '手机号是必填项!', + 'pages.login.phoneNumber.invalid': '不合法的手机号!', + 'pages.login.captcha.placeholder': '请输入验证码!', + 'pages.login.captcha.required': '验证码是必填项!', + 'pages.login.phoneLogin.getVerificationCode': '获取验证码', + 'pages.getCaptchaSecondText': '秒后重新获取', + 'pages.login.rememberMe': '自动登录', + 'pages.login.forgotPassword': '忘记密码 ?', + 'pages.login.submit': '登录', + 'pages.login.loginWith': '其他登录方式 :', + 'pages.login.registerAccount': '注册账户', + 'pages.welcome.link': '欢迎使用', + 'pages.welcome.alertMessage': '更快更强的重型组件,已经发布。', + 'pages.admin.subPage.title': ' 这个页面只有 admin 权限才能查看', + 'pages.admin.subPage.alertMessage': 'umi ui 现已发布,欢迎使用 npm run ui 启动体验。', + 'pages.searchTable.createForm.newRule': '新建规则', + 'pages.searchTable.detail': '详情', + 'pages.searchTable.update': '更新', + 'pages.searchTable.destroy': '删除', + 'pages.searchTable.create_son_menu': '添加子菜单', + 'pages.searchTable.create_root_menu': '添加根菜单', + 'pages.searchTable.create_son_department': '添加子部门', + 'pages.searchTable.create_root_department': '添加根部门', + 'pages.searchTable.updateForm.ruleConfig': '规则配置', + 'pages.searchTable.updateForm.basicConfig': '基本信息', + 'pages.searchTable.updateForm.ruleName.nameLabel': '规则名称', + 'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则名称!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': '规则描述', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个字符', + 'pages.searchTable.updateForm.ruleDesc.descRules': '请输入至少五个字符的规则描述!', + 'pages.searchTable.updateForm.ruleProps.title': '配置规则属性', + 'pages.searchTable.updateForm.object': '监控对象', + 'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模板', + 'pages.searchTable.updateForm.ruleProps.typeLabel': '规则类型', + 'pages.searchTable.updateForm.schedulingPeriod.title': '设定调度周期', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '开始时间', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': '请选择开始时间!', + 'pages.searchTable.titleDesc': '描述', + 'pages.searchTable.ruleName': '规则名称为必填项', + 'pages.searchTable.titleCallNo': '服务调用次数', + 'pages.searchTable.titleStatus': '状态', + 'pages.searchTable.nameStatus.default': '关闭', + 'pages.searchTable.nameStatus.running': '运行中', + 'pages.searchTable.nameStatus.online': '已上线', + 'pages.searchTable.nameStatus.abnormal': '异常', + 'pages.searchTable.titleUpdatedAt': '上次调度时间', + 'pages.searchTable.exception': '请输入异常原因!', + 'pages.searchTable.titleOption': '操作', + 'pages.searchTable.config': '配置', + 'pages.searchTable.subscribeAlert': '订阅警报', + 'pages.searchTable.title': '查询表格', + 'pages.searchTable.new': '新建', + 'pages.searchTable.chosen': '已选择', + 'pages.searchTable.item': '项', + 'pages.searchTable.totalServiceCalls': '服务调用次数总计', + 'pages.searchTable.tenThousand': '万', + 'pages.searchTable.batchDeletion': '批量删除', + 'pages.searchTable.batchApproval': '批量审批', +}; diff --git a/src/locales/zh-CN/project.ts b/src/locales/zh-CN/project.ts new file mode 100644 index 0000000..9fb563d --- /dev/null +++ b/src/locales/zh-CN/project.ts @@ -0,0 +1,24 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-01 13:56:33 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-17 14:36:31 + * @FilePath: \general-ai-platform-web\src\locales\zh-CN\project.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +export const project: { [key: string]: string } = { + 'project.project.table.list.id': 'ID', + 'project.project.table.list.name': '项目名称', + 'project.project.table.list.code': '项目代码', + 'project.project.table.list.info': '项目简介', + 'project.project.table.list.inferConfig': '推理配置', + 'project.project.table.list.isEnable': '是否启用', + 'project.project.table.list.remark': '备注', + 'project.project.table.list.createTime': '创建时间', + 'project.project.table.list.updateTime': '更新时间', + 'project.project.table.rule.required.name': '项目名称为必填项', + 'project.project.table.rule.required.code': '项目代码为必填项', + 'project.project.table.rule.required.info': '项目简介为必填项', + 'project.project.table.list.add': '新建项目', + 'project.project.table.list.update': '更新项目', +}; diff --git a/src/locales/zh-CN/pwa.ts b/src/locales/zh-CN/pwa.ts new file mode 100644 index 0000000..e950484 --- /dev/null +++ b/src/locales/zh-CN/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': '当前处于离线状态', + 'app.pwa.serviceworker.updated': '有新内容', + 'app.pwa.serviceworker.updated.hint': '请点击“刷新”按钮或者手动刷新页面', + 'app.pwa.serviceworker.updated.ok': '刷新', +}; diff --git a/src/locales/zh-CN/resource.ts b/src/locales/zh-CN/resource.ts new file mode 100644 index 0000000..b043f40 --- /dev/null +++ b/src/locales/zh-CN/resource.ts @@ -0,0 +1,81 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-01 13:56:33 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-14 14:59:00 + * @FilePath: \general-ai-platform-web\src\locales\zh-CN\resource.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +export const algorithm_model: { [key: string]: string } = { + 'resource.algorithm_model.table.list.defaultVersionFkId': '默认版本', + 'resource.algorithm_model.table.list.id': 'ID', + 'resource.algorithm_model.table.list.name': '模型名称', + 'resource.algorithm_model.table.list.categoryFkId': '模型类别', + 'resource.algorithm_model.table.list.remark': '备注', + 'resource.algorithm_model.table.list.createTime': '创建时间', + 'resource.algorithm_model.table.list.updateTime': '更新时间', + 'resource.algorithm_model.table.rule.required.name': '模型名称为必填项', + 'resource.algorithm_model.table.rule.required.categoryFkId': '模型类别为必填项', + 'resource.algorithm_model.table.list.add': '新建模型', + 'resource.algorithm_model.table.list.update': '更新模型', +}; +export const business_image: { [key: string]: string } = { + 'resource.business_image.table.list.id': 'ID', + 'resource.business_image.table.list.name': '镜像名称', + 'resource.business_image.table.list.version': '镜像版本', + 'resource.business_image.table.list.projectFkId': '项目', + 'resource.business_image.table.list.path': '镜像地址', + 'resource.business_image.table.list.startCode': '启动代码', + 'resource.business_image.table.list.config': '配置', + 'resource.business_image.table.list.configHash': '配置hash', + 'resource.business_image.table.list.remark': '备注', + 'resource.business_image.table.list.createTime': '创建时间', + 'resource.business_image.table.list.updateTime': '更新时间', + 'resource.business_image.table.rule.required.name': '镜像名称为必填项', + 'resource.business_image.table.rule.required.version': '镜像版本为必填项', + 'resource.business_image.table.rule.required.projectFkId': '项目为必填项', + 'resource.business_image.table.list.add': '新建业务镜像', + 'resource.business_image.table.list.update': '更新业务镜像', +}; +export const model_category: { [key: string]: string } = { + 'resource.model_category.table.list.id': 'ID', + 'resource.model_category.table.list.name': '类别名称', + 'resource.model_category.table.list.code': '类别代码', + 'resource.model_category.table.list.remark': '备注', + 'resource.model_category.table.list.createTime': '创建时间', + 'resource.model_category.table.list.updateTime': '更新时间', + 'resource.model_category.table.rule.required.name': '类别名称为必填项', + 'resource.model_category.table.rule.required.code': '类别代码为必填项', + 'resource.model_category.table.list.add': '新建模型类别', + 'resource.model_category.table.list.update': '更新模型类别', +}; +export const model_image: { [key: string]: string } = { + 'resource.model_image.table.list.id': 'ID', + 'resource.model_image.table.list.name': '镜像名称', + 'resource.model_image.table.list.modelVersionFkId': '模型版本', + 'resource.model_image.table.list.path': '镜像地址', + 'resource.model_image.table.list.startCode': '启动代码', + 'resource.model_image.table.list.remark': '备注', + 'resource.model_image.table.list.createTime': '创建时间', + 'resource.model_image.table.list.updateTime': '更新时间', + 'resource.model_image.table.rule.required.name': '镜像名称为必填项', + 'resource.model_image.table.rule.required.modelVersionFkId': '模型版本为必填项', + 'resource.model_image.table.list.add': '新建模型镜像', + 'resource.model_image.table.list.update': '更新模型镜像', +}; +export const model_version: { [key: string]: string } = { + 'resource.model_version.table.list.status': '状态', + 'resource.model_version.table.list.id': 'ID', + 'resource.model_version.table.list.modelFkId': '模型', + 'resource.model_version.table.list.version': '模型版本', + 'resource.model_version.table.list.path': '模型地址', + 'resource.model_version.table.list.startCode': '启动代码', + 'resource.model_version.table.list.isEnable': '是否启用', + 'resource.model_version.table.list.remark': '备注', + 'resource.model_version.table.list.createTime': '创建时间', + 'resource.model_version.table.list.updateTime': '更新时间', + 'resource.model_version.table.rule.required.modelFkId': '模型为必填项', + 'resource.model_version.table.rule.required.path': '模型地址为必填项', + 'resource.model_version.table.list.add': '新建模型版本', + 'resource.model_version.table.list.update': '更新模型版本', +}; diff --git a/src/locales/zh-CN/settingDrawer.ts b/src/locales/zh-CN/settingDrawer.ts new file mode 100644 index 0000000..3f44958 --- /dev/null +++ b/src/locales/zh-CN/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': '整体风格设置', + 'app.setting.pagestyle.dark': '暗色菜单风格', + 'app.setting.pagestyle.light': '亮色菜单风格', + 'app.setting.content-width': '内容区域宽度', + 'app.setting.content-width.fixed': '定宽', + 'app.setting.content-width.fluid': '流式', + 'app.setting.themecolor': '主题色', + 'app.setting.themecolor.dust': '薄暮', + 'app.setting.themecolor.volcano': '火山', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明青', + 'app.setting.themecolor.green': '极光绿', + 'app.setting.themecolor.daybreak': '拂晓蓝(默认)', + 'app.setting.themecolor.geekblue': '极客蓝', + 'app.setting.themecolor.purple': '酱紫', + 'app.setting.navigationmode': '导航模式', + 'app.setting.sidemenu': '侧边菜单布局', + 'app.setting.topmenu': '顶部菜单布局', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定侧边菜单', + 'app.setting.fixedsidebar.hint': '侧边菜单布局时可配置', + 'app.setting.hideheader': '下滑时隐藏 Header', + 'app.setting.hideheader.hint': '固定 Header 时可配置', + 'app.setting.othersettings': '其他设置', + 'app.setting.weakmode': '色弱模式', + 'app.setting.copy': '拷贝设置', + 'app.setting.copyinfo': '拷贝成功,请到 config/defaultSettings.js 中替换默认配置', + 'app.setting.production.hint': + '配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件', +}; diff --git a/src/locales/zh-CN/settings.ts b/src/locales/zh-CN/settings.ts new file mode 100644 index 0000000..df8af43 --- /dev/null +++ b/src/locales/zh-CN/settings.ts @@ -0,0 +1,55 @@ +export default { + 'app.settings.menuMap.basic': '基本设置', + 'app.settings.menuMap.security': '安全设置', + 'app.settings.menuMap.binding': '账号绑定', + 'app.settings.menuMap.notification': '新消息通知', + 'app.settings.basic.avatar': '头像', + 'app.settings.basic.change-avatar': '更换头像', + 'app.settings.basic.email': '邮箱', + 'app.settings.basic.email-message': '请输入您的邮箱!', + 'app.settings.basic.nickname': '昵称', + 'app.settings.basic.nickname-message': '请输入您的昵称!', + 'app.settings.basic.profile': '个人简介', + 'app.settings.basic.profile-message': '请输入个人简介!', + 'app.settings.basic.profile-placeholder': '个人简介', + 'app.settings.basic.country': '国家/地区', + 'app.settings.basic.country-message': '请输入您的国家或地区!', + 'app.settings.basic.geographic': '所在省市', + 'app.settings.basic.geographic-message': '请输入您的所在省市!', + 'app.settings.basic.address': '街道地址', + 'app.settings.basic.address-message': '请输入您的街道地址!', + 'app.settings.basic.phone': '联系电话', + 'app.settings.basic.phone-message': '请输入您的联系电话!', + 'app.settings.basic.update': '更新基本信息', + 'app.settings.security.strong': '强', + 'app.settings.security.medium': '中', + 'app.settings.security.weak': '弱', + 'app.settings.security.password': '账户密码', + 'app.settings.security.password-description': '当前密码强度', + 'app.settings.security.phone': '密保手机', + 'app.settings.security.phone-description': '已绑定手机', + 'app.settings.security.question': '密保问题', + 'app.settings.security.question-description': '未设置密保问题,密保问题可有效保护账户安全', + 'app.settings.security.email': '备用邮箱', + 'app.settings.security.email-description': '已绑定邮箱', + 'app.settings.security.mfa': 'MFA 设备', + 'app.settings.security.mfa-description': '未绑定 MFA 设备,绑定后,可以进行二次确认', + 'app.settings.security.modify': '修改', + 'app.settings.security.set': '设置', + 'app.settings.security.bind': '绑定', + 'app.settings.binding.taobao': '绑定淘宝', + 'app.settings.binding.taobao-description': '当前未绑定淘宝账号', + 'app.settings.binding.alipay': '绑定支付宝', + 'app.settings.binding.alipay-description': '当前未绑定支付宝账号', + 'app.settings.binding.dingding': '绑定钉钉', + 'app.settings.binding.dingding-description': '当前未绑定钉钉账号', + 'app.settings.binding.bind': '绑定', + 'app.settings.notification.password': '账户密码', + 'app.settings.notification.password-description': '其他用户的消息将以站内信的形式通知', + 'app.settings.notification.messages': '系统消息', + 'app.settings.notification.messages-description': '系统消息将以站内信的形式通知', + 'app.settings.notification.todo': '待办任务', + 'app.settings.notification.todo-description': '待办任务将以站内信的形式通知', + 'app.settings.open': '开', + 'app.settings.close': '关', +}; diff --git a/src/locales/zh-CN/system.ts b/src/locales/zh-CN/system.ts new file mode 100644 index 0000000..bde69eb --- /dev/null +++ b/src/locales/zh-CN/system.ts @@ -0,0 +1,154 @@ +export const interface_api: { [key: string]: string } = { + 'system.interface.table.list.id': 'ID', + 'system.interface.table.list.name': '权限名称', + 'system.interface.table.list.value': '权限值', + 'system.interface.table.list.method': '请求方式', + 'system.interface.table.list.url': '接口地址', + 'system.interface.table.list.add': '新建接口', + 'system.interface.table.list.update': '更新接口', + 'system.interface.table.rule.required.name': '权限名称为必填项', + 'system.interface.table.rule.required.value': '权限值为必填项', + 'system.interface.table.rule.required.method': '请求方式为必填项', + 'system.interface.table.rule.required.url': '接口地址为必填项', + 'system.interface.enum.GET': 'GET', + 'system.interface.enum.POST': 'POST', + 'system.interface.enum.DELETE': 'DELETE', + 'system.interface.enum.PUT': 'PUT', + 'system.interface.enum.PATCH': 'PATCH' +} +export const dynamic_menu: { [key: string]: string } = { + 'system.menu.table.list.id': 'ID', + 'system.menu.table.list.parentId': '父节点', + 'system.menu.table.list.type': '菜单类型', + 'system.menu.table.list.type_M': '目录', + 'system.menu.table.list.type_C': '菜单', + 'system.menu.table.list.type_F': '按钮', + 'system.menu.table.list.type_E': '外链', + 'system.menu.table.list.title': '展示名称', + 'system.menu.table.list.sort': '顺序', + 'system.menu.table.list.name': '路由名称', + 'system.menu.table.list.path': '路由路径', + 'system.menu.table.list.component': '组件路径', + 'system.menu.table.list.icon': '图标', + 'system.menu.table.list.permission': '权限标识', + 'system.menu.table.list.hidden': '是否隐藏', + 'system.menu.table.list.remark': '备注', + 'system.menu.table.list.externalLink': '外链地址', + 'system.menu.table.list.add': '添加根菜单', + 'system.menu.table.list.create_son_menu': '添加子菜单', + 'system.menu.table.list.update': '更新菜单', + + 'system.menu.table.rule.required.name': '菜单名称为必填项', + 'system.menu.table.rule.required.value': '菜单值为必填项', + 'system.menu.table.rule.required.icon': '图标为必填项', + 'system.menu.table.rule.required.sequence': '顺序为必填项', + 'system.menu.table.rule.required.is_dir': '是否为目录为必填项', + 'system.menu.table.rule.required.is_external_link': '是否是外链接为必填项', + 'system.menu.table.rule.required.parent_fk_id': '父节点为必填项' +} +export const api: { [key: string]: string } = { + 'system.api.table.list.id': 'ID', + 'system.api.table.list.path': '接口路径', + 'system.api.table.list.method': '请求方式', + 'system.api.table.list.apiGroup': '接口分组', + 'system.api.table.list.description': '接口描述', + 'system.api.table.rule.required.path': '接口路径为必填项', + 'system.api.enum.GET': 'GET', + 'system.api.enum.POST': 'POST', + 'system.api.enum.DELETE': 'DELETE', + 'system.api.enum.PUT': 'PUT', + 'system.api.enum.PATCH': 'PATCH' +} + +export const role: { [key: string]: string } = { + 'system.role.table.list.id': 'ID', + 'system.role.table.list.name': '角色名称', + 'system.role.table.list.code': '角色代码', + 'system.role.table.list.sort': '排序', + 'system.role.table.list.status': '状态', + 'system.role.table.list.remark': '备注', + 'system.role.table.action.set_permission': '设置权限', + 'system.role.table.list.api_permission': 'api权限', + 'system.role.table.list.menu_permission': '菜单权限', + 'system.role.table.list.resource_permission': '资源权限', + 'system.role.table.list.create': '新建角色', + 'system.role.table.list.set_permission': '设置权限', + 'system.role.table.list.update': '更新角色', + 'system.role.table.rule.required.name': '角色名称为必填项', + 'system.role.table.rule.required.code': '角色代码为必填项', +} + +export const user: { [key: string]: string } = { + 'system.user.table.list.id': 'ID', + 'system.user.table.list.userName': '用户名', + 'system.user.table.list.nickName': '昵称', + 'system.user.table.list.password': '密码', + 'system.user.table.list.password_re': '再一次确认密码', + 'system.user.table.list.roleId': '角色', + 'system.user.table.list.roleIds': '角色', + 'system.user.table.list.phone': '手机', + 'system.user.table.list.email': '邮件', + 'system.user.table.list.avatarId': '头像', + 'system.user.table.list.postId': '岗位', + 'system.user.table.list.postIds': '岗位', + 'system.user.table.list.deptId': '部门', + 'system.user.table.list.enable': '是否启用', + 'system.user.table.list.remark': '备注', + 'system.user.table.list.create': '新建用户', + 'system.user.table.list.update': '更新用户', + 'system.user.table.rule.required.userName': '用户名为必填项', + 'system.user.table.rule.required.nickName': '昵称为必填项', + 'system.user.table.rule.required.password': '密码为必填项', + 'system.user.table.rule.password.not_same': '两次密码不一致' +} + +export const post: { [key: string]: string } = { + 'system.post.table.list.id': 'ID', + 'system.post.table.list.name': '岗位名称', + 'system.post.table.list.code': '岗位代码', + 'system.post.table.list.sort': '排序', + 'system.post.table.list.status': '状态', + 'system.post.table.list.remark': '备注', + 'system.post.table.list.create': '新建岗位', + 'system.post.table.list.update': '更新岗位', + 'system.post.table.rule.required.name': '岗位名称为必填项', + 'system.post.table.rule.required.code': '岗位代码为必填项', +} + +export const department: { [key: string]: string } = { + 'system.department.table.list.id': 'ID', + 'system.department.table.list.parentId': '父节点', + 'system.department.table.list.name': '部门名称', + 'system.department.table.list.code': '部门代码', + 'system.department.table.list.phone': '部门电话', + 'system.department.table.list.email': '部门邮箱', + 'system.department.table.list.sort': '排序', + 'system.department.table.list.status': '状态', + 'system.department.table.list.remark': '备注', + 'system.department.table.list.create': '添加根部门', + 'system.department.table.list.create_son_department': '添加子部门', + 'system.department.table.list.update': '更新部门', + 'system.department.table.rule.required.name': '部门名称为必填项', + 'system.department.table.rule.required.code': '部门代码为必填项', +} +export const operation_record: { [key: string]: string } = { + 'system.operation.table.list.id': 'ID', + 'system.operation.table.list.status': '请求状态', + 'system.operation.table.list.ip': '请求IP', + 'system.operation.table.list.path': '接口路径', + 'system.operation.table.list.method': '请求方法', + 'system.operation.table.list.latency': '延迟', + 'system.operation.table.list.agent': '代理', + 'system.operation.table.list.error_message': '错误信息', + 'system.operation.table.list.body': '请求Body', + 'system.operation.table.list.resp': '响应Body', + 'system.operation.table.list.user_id': '用户ID', + 'system.operation.table.list.sort': '排序', + 'system.operation.table.list.remark': '备注', + 'system.operation.table.list.create': '新建操作日志', + 'system.operation.table.list.createTime': '创建时间', + 'system.operation.table.list.updateTime': '更新时间', + + 'system.operation.table.rule.list.ip': '请填写IP', + 'system.operation.table.rule.list.path': '请填写接口路径', +} diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts new file mode 100644 index 0000000..6ad5f93 --- /dev/null +++ b/src/locales/zh-TW.ts @@ -0,0 +1,20 @@ +import component from './zh-TW/component'; +import globalHeader from './zh-TW/globalHeader'; +import menu from './zh-TW/menu'; +import pwa from './zh-TW/pwa'; +import settingDrawer from './zh-TW/settingDrawer'; +import settings from './zh-TW/settings'; + +export default { + 'navBar.lang': '語言', + 'layout.user.link.help': '幫助', + 'layout.user.link.privacy': '隱私', + 'layout.user.link.terms': '條款', + 'app.preview.down.block': '下載此頁面到本地項目', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/zh-TW/component.ts b/src/locales/zh-TW/component.ts new file mode 100644 index 0000000..ba48e29 --- /dev/null +++ b/src/locales/zh-TW/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': '展開', + 'component.tagSelect.collapse': '收起', + 'component.tagSelect.all': '全部', +}; diff --git a/src/locales/zh-TW/globalHeader.ts b/src/locales/zh-TW/globalHeader.ts new file mode 100644 index 0000000..ed58451 --- /dev/null +++ b/src/locales/zh-TW/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': '站內搜索', + 'component.globalHeader.search.example1': '搜索提示壹', + 'component.globalHeader.search.example2': '搜索提示二', + 'component.globalHeader.search.example3': '搜索提示三', + 'component.globalHeader.help': '使用手冊', + 'component.globalHeader.notification': '通知', + 'component.globalHeader.notification.empty': '妳已查看所有通知', + 'component.globalHeader.message': '消息', + 'component.globalHeader.message.empty': '您已讀完所有消息', + 'component.globalHeader.event': '待辦', + 'component.globalHeader.event.empty': '妳已完成所有待辦', + 'component.noticeIcon.clear': '清空', + 'component.noticeIcon.cleared': '清空了', + 'component.noticeIcon.empty': '暫無資料', + 'component.noticeIcon.view-more': '查看更多', +}; diff --git a/src/locales/zh-TW/menu.ts b/src/locales/zh-TW/menu.ts new file mode 100644 index 0000000..0ef54c9 --- /dev/null +++ b/src/locales/zh-TW/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': '歡迎', + 'menu.more-blocks': '更多區塊', + 'menu.home': '首頁', + 'menu.admin': '权限', + 'menu.admin.sub-page': '二级管理页', + 'menu.login': '登錄', + 'menu.register': '註冊', + 'menu.register-result': '註冊結果', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': '分析頁', + 'menu.dashboard.monitor': '監控頁', + 'menu.dashboard.workplace': '工作臺', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': '表單頁', + 'menu.form.basic-form': '基礎表單', + 'menu.form.step-form': '分步表單', + 'menu.form.step-form.info': '分步表單(填寫轉賬信息)', + 'menu.form.step-form.confirm': '分步表單(確認轉賬信息)', + 'menu.form.step-form.result': '分步表單(完成)', + 'menu.form.advanced-form': '高級表單', + 'menu.list': '列表頁', + 'menu.list.table-list': '查詢表格', + 'menu.list.basic-list': '標淮列表', + 'menu.list.card-list': '卡片列表', + 'menu.list.search-list': '搜索列表', + 'menu.list.search-list.articles': '搜索列表(文章)', + 'menu.list.search-list.projects': '搜索列表(項目)', + 'menu.list.search-list.applications': '搜索列表(應用)', + 'menu.profile': '詳情頁', + 'menu.profile.basic': '基礎詳情頁', + 'menu.profile.advanced': '高級詳情頁', + 'menu.result': '結果頁', + 'menu.result.success': '成功頁', + 'menu.result.fail': '失敗頁', + 'menu.exception': '异常页', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': '触发错误', + 'menu.account': '個人頁', + 'menu.account.center': '個人中心', + 'menu.account.settings': '個人設置', + 'menu.account.trigger': '觸發報錯', + 'menu.account.logout': '退出登錄', + 'menu.editor': '圖形編輯器', + 'menu.editor.flow': '流程編輯器', + 'menu.editor.mind': '腦圖編輯器', + 'menu.editor.koni': '拓撲編輯器', +}; diff --git a/src/locales/zh-TW/pages.ts b/src/locales/zh-TW/pages.ts new file mode 100644 index 0000000..9027ed9 --- /dev/null +++ b/src/locales/zh-TW/pages.ts @@ -0,0 +1,65 @@ +export default { + 'pages.layouts.userLayout.title': 'Ant Design 是西湖區最具影響力的 Web 設計規範', + 'pages.login.accountLogin.tab': '賬戶密碼登錄', + 'pages.login.accountLogin.errorMessage': '錯誤的用戶名和密碼(admin/ant.design)', + 'pages.login.failure': '登錄失敗,請重試!', + 'pages.login.success': '登錄成功!', + 'pages.login.username.placeholder': '用戶名: admin or user', + 'pages.login.username.required': '用戶名是必填項!', + 'pages.login.password.placeholder': '密碼: ant.design', + 'pages.login.password.required': '密碼是必填項!', + 'pages.login.phoneLogin.tab': '手機號登錄', + 'pages.login.phoneLogin.errorMessage': '驗證碼錯誤', + 'pages.login.phoneNumber.placeholder': '請輸入手機號!', + 'pages.login.phoneNumber.required': '手機號是必填項!', + 'pages.login.phoneNumber.invalid': '不合法的手機號!', + 'pages.login.captcha.placeholder': '請輸入驗證碼!', + 'pages.login.captcha.required': '驗證碼是必填項!', + 'pages.login.phoneLogin.getVerificationCode': '獲取驗證碼', + 'pages.getCaptchaSecondText': '秒後重新獲取', + 'pages.login.rememberMe': '自動登錄', + 'pages.login.forgotPassword': '忘記密碼 ?', + 'pages.login.submit': '登錄', + 'pages.login.loginWith': '其他登錄方式 :', + 'pages.login.registerAccount': '註冊賬戶', + 'pages.welcome.link': '歡迎使用', + 'pages.welcome.alertMessage': '更快更強的重型組件,已經發布。', + 'pages.admin.subPage.title': '這個頁面只有 admin 權限才能查看', + 'pages.admin.subPage.alertMessage': 'umi ui 現已發佈,歡迎使用 npm run ui 啓動體驗。', + 'pages.searchTable.createForm.newRule': '新建規則', + 'pages.searchTable.updateForm.ruleConfig': '規則配置', + 'pages.searchTable.updateForm.basicConfig': '基本信息', + 'pages.searchTable.updateForm.ruleName.nameLabel': '規則名稱', + 'pages.searchTable.updateForm.ruleName.nameRules': '請輸入規則名稱!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': '規則描述', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '請輸入至少五個字符', + 'pages.searchTable.updateForm.ruleDesc.descRules': '請輸入至少五個字符的規則描述!', + 'pages.searchTable.updateForm.ruleProps.title': '配置規則屬性', + 'pages.searchTable.updateForm.object': '監控對象', + 'pages.searchTable.updateForm.ruleProps.templateLabel': '規則模板', + 'pages.searchTable.updateForm.ruleProps.typeLabel': '規則類型', + 'pages.searchTable.updateForm.schedulingPeriod.title': '設定調度週期', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': '請選擇開始時間!', + 'pages.searchTable.titleDesc': '描述', + 'pages.searchTable.ruleName': '規則名稱爲必填項', + 'pages.searchTable.titleCallNo': '服務調用次數', + 'pages.searchTable.titleStatus': '狀態', + 'pages.searchTable.nameStatus.default': '關閉', + 'pages.searchTable.nameStatus.running': '運行中', + 'pages.searchTable.nameStatus.online': '已上線', + 'pages.searchTable.nameStatus.abnormal': '異常', + 'pages.searchTable.titleUpdatedAt': '上次調度時間', + 'pages.searchTable.exception': '請輸入異常原因!', + 'pages.searchTable.titleOption': '操作', + 'pages.searchTable.config': '配置', + 'pages.searchTable.subscribeAlert': '訂閱警報', + 'pages.searchTable.title': '查詢表格', + 'pages.searchTable.new': '新建', + 'pages.searchTable.chosen': '已選擇', + 'pages.searchTable.item': '項', + 'pages.searchTable.totalServiceCalls': '服務調用次數總計', + 'pages.searchTable.tenThousand': '萬', + 'pages.searchTable.batchDeletion': '批量刪除', + 'pages.searchTable.batchApproval': '批量審批', +}; diff --git a/src/locales/zh-TW/pwa.ts b/src/locales/zh-TW/pwa.ts new file mode 100644 index 0000000..108a6e4 --- /dev/null +++ b/src/locales/zh-TW/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': '當前處於離線狀態', + 'app.pwa.serviceworker.updated': '有新內容', + 'app.pwa.serviceworker.updated.hint': '請點擊“刷新”按鈕或者手動刷新頁面', + 'app.pwa.serviceworker.updated.ok': '刷新', +}; diff --git a/src/locales/zh-TW/settingDrawer.ts b/src/locales/zh-TW/settingDrawer.ts new file mode 100644 index 0000000..454da28 --- /dev/null +++ b/src/locales/zh-TW/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': '整體風格設置', + 'app.setting.pagestyle.dark': '暗色菜單風格', + 'app.setting.pagestyle.light': '亮色菜單風格', + 'app.setting.content-width': '內容區域寬度', + 'app.setting.content-width.fixed': '定寬', + 'app.setting.content-width.fluid': '流式', + 'app.setting.themecolor': '主題色', + 'app.setting.themecolor.dust': '薄暮', + 'app.setting.themecolor.volcano': '火山', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明青', + 'app.setting.themecolor.green': '極光綠', + 'app.setting.themecolor.daybreak': '拂曉藍(默認)', + 'app.setting.themecolor.geekblue': '極客藍', + 'app.setting.themecolor.purple': '醬紫', + 'app.setting.navigationmode': '導航模式', + 'app.setting.sidemenu': '側邊菜單布局', + 'app.setting.topmenu': '頂部菜單布局', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定側邊菜單', + 'app.setting.fixedsidebar.hint': '側邊菜單布局時可配置', + 'app.setting.hideheader': '下滑時隱藏 Header', + 'app.setting.hideheader.hint': '固定 Header 時可配置', + 'app.setting.othersettings': '其他設置', + 'app.setting.weakmode': '色弱模式', + 'app.setting.copy': '拷貝設置', + 'app.setting.copyinfo': '拷貝成功,請到 config/defaultSettings.js 中替換默認配置', + 'app.setting.production.hint': + '配置欄只在開發環境用於預覽,生產環境不會展現,請拷貝後手動修改配置文件', +}; diff --git a/src/locales/zh-TW/settings.ts b/src/locales/zh-TW/settings.ts new file mode 100644 index 0000000..dd45151 --- /dev/null +++ b/src/locales/zh-TW/settings.ts @@ -0,0 +1,55 @@ +export default { + 'app.settings.menuMap.basic': '基本設置', + 'app.settings.menuMap.security': '安全設置', + 'app.settings.menuMap.binding': '賬號綁定', + 'app.settings.menuMap.notification': '新消息通知', + 'app.settings.basic.avatar': '頭像', + 'app.settings.basic.change-avatar': '更換頭像', + 'app.settings.basic.email': '郵箱', + 'app.settings.basic.email-message': '請輸入您的郵箱!', + 'app.settings.basic.nickname': '昵稱', + 'app.settings.basic.nickname-message': '請輸入您的昵稱!', + 'app.settings.basic.profile': '個人簡介', + 'app.settings.basic.profile-message': '請輸入個人簡介!', + 'app.settings.basic.profile-placeholder': '個人簡介', + 'app.settings.basic.country': '國家/地區', + 'app.settings.basic.country-message': '請輸入您的國家或地區!', + 'app.settings.basic.geographic': '所在省市', + 'app.settings.basic.geographic-message': '請輸入您的所在省市!', + 'app.settings.basic.address': '街道地址', + 'app.settings.basic.address-message': '請輸入您的街道地址!', + 'app.settings.basic.phone': '聯系電話', + 'app.settings.basic.phone-message': '請輸入您的聯系電話!', + 'app.settings.basic.update': '更新基本信息', + 'app.settings.security.strong': '強', + 'app.settings.security.medium': '中', + 'app.settings.security.weak': '弱', + 'app.settings.security.password': '賬戶密碼', + 'app.settings.security.password-description': '當前密碼強度', + 'app.settings.security.phone': '密保手機', + 'app.settings.security.phone-description': '已綁定手機', + 'app.settings.security.question': '密保問題', + 'app.settings.security.question-description': '未設置密保問題,密保問題可有效保護賬戶安全', + 'app.settings.security.email': '備用郵箱', + 'app.settings.security.email-description': '已綁定郵箱', + 'app.settings.security.mfa': 'MFA 設備', + 'app.settings.security.mfa-description': '未綁定 MFA 設備,綁定後,可以進行二次確認', + 'app.settings.security.modify': '修改', + 'app.settings.security.set': '設置', + 'app.settings.security.bind': '綁定', + 'app.settings.binding.taobao': '綁定淘寶', + 'app.settings.binding.taobao-description': '當前未綁定淘寶賬號', + 'app.settings.binding.alipay': '綁定支付寶', + 'app.settings.binding.alipay-description': '當前未綁定支付寶賬號', + 'app.settings.binding.dingding': '綁定釘釘', + 'app.settings.binding.dingding-description': '當前未綁定釘釘賬號', + 'app.settings.binding.bind': '綁定', + 'app.settings.notification.password': '賬戶密碼', + 'app.settings.notification.password-description': '其他用戶的消息將以站內信的形式通知', + 'app.settings.notification.messages': '系統消息', + 'app.settings.notification.messages-description': '系統消息將以站內信的形式通知', + 'app.settings.notification.todo': '待辦任務', + 'app.settings.notification.todo-description': '待辦任務將以站內信的形式通知', + 'app.settings.open': '開', + 'app.settings.close': '關', +}; diff --git a/src/manifest.json b/src/manifest.json new file mode 100644 index 0000000..839bc5b --- /dev/null +++ b/src/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Ant Design Pro", + "short_name": "Ant Design Pro", + "display": "standalone", + "start_url": "./?utm_source=homescreen", + "theme_color": "#002140", + "background_color": "#001529", + "icons": [ + { + "src": "icons/icon-192x192.png", + "sizes": "192x192" + }, + { + "src": "icons/icon-128x128.png", + "sizes": "128x128" + }, + { + "src": "icons/icon-512x512.png", + "sizes": "512x512" + } + ] +} diff --git a/src/pages/404.tsx b/src/pages/404.tsx new file mode 100644 index 0000000..729f3b2 --- /dev/null +++ b/src/pages/404.tsx @@ -0,0 +1,104 @@ +import { + ProCard, + ProForm, + ProFormDependency, + ProFormSelect, + ProFormText, + ProFormUploadDragger, +} from '@ant-design/pro-components'; +import { Form, Image } from 'antd'; +import React, { useState } from 'react'; +// @ts-ignore +import cookie from 'react-cookies'; +const ShowInfoDemo: React.FC = () => { + const [form] = Form.useForm<API.ModelImage>(); + const [imageUrl, setImageUrl] = useState<string>(''); + // useEffect(()=>{ + + // }, []) + const initialValues = { + cardCode: '100100199508081010', + gender: '男', + }; + return ( + <div className="showInfoDemo_wrap"> + <ProCard wrap title={'选择图片'} bodyStyle={{ display: 'flex' }}> + <div> + <ProFormUploadDragger + width={800} + name="projectFilePath" + action="/api/v1/file/uploadFile" + max={1} + fieldProps={{ + showUploadList: false, + listType: 'picture-card', + beforeUpload: (file) => { + const reader = new FileReader(); + reader.onload = (e) => { + setImageUrl(e.target?.result as string); + }; + + reader.readAsDataURL(file); + + // 返回 false 可以阻止上传 + // 返回 Promise 可以异步操作 + return true; + }, + maxCount: 1, + name: 'file', + // beforeUpload: beforeUploadFile, + data: { path: 'project/files' }, + headers: { + 'X-CSRFToken': cookie.load('csrftoken'), + Authorization: `Bearer ${localStorage.getItem('access') || ''}`, + }, + }} + > + <Image width={800} src={imageUrl} preview={false} /> + </ProFormUploadDragger> + + {/* <Image width={800} height={800} src={imageUrl}> + + </Image> */} + </div> + + {/* 展示信息 */} + <div style={{ flex: 1, padding: 20 }}> + <ProForm + form={form} + initialValues={initialValues} // 设置初始值 + submitter={ + { render: false } // 隐藏提交按钮 + } // 配置 submitter + > + <ProFormSelect + fieldProps={{ + labelInValue: true, + }} + request={async () => [ + // TODO 使用接口数据与 initialValues 值对应 + { label: '证件号码', value: 'cardCode' }, + { label: '性别', value: 'gender' }, + ]} + name="name1" + label="展示数据" + /> + <ProFormDependency name={['name1']}> + {({ name1 }) => { + if (name1) { + console.log(name1, 'ProFormDependency_name1'); + return ( + <ProFormText label={name1.label} name={name1.value} disabled required={false} /> + ); + } + return <></>; + }} + </ProFormDependency> + </ProForm> + </div> + </ProCard> + </div> + ); +}; + +export default ShowInfoDemo; diff --git a/src/pages/Admin.tsx b/src/pages/Admin.tsx new file mode 100644 index 0000000..2f93986 --- /dev/null +++ b/src/pages/Admin.tsx @@ -0,0 +1,45 @@ +import { HeartTwoTone, SmileTwoTone } from '@ant-design/icons'; +import { PageContainer } from '@ant-design/pro-components'; +import { useIntl } from '@umijs/max'; +import { Alert, Card, Typography } from 'antd'; +import React from 'react'; + +const Admin: React.FC = () => { + const intl = useIntl(); + return ( + <PageContainer + content={intl.formatMessage({ + id: 'pages.admin.subPage.title', + defaultMessage: 'This page can only be viewed by admin', + })} + > + <Card> + <Alert + message={intl.formatMessage({ + id: 'pages.welcome.alertMessage', + defaultMessage: 'Faster and stronger heavy-duty components have been released.', + })} + type="success" + showIcon + banner + style={{ + margin: -12, + marginBottom: 48, + }} + /> + <Typography.Title level={2} style={{ textAlign: 'center' }}> + <SmileTwoTone /> Ant Design Pro <HeartTwoTone twoToneColor="#eb2f96" /> You + </Typography.Title> + </Card> + <p style={{ textAlign: 'center', marginTop: 24 }}> + Want to add more pages? Please refer to{' '} + <a href="https://pro.ant.design/docs/block-cn" target="_blank" rel="noopener noreferrer"> + use block + </a> + 。 + </p> + </PageContainer> + ); +}; + +export default Admin; diff --git a/src/pages/Fabric/ImageMapEditor/ColumnDrawer.tsx b/src/pages/Fabric/ImageMapEditor/ColumnDrawer.tsx new file mode 100644 index 0000000..652cf83 --- /dev/null +++ b/src/pages/Fabric/ImageMapEditor/ColumnDrawer.tsx @@ -0,0 +1,53 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-01 13:56:33 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-06 16:16:10 + * @FilePath: \general-ai-platform-web\src\pages\Resource\ModelCategoryList\components\ColumnDrawer.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import React from "react"; +import {Drawer} from "antd"; +import {ProColumns, ProDescriptions, ProDescriptionsItemProps} from "@ant-design/pro-components"; + +export type ColumnDrawProps = { + handleDrawer: (id?: any)=>void; + isShowDetail: boolean; + columns: ProColumns<API.ModelCategory>[]; + currentRow: Record<string,any>; +}; + + +const ColumnDrawer: React.FC<ColumnDrawProps> = (props) => { + + return ( + <Drawer + width={500} + open={props.isShowDetail} + onClose={() => { + props.handleDrawer(); + }} + closable={true} + > + {props.currentRow?.id && ( + <ProDescriptions<API.ModelCategory> + style={{ + // paddingLeft: 4, + // paddingRight: 4 + }} + column={2} + title={props.currentRow?.id} + request={async () => ({ + data: props.currentRow || {}, + })} + params={{ + id: props.currentRow?.id, + }} + columns={props.columns as ProDescriptionsItemProps<API.ModelCategory>[]} + /> + )} + </Drawer> + ) +} +export {ColumnDrawer} + diff --git a/src/pages/Fabric/ImageMapEditor/Descriptors.json b/src/pages/Fabric/ImageMapEditor/Descriptors.json new file mode 100644 index 0000000..4b1e7f4 --- /dev/null +++ b/src/pages/Fabric/ImageMapEditor/Descriptors.json @@ -0,0 +1,253 @@ +{ + "MARKER": [{ + "name": "Marker", + "description": "", + "type": "marker", + "icon": { + "prefix": "fas", + "name": "map-marker-alt" + }, + "option": { + "type": "i-text", + "text": "\uf3c5", + "fontFamily": "Font Awesome 5 Free", + "fontWeight": 900, + "fontSize": 60, + "width": 30, + "height": 30, + "editable": false, + "name": "New marker" + } + }], + "TEXT": [{ + "name": "Text", + "description": "", + "type": "text", + "icon": { + "prefix": "fas", + "name": "font" + }, + "option": { + "type": "textbox", + "text": "输入文字", + "width": 60, + "height": 30, + "fontSize": 32, + "name": "New text" + } + }], + "IMAGE": [{ + "name": "Image", + "description": "", + "type": "image", + "icon": { + "prefix": "fas", + "name": "image" + }, + "option": { + "type": "image", + "name": "New image", + "src": "./images/sample/transparentBg.png" + } + }, + { + "name": "GIF", + "description": "", + "type": "gif", + "icon": { + "prefix": "fas", + "name": "image" + }, + "option": { + "type": "gif", + "width": 400, + "height": 400, + "name": "New gif", + "src": "" + } + } + ], + "SHAPE": [{ + "name": "Triangle", + "description": "", + "type": "shape", + "icon": { + "prefix": "fas", + "name": "play", + "style": { + "transform": "rotate(270deg)" + } + }, + "option": { + "type": "triangle", + "width": 30, + "height": 30, + "name": "New shape" + } + }, + { + "name": "Rectangle", + "description": "", + "type": "shape", + "icon": { + "prefix": "fas", + "name": "stop" + }, + "option": { + "type": "rect", + "width": 40, + "height": 40, + "name": "New shape" + } + }, + { + "name": "Circle", + "description": "", + "type": "shape", + "icon": { + "prefix": "fas", + "name": "circle" + }, + "option": { + "type": "circle", + "radius": 30, + "name": "New shape" + } + }, + { + "name": "Cube", + "description": "", + "type": "shape", + "icon": { + "prefix": "fas", + "name": "cube" + }, + "option": { + "type": "cube", + "width": 80, + "height": 80, + "name": "New shape" + } + }, + { + "name": "node", + "description": "", + "type": "node", + "icon": { + "prefix": "fas", + "name": "font" + }, + "option": { + "type": "node" + } + } + ], + "DRAWING": [{ + "name": "Polygon", + "description": "", + "type": "drawing", + "icon": { + "prefix": "fas", + "name": "draw-polygon" + }, + "option": { + "type": "polygon", + "name": "New polygon" + } + }, + { + "name": "Line", + "description": "", + "type": "drawing", + "icon": { + "prefix": "fas", + "name": "minus" + }, + "option": { + "type": "line", + "name": "New line" + } + }, + { + "name": "Arrow", + "description": "", + "type": "drawing", + "icon": { + "prefix": "fas", + "name": "long-arrow-alt-right" + }, + "option": { + "type": "arrow", + "name": "New arrow" + } + } + ], + "ELEMENT": [ + { + "name": "Element", + "description": "", + "type": "element", + "icon": { + "prefix": "fab", + "name": "html5" + }, + "option": { + "superType": "element", + "type": "element", + "width": 480, + "height": 270, + "name": "New element" + } + }, + { + "name": "Iframe", + "description": "", + "type": "element", + "icon": { + "prefix": "fas", + "name": "window-maximize" + }, + "option": { + "superType": "element", + "type": "iframe", + "width": 480, + "height": 270, + "name": "New iframe" + } + }, + { + "name": "Video", + "description": "", + "type": "element", + "icon": { + "prefix": "fab", + "name": "youtube" + }, + "option": { + "superType": "element", + "type": "video", + "width": 480, + "height": 270, + "name": "New video", + "autoplay": true, + "muted": true, + "loop": true + } + } + ], + "SVG": [{ + "name": "Default", + "description": "", + "type": "default", + "icon": { + "prefix": "fas", + "name": "bezier-curve" + }, + "option": { + "type": "svg", + "superType": "svg", + "name": "New SVG", + "loadType": "svg" + } + }] +} diff --git a/src/pages/Fabric/ImageMapEditor/ImageMapConfigurations.tsx b/src/pages/Fabric/ImageMapEditor/ImageMapConfigurations.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Fabric/ImageMapEditor/ImageMapHeaderToolbar.tsx b/src/pages/Fabric/ImageMapEditor/ImageMapHeaderToolbar.tsx new file mode 100644 index 0000000..d084237 --- /dev/null +++ b/src/pages/Fabric/ImageMapEditor/ImageMapHeaderToolbar.tsx @@ -0,0 +1,185 @@ + + +import React, { useState } from 'react'; +import { useIntl } from '@umijs/max'; +import { Flex } from '../components/flex'; +import { Button } from 'antd'; +import Icon from '@ant-design/icons'; + + +const ImageMapHeaderToolbar : React.FC = (props) => { + // static propTypes = { + // canvasRef: PropTypes.any, + // selectedItem: PropTypes.object, + // }; + + const intl = useIntl(); + const { canvasRef, selectedItem } = props; + const isCropping = canvasRef ? canvasRef.handler?.interactionMode === 'crop' : false; + return ( + <Flex className="rde-editor-header-toolbar-container" flex="1"> + {/* <Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-list"> + <CommonButton + className="rde-action-btn" + shape="circle" + icon="layer-group" + tooltipTitle={i18n.t('action.canvas-list')} + /> + <div className="rde-canvas-list"> + <ImageMapList canvasRef={canvasRef} selectedItem={selectedItem} /> + </div> + </Flex.Item> + <Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-alignment"> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.bringForward()} + icon="angle-up" + tooltipTitle={i18n.t('action.bring-forward')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.sendBackwards()} + icon="angle-down" + tooltipTitle={i18n.t('action.send-backwards')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.bringToFront()} + icon="angle-double-up" + tooltipTitle={i18n.t('action.bring-to-front')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.sendToBack()} + icon="angle-double-down" + tooltipTitle={i18n.t('action.send-to-back')} + /> + </Flex.Item> + <Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-alignment"> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.alignmentHandler.left()} + icon="align-left" + tooltipTitle={i18n.t('action.align-left')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.alignmentHandler.center()} + icon="align-center" + tooltipTitle={i18n.t('action.align-center')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.alignmentHandler.right()} + icon="align-right" + tooltipTitle={i18n.t('action.align-right')} + /> + </Flex.Item> + <Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-group"> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.toGroup()} + icon="object-group" + tooltipTitle={i18n.t('action.object-group')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.toActiveSelection()} + icon="object-ungroup" + tooltipTitle={i18n.t('action.object-ungroup')} + /> + </Flex.Item> + <Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-crop"> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={canvasRef ? !canvasRef.handler?.cropHandler.validType() : true} + onClick={() => canvasRef.handler?.cropHandler.start()} + icon="crop" + tooltipTitle={i18n.t('action.crop')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={canvasRef ? !canvasRef.handler?.cropHandler.cropRect : true} + onClick={() => canvasRef.handler?.cropHandler.finish()} + icon="check" + tooltipTitle={i18n.t('action.crop-save')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={canvasRef ? !canvasRef.handler?.cropHandler.cropRect : true} + onClick={() => canvasRef.handler?.cropHandler.cancel()} + icon="times" + tooltipTitle={i18n.t('action.crop-cancel')} + /> + </Flex.Item> + <Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-operation"> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.saveImage()} + icon="image" + tooltipTitle={i18n.t('action.image-save')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.duplicate()} + icon="clone" + tooltipTitle={i18n.t('action.clone')} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + disabled={isCropping} + onClick={() => canvasRef.handler?.remove()} + icon="trash" + tooltipTitle={i18n.t('action.delete')} + /> + </Flex.Item> */} + <Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-history"> + <Button + className="rde-action-btn" + disabled={isCropping || (canvasRef && !canvasRef.handler?.transactionHandler.undos.length)} + onClick={() => canvasRef.handler?.transactionHandler.undo()} + > + <Icon name="undo-alt" style={{ marginRight: 8 }} /> + Undo + </Button> + <Button + className="rde-action-btn" + disabled={isCropping || (canvasRef && !canvasRef.handler?.transactionHandler.redos.length)} + onClick={() => canvasRef.handler?.transactionHandler.redo()} + > + Redo + <Icon name="redo-alt" style={{ marginLeft: 8 }} /> + </Button> + </Flex.Item> + </Flex> + ); + +} + +export default ImageMapHeaderToolbar; \ No newline at end of file diff --git a/src/pages/Fabric/ImageMapEditor/ImageMapItems.tsx b/src/pages/Fabric/ImageMapEditor/ImageMapItems.tsx new file mode 100644 index 0000000..d7b4176 --- /dev/null +++ b/src/pages/Fabric/ImageMapEditor/ImageMapItems.tsx @@ -0,0 +1,33 @@ +// import { Flex } from "../components/flex"; +import { Button } from 'antd'; +import React, { useEffect, useRef, useState } from 'react'; + +export type ImageMapItemsProps = { + ref: any; + canvasRef: any; + descriptors: Record<string, any>; +}; + +const ImageMapItems: React.FC<ImageMapItemsProps> = (props) => { + const { descriptors } = props; + +// const renderItems = (items) => ( +// <Flex flexWrap="wrap" flexDirection="column" style={{ width: '100%' }}> +// {items.map((item) => renderItem(item))} +// </Flex> +// ); + +console.log(descriptors,'descriptors') + + return ( + <ul> + {descriptors && Object.keys(descriptors).map((key) => ( + <li key={key} style={{marginBottom: 12}}> + <Button type='primary'> {key}</Button> + </li> + ))} + </ul> + ); +}; + +export default ImageMapItems; diff --git a/src/pages/Fabric/ImageMapEditor/ImageMapItems0.js b/src/pages/Fabric/ImageMapEditor/ImageMapItems0.js new file mode 100644 index 0000000..fdf7577 --- /dev/null +++ b/src/pages/Fabric/ImageMapEditor/ImageMapItems0.js @@ -0,0 +1,331 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Collapse, notification, Input, message } from 'antd'; +import classnames from 'classnames'; +import i18n from 'i18next'; + +import { Flex } from '../../components/flex'; +import Icon from '../../components/icon/Icon'; +import Scrollbar from '../../components/common/Scrollbar'; +import CommonButton from '../../components/common/CommonButton'; +import { SVGModal } from '../../components/common'; + +notification.config({ + top: 80, + duration: 2, +}); + +class ImageMapItems extends Component { + static propTypes = { + canvasRef: PropTypes.any, + descriptors: PropTypes.object, + }; + + state = { + activeKey: [], + collapse: false, + textSearch: '', + descriptors: {}, + filteredDescriptors: [], + svgModalVisible: false, + }; + + componentDidMount() { + const { canvasRef } = this.props; + this.waitForCanvasRender(canvasRef); + } + + UNSAFE_componentWillReceiveProps(nextProps) { + if (JSON.stringify(this.props.descriptors) !== JSON.stringify(nextProps.descriptors)) { + const descriptors = Object.keys(nextProps.descriptors).reduce((prev, key) => { + return prev.concat(nextProps.descriptors[key]); + }, []); + this.setState({ + descriptors, + }); + } + } + + shouldComponentUpdate(nextProps, nextState) { + if (JSON.stringify(this.state.descriptors) !== JSON.stringify(nextState.descriptors)) { + return true; + } else if (JSON.stringify(this.state.filteredDescriptors) !== JSON.stringify(nextState.filteredDescriptors)) { + return true; + } else if (this.state.textSearch !== nextState.textSearch) { + return true; + } else if (JSON.stringify(this.state.activeKey) !== JSON.stringify(nextState.activeKey)) { + return true; + } else if (this.state.collapse !== nextState.collapse) { + return true; + } else if (this.state.svgModalVisible !== nextState.svgModalVisible) { + return true; + } + return false; + } + + componentWillUnmount() { + const { canvasRef } = this.props; + this.detachEventListener(canvasRef); + } + + waitForCanvasRender = canvas => { + setTimeout(() => { + if (canvas) { + this.attachEventListener(canvas); + return; + } + const { canvasRef } = this.props; + this.waitForCanvasRender(canvasRef); + }, 5); + }; + + attachEventListener = canvas => { + canvas.canvas.wrapperEl.addEventListener('dragenter', this.events.onDragEnter, false); + canvas.canvas.wrapperEl.addEventListener('dragover', this.events.onDragOver, false); + canvas.canvas.wrapperEl.addEventListener('dragleave', this.events.onDragLeave, false); + canvas.canvas.wrapperEl.addEventListener('drop', this.events.onDrop, false); + }; + + detachEventListener = canvas => { + canvas.canvas.wrapperEl.removeEventListener('dragenter', this.events.onDragEnter); + canvas.canvas.wrapperEl.removeEventListener('dragover', this.events.onDragOver); + canvas.canvas.wrapperEl.removeEventListener('dragleave', this.events.onDragLeave); + canvas.canvas.wrapperEl.removeEventListener('drop', this.events.onDrop); + }; + + /* eslint-disable react/sort-comp, react/prop-types */ + handlers = { + onAddItem: (item, centered) => { + const { canvasRef } = this.props; + if (canvasRef.handler.interactionMode === 'polygon') { + message.info('Already drawing'); + return; + } + const id = fetchUuid(); + const option = Object.assign({}, item.option, { id }); + if (item.option.superType === 'svg' && item.type === 'default') { + this.handlers.onSVGModalVisible(item.option); + return; + } + canvasRef.handler.add(option, centered); + }, + onAddSVG: (option, centered) => { + const { canvasRef } = this.props; + canvasRef.handler.add({ ...option, type: 'svg', superType: 'svg', id: fetchUuid(), name: 'New SVG' }, centered); + this.handlers.onSVGModalVisible(); + }, + onDrawingItem: item => { + const { canvasRef } = this.props; + if (canvasRef.handler.interactionMode === 'polygon') { + message.info('Already drawing'); + return; + } + if (item.option.type === 'line') { + canvasRef.handler.drawingHandler.line.init(); + } else if (item.option.type === 'arrow') { + canvasRef.handler.drawingHandler.arrow.init(); + } else { + canvasRef.handler.drawingHandler.polygon.init(); + } + }, + onChangeActiveKey: activeKey => { + this.setState({ + activeKey, + }); + }, + onCollapse: () => { + this.setState({ + collapse: !this.state.collapse, + }); + }, + onSearchNode: e => { + const filteredDescriptors = this.handlers + .transformList() + .filter(descriptor => descriptor.name.toLowerCase().includes(e.target.value.toLowerCase())); + this.setState({ + textSearch: e.target.value, + filteredDescriptors, + }); + }, + transformList: () => { + return Object.values(this.props.descriptors).reduce((prev, curr) => prev.concat(curr), []); + }, + onSVGModalVisible: () => { + this.setState(prevState => { + return { + svgModalVisible: !prevState.svgModalVisible, + }; + }); + }, + }; + + events = { + onDragStart: (e, item) => { + this.item = item; + const { target } = e; + target.classList.add('dragging'); + }, + onDragOver: e => { + if (e.preventDefault) { + e.preventDefault(); + } + e.dataTransfer.dropEffect = 'copy'; + return false; + }, + onDragEnter: e => { + const { target } = e; + target.classList.add('over'); + }, + onDragLeave: e => { + const { target } = e; + target.classList.remove('over'); + }, + onDrop: e => { + e = e || window.event; + if (e.preventDefault) { + e.preventDefault(); + } + if (e.stopPropagation) { + e.stopPropagation(); + } + const { layerX, layerY } = e; + const dt = e.dataTransfer; + if (dt.types.length && dt.types[0] === 'Files') { + const { files } = dt; + Array.from(files).forEach(file => { + file.uid = fetchUuid(); + const { type } = file; + if (type === 'image/png' || type === 'image/jpeg' || type === 'image/jpg') { + const item = { + option: { + type: 'image', + file, + left: layerX, + top: layerY, + }, + }; + this.handlers.onAddItem(item, false); + } else { + notification.warn({ + message: 'Not supported file type', + }); + } + }); + return false; + } + const option = Object.assign({}, this.item.option, { left: layerX, top: layerY }); + const newItem = Object.assign({}, this.item, { option }); + this.handlers.onAddItem(newItem, false); + return false; + }, + onDragEnd: e => { + this.item = null; + e.target.classList.remove('dragging'); + }, + }; + + renderItems = items => ( + <Flex flexWrap="wrap" flexDirection="column" style={{ width: '100%' }}> + {items.map(item => this.renderItem(item))} + </Flex> + ); + + renderItem = (item, centered) => + item.type === 'drawing' ? ( + <div + key={item.name} + draggable + onClick={e => this.handlers.onDrawingItem(item)} + className="rde-editor-items-item" + style={{ justifyContent: this.state.collapse ? 'center' : null }} + > + <span className="rde-editor-items-item-icon"> + <Icon name={item.icon.name} prefix={item.icon.prefix} style={item.icon.style} /> + </span> + {this.state.collapse ? null : <div className="rde-editor-items-item-text">{item.name}</div>} + </div> + ) : ( + <div + key={item.name} + draggable + onClick={e => this.handlers.onAddItem(item, centered)} + onDragStart={e => this.events.onDragStart(e, item)} + onDragEnd={e => this.events.onDragEnd(e, item)} + className="rde-editor-items-item" + style={{ justifyContent: this.state.collapse ? 'center' : null }} + > + <span className="rde-editor-items-item-icon"> + <Icon name={item.icon.name} prefix={item.icon.prefix} style={item.icon.style} /> + </span> + {this.state.collapse ? null : <div className="rde-editor-items-item-text">{item.name}</div>} + </div> + ); + + render() { + const { descriptors } = this.props; + const { collapse, textSearch, filteredDescriptors, activeKey, svgModalVisible, svgOption } = this.state; + const className = classnames('rde-editor-items', { + minimize: collapse, + }); + return ( + <div className={className}> + <Flex flex="1" flexDirection="column" style={{ height: '100%' }}> + <Flex justifyContent="center" alignItems="center" style={{ height: 40 }}> + <CommonButton + icon={collapse ? 'angle-double-right' : 'angle-double-left'} + shape="circle" + className="rde-action-btn" + style={{ margin: '0 4px' }} + onClick={this.handlers.onCollapse} + /> + {collapse ? null : ( + <Input + style={{ margin: '8px' }} + placeholder={i18n.t('action.search-list')} + onChange={this.handlers.onSearchNode} + value={textSearch} + allowClear + /> + )} + </Flex> + <Scrollbar> + <Flex flex="1" style={{ overflowY: 'hidden' }}> + {(textSearch.length && this.renderItems(filteredDescriptors)) || + (collapse ? ( + <Flex + flexWrap="wrap" + flexDirection="column" + style={{ width: '100%' }} + justifyContent="center" + > + {this.handlers.transformList().map(item => this.renderItem(item))} + </Flex> + ) : ( + <Collapse + style={{ width: '100%' }} + bordered={false} + activeKey={activeKey.length ? activeKey : Object.keys(descriptors)} + onChange={this.handlers.onChangeActiveKey} + > + {Object.keys(descriptors).map(key => ( + <Collapse.Panel key={key} header={key} showArrow={!collapse}> + {this.renderItems(descriptors[key])} + </Collapse.Panel> + ))} + </Collapse> + ))} + </Flex> + </Scrollbar> + </Flex> + <SVGModal + visible={svgModalVisible} + onOk={this.handlers.onAddSVG} + onCancel={this.handlers.onSVGModalVisible} + option={svgOption} + /> + </div> + ); + } +} + +export default ImageMapItems; diff --git a/src/pages/Fabric/ImageMapEditor/index.tsx b/src/pages/Fabric/ImageMapEditor/index.tsx new file mode 100644 index 0000000..7a86d4f --- /dev/null +++ b/src/pages/Fabric/ImageMapEditor/index.tsx @@ -0,0 +1,258 @@ +// import { useUuid } from '@/hooks/useUuid'; +import { ProCard } from '@ant-design/pro-components'; +import { useIntl } from '@umijs/max'; +import { Button } from 'antd'; +import React, { useEffect, useRef, useState } from 'react'; +// import Canvas from '../canvas/Canvas'; +import { currJson1 } from '@/testData/fabricGroup1'; +import { bgImageData } from '@/testData/testSvg'; +import { fabric } from 'fabric'; +import { ColumnDrawer } from './ColumnDrawer'; + +export const ModelCategoryColumns = [ + { + title: '模型id', + dataIndex: 'modelId', + }, + { + title: '模型状态', + dataIndex: 'label', + }, + { + title: '模型名称', + dataIndex: 'des', + }, +]; +const ImageMapEditor: React.FC = () => { + const intl = useIntl(); + const canvasRef = useRef(null); + const itemsRef = useRef(null); + const [cvs, setCanvas] = useState(null); + const [descriptors, setDescriptors] = useState<Record<string, any>>({}); + const [category_fk_id_open, set_category_fk_id_open] = useState(false); + const [currentModelUserProperty, setCurrentModelUserProperty] = useState<Record<string, any>>({}); + + const [changeId, setChangeId] = useState<string[]>([]); + + const [clipPathData, setClipPathData] = useState({ + width: 1200, // 宽 + height: 900, // 高 + }); + const [jsonData, setJsonData] = useState<Record<string, any>>({}); + + /*test */ + // const { fetchUuid } = useUuid(); + + function changeModelStatus() { + setChangeId(['2', '3']); + } + + const handle_category_fk_id = (id: any) => { + if (category_fk_id_open) { + set_category_fk_id_open(false); + } + }; + + useEffect(() => { + const canvasObject = new fabric.Canvas(canvasRef.current); + canvasObject.setBackgroundImage(bgImageData.src, canvasObject.renderAll.bind(canvasObject), { + width: clipPathData.width, + height: clipPathData.height, + originX: 'left', + originY: 'top', + }); + canvasObject.loadFromJSON(JSON.stringify(currJson1), () => { + canvasObject.renderAll(); + // const groupObjectList = canvasObject.getObjects() + + // const groupObject = canvasObject.getObjects()[0]; + + // 选中组合对象 + // console.log(groupObject, 'groupObject', canvasObject.getObjects()); + // 注册事件监听器 + canvasObject.on('mouse:up', (event) => { + // 获取事件的目标对象 + const targetObject = event.target; + // 检查目标对象是否为组合对象 + if (targetObject && targetObject?.userProperty) { + console.log('Group selected:', targetObject); + setCurrentModelUserProperty(targetObject.userProperty); + set_category_fk_id_open(true); + // canvasObject.setActiveObject(groupObject); + // canvasObject.requestRenderAll(); + // 在这里可以执行你想要的操作 + // 添加缩放动画 + // targetObject.animate('scaleX', '+=0.1', { + // duration: 500, // 动画持续时间,单位毫秒 + // onChange: canvasObject.renderAll.bind(canvasObject), // 在动画过程中实时渲染画布 + // onComplete: () => { + // console.log('Animation complete!'); + // // 在动画完成后执行其他操作 + // }, + // }); + // targetObject.animate('scaleY', '+=0.1', { + // duration: 500, // 动画持续时间,单位毫秒 + // onChange: canvasObject.renderAll.bind(canvasObject), // 在动画过程中实时渲染画布 + // onComplete: () => { + // console.log('Animation complete!'); + // // 在动画完成后执行其他操作 + // }, + // }); + } + }); + + + // 设置目标的速度和方向 + const velocity = { + // scaleX: 0.1, // 0 ~ 1 + // scaleY: 0.1, // 0 ~ 1 + opacity: 0.1, // 0 ~ 1 + }; + + + function animate() { + canvasObject + .getObjects() + .concat() + .forEach(function (obj) { + obj.opacity += velocity.opacity; + + if( obj.opacity <= 0.5 || obj.opacity >= 1){ + velocity.opacity = -velocity.opacity; + } + // obj.rotate(obj.get('angle') + 1); + // 位移 + // obj.left += velocity.x; + // obj.top += velocity.y; + // // 碰撞检测 + // if (obj.left <= 0 || obj.left + obj.width >= clipPathData.width) { + // velocity.x = -velocity.x; // 水平方向反弹 + // } + + // if (obj.top <= 0 || obj.top + obj.height >= clipPathData.height) { + // velocity.y = -velocity.y; // 垂直方向反弹 + // }x + // if (obj.left > 900 || obj.left < -100 || obj.top > 500) { + // newCanvas.remove(obj); + // } + // else { + // } + }); + canvasObject.renderAll(); + fabric.util.requestAnimFrame(animate); + } + + + if (changeId && changeId.length) { + canvasObject + .getObjects().forEach(item=>{ + if(changeId.includes(item?.userProperty?.id) ){ + const groupObject = item + // 选中组合对象 + // canvasObject.setActiveObject(groupObject); // 可以改变 selectable 值 + canvasObject.requestRenderAll(); + // 获取组合对象中的子对象 + const objectsInGroup = groupObject.getObjects(); + // 遍历子对象找到要修改的子对象 + const objectToModify = objectsInGroup.find((obj) => obj.get('type') === 'circle'); + const objectToModify2 = objectsInGroup.find((obj) => obj.get('type') === 'i-text'); + // + if (groupObject?.userProperty) { + groupObject.set({ + userProperty: { + ...groupObject?.userProperty, + status: '1', + }, + }); + } + + // 修改子对象的属性 + if (objectToModify) { + objectToModify.set({ + fill: 'rgba(248,9,3,0.94)', + stroke: 'rgba(255,243,47,1)', + // height: 60, + // 添加其他属性... + }); + // 重新渲染Canvas + canvasObject.renderAll(); + } + if (objectToModify2) { + objectToModify2.set({ + text: '警告', + }); + // 重新渲染Canvas + canvasObject.renderAll(); + } + } + }) + // 获取组合对象(选中目标对象) + // const groupObject = canvasObject + // .getObjects() + // .find((item) => item?.userProperty?.id === changeId); + // console.log(groupObject, 'groupObject', canvasObject.getObjects()); + + } + + // 获取组合对象中的属性 + // const properties = groupObject.getObjects().map(obj => { + // return { + // type: obj.get('type'), + // width: obj.get('width'), + // height: obj.get('height'), + // fill: obj.get('fill'), + // left: obj.get('left'), + // top: obj.get('top') + // // 添加其他属性... + // }; + // }); + + // console.log('Properties of the selected group:', properties); + }); + return () => { + canvasObject.dispose(); + }; + }, [changeId]); + + useEffect(() => { + // TODO_3 需要加个loading效果 + import('./Descriptors.json').then((descriptors) => { + setDescriptors(descriptors); + }); + // console.log(fetchUuid(), 'fetchUuid'); + }, []); + + return ( + <ProCard + gutter={24} + extra={ + <> + <Button type="primary" onClick={changeModelStatus}> + 切换状态 + </Button> + </> + } + > + {/* <ProCard colSpan={4}> + <ImageMapItems ref={itemsRef} canvasRef={canvasRef} descriptors={descriptors} /> + </ProCard> */} + <ProCard colSpan={24} style={{ padding: 0, margin: 0 }} bodyStyle={{ padding: 0, margin: 0 }}> + <canvas + ref={canvasRef} + {...clipPathData} + style={{ border: '1px dashed #eee' }} + ></canvas> + </ProCard> + + <ColumnDrawer + handleDrawer={handle_category_fk_id} + isShowDetail={category_fk_id_open} + columns={ModelCategoryColumns} + currentRow={currentModelUserProperty} + /> + </ProCard> + // 属性预览 + ); +}; + +export default ImageMapEditor; diff --git a/src/pages/Fabric/ImageMapEditor/index0.js b/src/pages/Fabric/ImageMapEditor/index0.js new file mode 100644 index 0000000..1a65392 --- /dev/null +++ b/src/pages/Fabric/ImageMapEditor/index0.js @@ -0,0 +1,829 @@ +import { Badge, Button, Menu, Popconfirm } from 'antd'; +import i18n from 'i18next'; +import {debounce } from 'lodash'; +import React, { Component } from 'react'; +import Canvas from '../../canvas/Canvas'; +import CommonButton from '../../components/common/CommonButton'; +import { Content } from '../../components/layout'; +import SandBox from '../../components/sandbox/SandBox'; +import '../../libs/fontawesome-5.2.0/css/all.css'; +import '../../styles/index.less'; +import ImageMapConfigurations from './ImageMapConfigurations'; +import ImageMapFooterToolbar from './ImageMapFooterToolbar'; +import ImageMapHeaderToolbar from './ImageMapHeaderToolbar'; +import ImageMapItems from './ImageMapItems'; +import ImageMapPreview from './ImageMapPreview'; +import ImageMapTitle from './ImageMapTitle'; +import {json1} from '../../testData/01' + +const propertiesToInclude = [ + 'id', + 'name', + 'locked', + 'file', + 'src', + 'link', + 'tooltip', + 'animation', + 'layout', + 'workareaWidth', + 'workareaHeight', + 'videoLoadType', + 'autoplay', + 'shadow', + 'muted', + 'loop', + 'code', + 'icon', + 'userProperty', + 'trigger', + 'configuration', + 'superType', + 'points', + 'svg', + 'loadType', +]; + +// 右侧展示栏 +const defaultOption = { + stroke: 'rgba(255, 255, 255, 0)', + strokeUniform: true, + resource: {}, + link: { + enabled: false, + type: 'resource', + state: 'new', + dashboard: {}, + }, + tooltip: { + enabled: true, + type: 'resource', + template: '<div>{{message.name}}</div>', + }, + animation: { + type: 'none', + loop: true, + autoplay: true, + duration: 1000, + }, + userProperty: {}, + trigger: { + enabled: false, + type: 'alarm', + script: 'return message.value > 0;', + effect: 'style', + }, +}; + +class ImageMapEditor extends Component { + state = { + selectedItem: null, + zoomRatio: 1, + preview: false, + loading: false, + progress: 0, + animations: [], + styles: [], + dataSources: [], + editing: false, + descriptors: {}, + objects: undefined, + }; + + componentDidMount() { + this.showLoading(true); + import('./Descriptors.json').then(descriptors => { + this.setState( + { + descriptors, + }, + () => { + this.showLoading(false); + }, + ); + }); + this.setState({ + selectedItem: null, + }); + } + + canvasHandlers = { + onAdd: target => { + const { editing } = this.state; + this.forceUpdate(); + if (!editing) { + this.changeEditing(true); + } + if (target.type === 'activeSelection') { + this.canvasHandlers.onSelect(null); + return; + } + this.canvasRef.handler.select(target); + }, + onSelect: target => { + const { selectedItem } = this.state; + if (target && target.id && target.id !== 'workarea' && target.type !== 'activeSelection') { + if (selectedItem && target.id === selectedItem.id) { + return; + } + this.canvasRef.handler.getObjects().forEach(obj => { + if (obj) { + this.canvasRef.handler.animationHandler.resetAnimation(obj, true); + } + }); + this.setState({ + selectedItem: target, + }); + return; + } + this.canvasRef.handler.getObjects().forEach(obj => { + if (obj) { + this.canvasRef.handler.animationHandler.resetAnimation(obj, true); + } + }); + this.setState({ + selectedItem: null, + }); + }, + onRemove: () => { + const { editing } = this.state; + if (!editing) { + this.changeEditing(true); + } + this.canvasHandlers.onSelect(null); + }, + onModified: debounce(() => { + const { editing } = this.state; + this.forceUpdate(); + if (!editing) { + this.changeEditing(true); + } + }, 300), + onZoom: zoom => { + this.setState({ + zoomRatio: zoom, + }); + }, + onChange: (selectedItem, changedValues, allValues) => { + const { editing } = this.state; + if (!editing) { + this.changeEditing(true); + } + const changedKey = Object.keys(changedValues)[0]; + const changedValue = changedValues[changedKey]; + if (allValues.workarea) { + this.canvasHandlers.onChangeWokarea(changedKey, changedValue, allValues.workarea); + return; + } + if (changedKey === 'width' || changedKey === 'height') { + this.canvasRef.handler.scaleToResize(allValues.width, allValues.height); + return; + } + if (changedKey === 'angle') { + this.canvasRef.handler.rotate(allValues.angle); + return; + } + if (changedKey === 'locked') { + this.canvasRef.handler.setObject({ + lockMovementX: changedValue, + lockMovementY: changedValue, + hasControls: !changedValue, + hoverCursor: changedValue ? 'pointer' : 'move', + editable: !changedValue, + locked: changedValue, + }); + return; + } + if (changedKey === 'file' || changedKey === 'src' || changedKey === 'code') { + if (selectedItem.type === 'image') { + this.canvasRef.handler.setImageById(selectedItem.id, changedValue); + } else if (selectedItem.superType === 'element') { + this.canvasRef.handler.elementHandler.setById(selectedItem.id, changedValue); + } + return; + } + if (changedKey === 'link') { + const link = Object.assign({}, defaultOption.link, allValues.link); + this.canvasRef.handler.set(changedKey, link); + return; + } + if (changedKey === 'tooltip') { + const tooltip = Object.assign({}, defaultOption.tooltip, allValues.tooltip); + this.canvasRef.handler.set(changedKey, tooltip); + return; + } + if (changedKey === 'animation') { + const animation = Object.assign({}, defaultOption.animation, allValues.animation); + this.canvasRef.handler.set(changedKey, animation); + return; + } + if (changedKey === 'icon') { + const { unicode, styles } = changedValue[Object.keys(changedValue)[0]]; + const uni = parseInt(unicode, 16); + if (styles[0] === 'brands') { + this.canvasRef.handler.set('fontFamily', 'Font Awesome 5 Brands'); + } else if (styles[0] === 'regular') { + this.canvasRef.handler.set('fontFamily', 'Font Awesome 5 Regular'); + } else { + this.canvasRef.handler.set('fontFamily', 'Font Awesome 5 Free'); + } + this.canvasRef.handler.set('text', String.fromCodePoint(uni)); + this.canvasRef.handler.set('icon', changedValue); + return; + } + if (changedKey === 'shadow') { + if (allValues.shadow.enabled) { + if ('blur' in allValues.shadow) { + this.canvasRef.handler.setShadow(allValues.shadow); + } else { + this.canvasRef.handler.setShadow({ + enabled: true, + blur: 15, + offsetX: 10, + offsetY: 10, + }); + } + } else { + this.canvasRef.handler.setShadow(null); + } + return; + } + if (changedKey === 'fontWeight') { + this.canvasRef.handler.set(changedKey, changedValue ? 'bold' : 'normal'); + return; + } + if (changedKey === 'fontStyle') { + this.canvasRef.handler.set(changedKey, changedValue ? 'italic' : 'normal'); + return; + } + if (changedKey === 'textAlign') { + this.canvasRef.handler.set(changedKey, Object.keys(changedValue)[0]); + return; + } + if (changedKey === 'trigger') { + const trigger = Object.assign({}, defaultOption.trigger, allValues.trigger); + this.canvasRef.handler.set(changedKey, trigger); + return; + } + if (changedKey === 'filters') { + const filterKey = Object.keys(changedValue)[0]; + const filterValue = allValues.filters[filterKey]; + if (filterKey === 'gamma') { + const rgb = [filterValue.r, filterValue.g, filterValue.b]; + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, { + gamma: rgb, + }); + return; + } + if (filterKey === 'brightness') { + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, { + brightness: filterValue.brightness, + }); + return; + } + if (filterKey === 'contrast') { + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, { + contrast: filterValue.contrast, + }); + return; + } + if (filterKey === 'saturation') { + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, { + saturation: filterValue.saturation, + }); + return; + } + if (filterKey === 'hue') { + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, { + rotation: filterValue.rotation, + }); + return; + } + if (filterKey === 'noise') { + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, { + noise: filterValue.noise, + }); + return; + } + if (filterKey === 'pixelate') { + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, { + blocksize: filterValue.blocksize, + }); + return; + } + if (filterKey === 'blur') { + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, { + value: filterValue.value, + }); + return; + } + this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey]); + return; + } + if (changedKey === 'chartOption') { + try { + const sandbox = new SandBox(); + const compiled = sandbox.compile(changedValue); + const { animations, styles } = this.state; + const chartOption = compiled(3, animations, styles, selectedItem.userProperty); + selectedItem.setChartOptionStr(changedValue); + this.canvasRef.handler.elementHandler.setById(selectedItem.id, chartOption); + } catch (error) { + console.error(error); + } + return; + } + this.canvasRef.handler.set(changedKey, changedValue); + }, + onChangeWokarea: (changedKey, changedValue, allValues) => { + if (changedKey === 'layout') { + this.canvasRef.handler.workareaHandler.setLayout(changedValue); + return; + } + if (changedKey === 'file' || changedKey === 'src') { + this.canvasRef.handler.workareaHandler.setImage(changedValue); + return; + } + if (changedKey === 'width' || changedKey === 'height') { + this.canvasRef.handler.originScaleToResize( + this.canvasRef.handler.workarea, + allValues.width, + allValues.height, + ); + this.canvasRef.canvas.centerObject(this.canvasRef.handler.workarea); + return; + } + this.canvasRef.handler.workarea.set(changedKey, changedValue); + this.canvasRef.canvas.requestRenderAll(); + }, + onTooltip: (ref, target) => { + const value = Math.random() * 10 + 1; + return ( + <div> + <div> + <div> + <Button>{target.id}</Button> + </div> + <Badge count={value} /> + </div> + </div> + ); + }, + onClick: (canvas, target) => { + const { link } = target; + if (link.state === 'current') { + document.location.href = link.url; + return; + } + window.open(link.url); + }, + onContext: (ref, event, target) => { + if ((target && target.id === 'workarea') || !target) { + const { layerX: left, layerY: top } = event; + return ( + <Menu> + <Menu.SubMenu key="add" style={{ width: 120 }} title={i18n.t('action.add')}> + {this.transformList().map(item => { + const option = Object.assign({}, item.option, { left, top }); + const newItem = Object.assign({}, item, { option }); + return ( + <Menu.Item style={{ padding: 0 }} key={item.name}> + {this.itemsRef.renderItem(newItem, false)} + </Menu.Item> + ); + })} + </Menu.SubMenu> + </Menu> + ); + } + if (target.type === 'activeSelection') { + return ( + <Menu> + <Menu.Item + onClick={() => { + this.canvasRef.handler.toGroup(); + }} + > + {i18n.t('action.object-group')} + </Menu.Item> + <Menu.Item + onClick={() => { + this.canvasRef.handler.duplicate(); + }} + > + {i18n.t('action.clone')} + </Menu.Item> + <Menu.Item + onClick={() => { + this.canvasRef.handler.remove(); + }} + > + {i18n.t('action.delete')} + </Menu.Item> + </Menu> + ); + } + if (target.type === 'group') { + return ( + <Menu> + <Menu.Item + onClick={() => { + this.canvasRef.handler.toActiveSelection(); + }} + > + {i18n.t('action.object-ungroup')} + </Menu.Item> + <Menu.Item + onClick={() => { + this.canvasRef.handler.duplicate(); + }} + > + {i18n.t('action.clone')} + </Menu.Item> + <Menu.Item + onClick={() => { + this.canvasRef.handler.remove(); + }} + > + {i18n.t('action.delete')} + </Menu.Item> + </Menu> + ); + } + return ( + <Menu> + <Menu.Item + onClick={() => { + this.canvasRef.handler.duplicateById(target.id); + }} + > + {i18n.t('action.clone')} + </Menu.Item> + <Menu.Item + onClick={() => { + this.canvasRef.handler.removeById(target.id); + }} + > + {i18n.t('action.delete')} + </Menu.Item> + </Menu> + ); + }, + onTransaction: transaction => { + this.forceUpdate(); + }, + }; + + handlers = { + onChangePreview: checked => { + let data; + if (this.canvasRef) { + data = this.canvasRef.handler.exportJSON().filter(obj => { + if (!obj.id) { + return false; + } + return true; + }); + } + this.setState({ + preview: typeof checked === 'object' ? false : checked, + objects: data, + }); + }, + onProgress: progress => { + this.setState({ + progress, + }); + }, + onImport: files => { + console.log(files,'onImport_files') + if (files) { + this.showLoading(true); + setTimeout(() => { + const reader = new FileReader(); + reader.onprogress = e => { + if (e.lengthComputable) { + const progress = parseInt((e.loaded / e.total) * 100, 10); + this.handlers.onProgress(progress); + } + }; + reader.onload = e => { + const { objects, animations, styles, dataSources } = JSON.parse(e.target.result); + this.setState({ + animations, + styles, + dataSources, + }); + if (objects) { + this.canvasRef.handler.clear(true); + const data = objects.filter(obj => { + if (!obj.id) { + return false; + } + return true; + }); + this.canvasRef.handler.importJSON(data); + } + }; + reader.onloadend = () => { + this.showLoading(false); + }; + reader.onerror = () => { + this.showLoading(false); + }; + reader.readAsText(files[0]); + }, 500); + } + }, + onUpload: () => { + const inputEl = document.createElement('input'); + inputEl.accept = '.json'; + inputEl.type = 'file'; + inputEl.hidden = true; + inputEl.onchange = e => { + this.handlers.onImport(e.target.files); + }; + document.body.appendChild(inputEl); // required for firefox + inputEl.click(); + inputEl.remove(); + }, + onUploadTest: () => { + const { objects, animations, styles, dataSources } = json1; + this.setState({ + animations, + styles, + dataSources, + }); + if (objects) { + this.canvasRef.handler.clear(true); + const data = objects.filter(obj => { + if (!obj.id) { + return false; + } + return true; + }); + this.canvasRef.handler.importJSON(data); + } + // const inputEl = document.createElement('input'); + // inputEl.accept = '.json'; + // inputEl.type = 'file'; + // inputEl.hidden = true; + // inputEl.onchange = e => { + // console.log(e,'onUploadTest_e') + // this.handlers.onImport(e.target.files); + // }; + // document.body.appendChild(inputEl); // required for firefox + // inputEl.click(); + // inputEl.remove(); + }, + onDownload: () => { + this.showLoading(true); + const objects = this.canvasRef.handler.exportJSON().filter(obj => { + if (!obj.id) { + return false; + } + return true; + }); + const { animations, styles, dataSources } = this.state; + const exportDatas = { + objects, + animations, + styles, + dataSources, + }; + const anchorEl = document.createElement('a'); + anchorEl.href = `data:text/json;charset=utf-8,${encodeURIComponent( + JSON.stringify(exportDatas, null, '\t'), + )}`; + anchorEl.download = `${this.canvasRef.handler.workarea.name || 'sample'}.json`; + document.body.appendChild(anchorEl); // required for firefox + anchorEl.click(); + anchorEl.remove(); + this.showLoading(false); + }, + onChangeAnimations: animations => { + if (!this.state.editing) { + this.changeEditing(true); + } + this.setState({ + animations, + }); + }, + onChangeStyles: styles => { + if (!this.state.editing) { + this.changeEditing(true); + } + this.setState({ + styles, + }); + }, + onChangeDataSources: dataSources => { + if (!this.state.editing) { + this.changeEditing(true); + } + this.setState({ + dataSources, + }); + }, + onSaveImage: () => { + this.canvasRef.handler.saveCanvasImage(); + }, + }; + + transformList = () => { + return Object.values(this.state.descriptors).reduce((prev, curr) => prev.concat(curr), []); + }; + + showLoading = loading => { + this.setState({ + loading, + }); + }; + + changeEditing = editing => { + this.setState({ + editing, + }); + }; + + render() { + const { + preview, + selectedItem, + zoomRatio, + loading, + progress, + animations, + styles, + dataSources, + editing, + descriptors, + objects, + } = this.state; + const { + onAdd, + onRemove, + onSelect, + onModified, + onChange, + onZoom, + onTooltip, + onClick, + onContext, + onTransaction, + } = this.canvasHandlers; + const { + onChangePreview, + onDownload, + onUpload, + onUploadTest, + onChangeAnimations, + onChangeStyles, + onChangeDataSources, + onSaveImage, + } = this.handlers; + // 操作栏 + const action = ( + <React.Fragment> + <CommonButton + className="rde-action-btn" + shape="circle" + icon="object-group" + tooltipTitle={'矩形文字'} + tooltipPlacement="bottomRight" + onClick={onUploadTest} + /> + <CommonButton + className="rde-action-btn" + shape="circle" + icon="file-download" + disabled={!editing} + tooltipTitle={i18n.t('action.download')} + onClick={onDownload} + tooltipPlacement="bottomRight" + /> + {editing ? ( + <Popconfirm + title={i18n.t('imagemap.imagemap-editing-confirm')} + okText={i18n.t('action.ok')} + cancelText={i18n.t('action.cancel')} + onConfirm={onUpload} + placement="bottomRight" + > + <CommonButton + className="rde-action-btn" + shape="circle" + icon="file-upload" + tooltipTitle={i18n.t('action.upload')} + tooltipPlacement="bottomRight" + /> + </Popconfirm> + ) : ( + <CommonButton + className="rde-action-btn" + shape="circle" + icon="file-upload" + tooltipTitle={i18n.t('action.upload')} + tooltipPlacement="bottomRight" + onClick={onUpload} + /> + )} + <CommonButton + className="rde-action-btn" + shape="circle" + icon="image" + tooltipTitle={i18n.t('action.image-save')} + onClick={onSaveImage} + tooltipPlacement="bottomRight" + /> + </React.Fragment> + ); + const titleContent = ( + <React.Fragment> + <span>{i18n.t('imagemap.imagemap-editor')}</span> + </React.Fragment> + ); + const title = <ImageMapTitle title={titleContent} action={action} />; + const content = ( + <div className="rde-editor"> + <ImageMapItems + ref={c => { + this.itemsRef = c; + }} + canvasRef={this.canvasRef} + descriptors={descriptors} + /> + <div className="rde-editor-canvas-container"> + <div className="rde-editor-header-toolbar"> + <ImageMapHeaderToolbar + canvasRef={this.canvasRef} + selectedItem={selectedItem} + onSelect={onSelect} + /> + </div> + <div + ref={c => { + this.container = c; + }} + className="rde-editor-canvas" + > + <Canvas + ref={c => { + this.canvasRef = c; + }} + className="rde-canvas" + minZoom={1} + maxZoom={500} + objectOption={defaultOption} + propertiesToInclude={propertiesToInclude} + onModified={onModified} + onAdd={onAdd} + onRemove={onRemove} + onSelect={onSelect} + onZoom={onZoom} + onTooltip={onTooltip} + onClick={onClick} + onContext={onContext} + onTransaction={onTransaction} + keyEvent={{ + transaction: true, + }} + canvasOption={{ + selectionColor: 'rgba(8, 151, 156, 0.3)', + }} + /> + </div> + <div className="rde-editor-footer-toolbar"> + <ImageMapFooterToolbar + canvasRef={this.canvasRef} + preview={preview} + onChangePreview={onChangePreview} + zoomRatio={zoomRatio} + /> + </div> + </div> + <ImageMapConfigurations + canvasRef={this.canvasRef} + onChange={onChange} + selectedItem={selectedItem} + onChangeAnimations={onChangeAnimations} + onChangeStyles={onChangeStyles} + onChangeDataSources={onChangeDataSources} + animations={animations} + styles={styles} + dataSources={dataSources} + /> + <ImageMapPreview + preview={preview} + onChangePreview={onChangePreview} + onTooltip={onTooltip} + onClick={onClick} + objects={objects} + /> + </div> + ); + return <Content title={title} content={content} loading={loading} className="" />; + } +} + +export default ImageMapEditor; diff --git a/src/pages/Fabric/ImageMapEditor/index1.tsx b/src/pages/Fabric/ImageMapEditor/index1.tsx new file mode 100644 index 0000000..b7cdc47 --- /dev/null +++ b/src/pages/Fabric/ImageMapEditor/index1.tsx @@ -0,0 +1,318 @@ +import { useUuid } from '@/hooks/useUuid'; +import { ProCard } from '@ant-design/pro-components'; +import { useIntl } from '@umijs/max'; +import { Button } from 'antd'; +import React, { useEffect, useRef, useState } from 'react'; +// import Canvas from '../canvas/Canvas'; +import { currJson1 } from '@/testData/fabricGroup1'; +import { bgImageData } from '@/testData/testSvg'; +import { fabric } from 'fabric'; +import { ColumnDrawer } from './ColumnDrawer'; +// import CustomCanvas from '../canvas/CustomCanvas'; +// static data +const propertiesToInclude = [ + 'id', + 'name', + 'locked', + 'file', + 'src', + 'link', + 'tooltip', + 'animation', + 'layout', + 'workareaWidth', + 'workareaHeight', + 'videoLoadType', + 'autoplay', + 'shadow', + 'muted', + 'loop', + 'code', + 'icon', + 'userProperty', + 'trigger', + 'configuration', + 'superType', + 'points', + 'svg', + 'loadType', +]; + +// 右侧展示栏 +const defaultOption = { + // 动画 + animation: { + type: 'none', + loop: true, + autoplay: true, + duration: 1000, + }, + // 用户属性 + userProperty: {}, +}; + +export const ModelCategoryColumns = [ + { + title: '模型id', + dataIndex: 'modelId', + }, + { + title: '模型状态', + dataIndex: 'label', + }, + { + title: '模型名称', + dataIndex: 'des', + }, +]; +const ImageMapEditor: React.FC = () => { + const intl = useIntl(); + + const canvasRef = useRef(null); + const itemsRef = useRef(null); + const [cvs, setCanvas] = useState(null); + const [descriptors, setDescriptors] = useState<Record<string, any>>({}); + const [category_fk_id_open, set_category_fk_id_open] = useState(false); + const [currentModelUserProperty, setCurrentModelUserProperty] = useState<Record<string, any>>({}); + + const [changeId, setChangeId] = useState<string[]>([]); + + const [clipPathData, setClipPathData] = useState({ + width: 1200, // 宽 + height: 900, // 高 + }); + const [jsonData, setJsonData] = useState<Record<string, any>>({}); + + /*test */ + const { fetchUuid } = useUuid(); + + function changeModelStatus() { + setChangeId(['2', '3']); + } + + const handle_category_fk_id = (id: any) => { + if (category_fk_id_open) { + set_category_fk_id_open(false); + } + }; + + useEffect(() => { + const canvasObject = new fabric.Canvas(canvasRef.current); + canvasObject.setBackgroundImage(bgImageData.src, canvasObject.renderAll.bind(canvasObject), { + width: clipPathData.width, + height: clipPathData.height, + originX: 'left', + originY: 'top', + }); + canvasObject.loadFromJSON(JSON.stringify(currJson1), () => { + canvasObject.renderAll(); + // const groupObjectList = canvasObject.getObjects() + + // const groupObject = canvasObject.getObjects()[0]; + + // 选中组合对象 + // console.log(groupObject, 'groupObject', canvasObject.getObjects()); + // 注册事件监听器 + canvasObject.on('mouse:up', (event) => { + // 获取事件的目标对象 + const targetObject = event.target; + // 检查目标对象是否为组合对象 + if (targetObject && targetObject?.userProperty) { + console.log('Group selected:', targetObject); + setCurrentModelUserProperty(targetObject.userProperty); + set_category_fk_id_open(true); + // canvasObject.setActiveObject(groupObject); + // canvasObject.requestRenderAll(); + // 在这里可以执行你想要的操作 + // 添加缩放动画 + // targetObject.animate('scaleX', '+=0.1', { + // duration: 500, // 动画持续时间,单位毫秒 + // onChange: canvasObject.renderAll.bind(canvasObject), // 在动画过程中实时渲染画布 + // onComplete: () => { + // console.log('Animation complete!'); + // // 在动画完成后执行其他操作 + // }, + // }); + // targetObject.animate('scaleY', '+=0.1', { + // duration: 500, // 动画持续时间,单位毫秒 + // onChange: canvasObject.renderAll.bind(canvasObject), // 在动画过程中实时渲染画布 + // onComplete: () => { + // console.log('Animation complete!'); + // // 在动画完成后执行其他操作 + // }, + // }); + } + }); + + + // 设置目标的速度和方向 + const velocity = { + // scaleX: 0.1, // 0 ~ 1 + // scaleY: 0.1, // 0 ~ 1 + opacity: 0.1, // 0 ~ 1 + }; + + + function animate() { + canvasObject + .getObjects() + .concat() + .forEach(function (obj) { + obj.opacity += velocity.opacity; + + if( obj.opacity <= 0.5 || obj.opacity >= 1){ + velocity.opacity = -velocity.opacity; + } + // obj.rotate(obj.get('angle') + 1); + // 位移 + // obj.left += velocity.x; + // obj.top += velocity.y; + // // 碰撞检测 + // if (obj.left <= 0 || obj.left + obj.width >= clipPathData.width) { + // velocity.x = -velocity.x; // 水平方向反弹 + // } + + // if (obj.top <= 0 || obj.top + obj.height >= clipPathData.height) { + // velocity.y = -velocity.y; // 垂直方向反弹 + // }x + // if (obj.left > 900 || obj.left < -100 || obj.top > 500) { + // newCanvas.remove(obj); + // } + // else { + // } + }); + canvasObject.renderAll(); + fabric.util.requestAnimFrame(animate); + } + // setTimeout(() => { + // fabric.util.requestAnimFrame(animate); + // }, 1000); + + if (changeId && changeId.length) { + canvasObject + .getObjects().forEach(item=>{ + if(changeId.includes(item?.userProperty?.id) ){ + const groupObject = item + // 选中组合对象 + // canvasObject.setActiveObject(groupObject); // 可以改变 selectable 值 + canvasObject.requestRenderAll(); + // 获取组合对象中的子对象 + const objectsInGroup = groupObject.getObjects(); + // 遍历子对象找到要修改的子对象 + const objectToModify = objectsInGroup.find((obj) => obj.get('type') === 'circle'); + const objectToModify2 = objectsInGroup.find((obj) => obj.get('type') === 'i-text'); + // + if (groupObject?.userProperty) { + groupObject.set({ + userProperty: { + ...groupObject?.userProperty, + status: '1', + }, + }); + } + + // 修改子对象的属性 + if (objectToModify) { + objectToModify.set({ + fill: 'rgba(248,9,3,0.94)', + stroke: 'rgba(255,243,47,1)', + // height: 60, + // 添加其他属性... + }); + // 重新渲染Canvas + canvasObject.renderAll(); + } + if (objectToModify2) { + objectToModify2.set({ + text: '警告', + }); + // 重新渲染Canvas + canvasObject.renderAll(); + } + } + }) + // 获取组合对象(选中目标对象) + // const groupObject = canvasObject + // .getObjects() + // .find((item) => item?.userProperty?.id === changeId); + // console.log(groupObject, 'groupObject', canvasObject.getObjects()); + + } + + // 获取组合对象中的属性 + // const properties = groupObject.getObjects().map(obj => { + // return { + // type: obj.get('type'), + // width: obj.get('width'), + // height: obj.get('height'), + // fill: obj.get('fill'), + // left: obj.get('left'), + // top: obj.get('top') + // // 添加其他属性... + // }; + // }); + + // console.log('Properties of the selected group:', properties); + }); + return () => { + canvasObject.dispose(); + }; + }, [changeId]); + + useEffect(() => { + // TODO_3 需要加个loading效果 + import('./Descriptors.json').then((descriptors) => { + setDescriptors(descriptors); + }); + console.log(fetchUuid(), 'fetchUuid'); + }, []); + + return ( + <ProCard + gutter={24} + extra={ + <> + <Button type="primary" onClick={changeModelStatus}> + 切换状态 + </Button> + </> + } + > + {/* <ProCard colSpan={4}> + <ImageMapItems ref={itemsRef} canvasRef={canvasRef} descriptors={descriptors} /> + </ProCard> */} + <ProCard colSpan={24} style={{ padding: 0, margin: 0 }} bodyStyle={{ padding: 0, margin: 0 }}> + <canvas + id={`canvas_${fetchUuid()}`} + ref={canvasRef} + {...clipPathData} + style={{ border: '1px dashed #eee' }} + ></canvas> + {/* <CustomCanvas ref={canvasRef} jsonData={jsonData} ></CustomCanvas> */} + {/* <Canvas + ref={canvasRef} + className="rde-canvas" + minZoom={1} + maxZoom={500} + propertiesToInclude={propertiesToInclude} + keyEvent={{ + transaction: true, + }} + canvasOption={{ + selectionColor: 'rgba(8, 151, 156, 0.3)', + }} + /> */} + </ProCard> + + <ColumnDrawer + handleDrawer={handle_category_fk_id} + isShowDetail={category_fk_id_open} + columns={ModelCategoryColumns} + currentRow={currentModelUserProperty} + /> + </ProCard> + // 属性预览 + ); +}; + +export default ImageMapEditor; diff --git a/src/pages/Fabric/canvas/Canvas.tsx b/src/pages/Fabric/canvas/Canvas.tsx new file mode 100644 index 0000000..bae3eb4 --- /dev/null +++ b/src/pages/Fabric/canvas/Canvas.tsx @@ -0,0 +1,200 @@ +import { useUuid } from '@/hooks/useUuid'; +import { fabric } from 'fabric'; +import React, { Component, useRef } from 'react'; +// import ResizeObserver from 'resize-observer-polyfill'; +import { defaults } from './constants'; +import Handler, { HandlerOptions } from './handlers/Handler'; +import './styles/canvas.less'; +import './styles/contextmenu.less'; +import './styles/fabricjs.less'; +import './styles/tooltip.less'; +import { FabricCanvas } from './utils'; + +// eslint-disable-next-line react-hooks/rules-of-hooks + +export interface CanvasInstance { + handler: Handler; + canvas: FabricCanvas; + container: HTMLDivElement; +} + +export type CanvasProps = HandlerOptions & { + responsive?: boolean; + style?: React.CSSProperties; +}; + +interface IState { + id: string; + loaded: boolean; +} + +class InternalCanvas extends Component<CanvasProps, IState> implements CanvasInstance { + public handler!: Handler; + public canvas!: FabricCanvas; + public container!: HTMLDivElement; + private containerRef = React.createRef<HTMLDivElement>(); + // private resizeObserver!: ResizeObserver; + + static defaultProps: CanvasProps = { + id: useUuid().fetchUuid(), + editable: true, + zoomEnabled: true, + minZoom: 30, + maxZoom: 300, + responsive: true, + width: 0, + height: 0, + }; + + state: IState = { + id: useUuid().fetchUuid(), + loaded: false, + }; + + componentDidMount() { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { editable, canvasOption, width, height, responsive, ...other } = this.props; + const { id } = this.state; + const mergedCanvasOption = Object.assign({}, defaults.canvasOption, canvasOption, { + width, + height, + selection: + (typeof canvasOption?.selection !== 'undefined' && canvasOption?.selection) || editable, + }); + this.canvas = new fabric.Canvas(`canvas_${id}`, mergedCanvasOption); + this.canvas.setBackgroundColor( + mergedCanvasOption.backgroundColor, + this.canvas.renderAll.bind(this.canvas), + ); + this.canvas.renderAll(); + this.container = this.containerRef.current; + this.handler = new Handler({ + id, + width, + height, + editable, + canvas: this.canvas, + container: this.containerRef.current, + canvasOption: mergedCanvasOption, + ...other, + }); + if (this.props.responsive) { + // this.createObserver(); + } else { + this.handleLoad(); + } + } + + componentDidUpdate(prevProps: CanvasProps) { + if (this.props.width !== prevProps.width || this.props.height !== prevProps.height) { + this.handler.eventHandler.resize(this.props.width, this.props.height); + } + if (this.props.editable !== prevProps.editable) { + this.handler.editable = this.props.editable; + } + if (this.props.responsive !== prevProps.responsive) { + // if (!this.props.responsive) { + // this.destroyObserver(); + // } else { + // this.destroyObserver(); + // this.createObserver(); + // } + } + if (JSON.stringify(this.props.canvasOption) !== JSON.stringify(prevProps.canvasOption)) { + this.handler.setCanvasOption(this.props.canvasOption); + } + if (JSON.stringify(this.props.keyEvent) !== JSON.stringify(prevProps.keyEvent)) { + this.handler.setKeyEvent(this.props.keyEvent); + } + if (JSON.stringify(this.props.fabricObjects) !== JSON.stringify(prevProps.fabricObjects)) { + this.handler.setFabricObjects(this.props.fabricObjects); + } + if (JSON.stringify(this.props.workareaOption) !== JSON.stringify(prevProps.workareaOption)) { + this.handler.setWorkareaOption(this.props.workareaOption); + } + if (JSON.stringify(this.props.guidelineOption) !== JSON.stringify(prevProps.guidelineOption)) { + this.handler.setGuidelineOption(this.props.guidelineOption); + } + if (JSON.stringify(this.props.objectOption) !== JSON.stringify(prevProps.objectOption)) { + this.handler.setObjectOption(this.props.objectOption); + } + if (JSON.stringify(this.props.gridOption) !== JSON.stringify(prevProps.gridOption)) { + this.handler.setGridOption(this.props.gridOption); + } + if ( + JSON.stringify(this.props.propertiesToInclude) !== + JSON.stringify(prevProps.propertiesToInclude) + ) { + this.handler.setPropertiesToInclude(this.props.propertiesToInclude); + } + if ( + JSON.stringify(this.props.activeSelectionOption) !== + JSON.stringify(prevProps.activeSelectionOption) + ) { + this.handler.setActiveSelectionOption(this.props.activeSelectionOption); + } + } + + componentWillUnmount() { + // this.destroyObserver(); + this.handler.destroy(); + } + + // createObserver = () => { + // this.resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => { + // const { width = 0, height = 0 } = (entries[0] && entries[0].contentRect) || {}; + // this.handler.eventHandler.resize(width, height); + // if (!this.state.loaded) { + // this.handleLoad(); + // } + // }); + // this.resizeObserver.observe(this.containerRef.current); + // }; + + // destroyObserver = () => { + // if (this.resizeObserver) { + // this.resizeObserver.disconnect(); + // this.resizeObserver = null; + // } + // }; + + handleLoad = () => { + this.setState( + { + loaded: true, + }, + () => { + if (this.props.onLoad) { + this.props.onLoad(this.handler, this.canvas); + } + }, + ); + }; + + render() { + const { style } = this.props; + const { id } = this.state; + return ( + <div + ref={this.containerRef} + id={id} + className="rde-canvas" + style={{ width: '100%', height: '100%', ...style }} + > + <canvas id={`canvas_${id}`} /> + </div> + ); + } +} + +const Canvas: React.FC<CanvasProps> = (props, ref) => { + const canvasRef = useRef<InternalCanvas>(); + React.useImperativeHandle(ref, () => ({ + handler: canvasRef.current.handler, + canvas: canvasRef.current.canvas, + container: canvasRef.current.container, + })); + return <InternalCanvas ref={canvasRef} {...props} />; +}; + +export default React.forwardRef<CanvasInstance, CanvasProps>(Canvas); diff --git a/src/pages/Fabric/canvas/CanvasObject.ts b/src/pages/Fabric/canvas/CanvasObject.ts new file mode 100644 index 0000000..705a7fd --- /dev/null +++ b/src/pages/Fabric/canvas/CanvasObject.ts @@ -0,0 +1,104 @@ +import { PropTypes } from 'prop-types'; +import { fabric } from 'fabric'; + +import { + Arrow, + Gif, + Element, + Iframe, + Video, + Node, + Link, + CurvedLink, + OrthogonalLink, + Line, + Cube, +} from './objects'; +import { FabricObject } from './utils'; +import { Code } from './objects/Element'; +import Svg, { SvgOption } from './objects/Svg'; + +export interface ObjectSchema { + create: (...option: any) => fabric.Object; +} + +export interface CanvasObjectSchema { + [key: string]: ObjectSchema; +} + +export const createCanvasObject = (objectSchema: CanvasObjectSchema) => objectSchema; + +const CanvasObject: CanvasObjectSchema = { + group: { + create: ({ objects, ...option }: { objects: FabricObject[] }) => new fabric.Group(objects, option), + }, + 'i-text': { + create: ({ text, ...option }: { text: string }) => new fabric.IText(text, option), + }, + textbox: { + create: ({ text, ...option }: { text: string }) => new fabric.Textbox(text, option), + }, + triangle: { + create: (option: any) => new fabric.Triangle(option), + }, + circle: { + create: (option: any) => new fabric.Circle(option), + }, + rect: { + create: (option: any) => new fabric.Rect(option), + }, + cube: { + create: (option: any) => new Cube(option), + }, + image: { + create: ({ element = new Image(), ...option }) => + new fabric.Image(element, { + ...option, + crossOrigin: 'anonymous', + }), + }, + polygon: { + create: ({ points, ...option }: { points: any }) => + new fabric.Polygon(points, { + ...option, + perPixelTargetFind: true, + }), + }, + line: { + create: ({ points, ...option }: { points: any }) => new Line(points, option), + }, + arrow: { + create: ({ points, ...option }: { points: any }) => new Arrow(points, option), + }, + element: { + create: ({ code, ...option }: { code: Code }) => new Element(code, option), + }, + iframe: { + create: ({ src, ...option }: { src: string }) => new Iframe(src, option), + }, + video: { + create: ({ src, file, ...option }: { src: string; file: File }) => new Video(src || file, option), + }, + gif: { + create: (option: any) => new Gif(option), + }, + node: { + create: (option: any) => new Node(option), + }, + link: { + create: (fromNode, fromPort, toNode, toPort, option) => new Link(fromNode, fromPort, toNode, toPort, option), + }, + curvedLink: { + create: (fromNode, fromPort, toNode, toPort, option) => + new CurvedLink(fromNode, fromPort, toNode, toPort, option), + }, + orthogonalLink: { + create: (fromNode, fromPort, toNode, toPort, option) => + new OrthogonalLink(fromNode, fromPort, toNode, toPort, option), + }, + svg: { + create: (option: SvgOption) => new Svg(option), + } +}; + +export default CanvasObject; diff --git a/src/pages/Fabric/canvas/CustomCanvas.tsx b/src/pages/Fabric/canvas/CustomCanvas.tsx new file mode 100644 index 0000000..131cd77 --- /dev/null +++ b/src/pages/Fabric/canvas/CustomCanvas.tsx @@ -0,0 +1,34 @@ +import React, { useRef, useEffect } from 'react'; +import { fabric } from 'fabric'; +// import { Fabric } from 'react-fabricjs'; + + +export type customCanvasProps = { + jsonData: Record<string,any> +} + +const CustomCanvas: React.FC<customCanvasProps> = ({ jsonData }) => { + const canvasRef = useRef(null); + + useEffect(() => { + const canvas = new fabric.Canvas(canvasRef.current); + + // 通过JSON数据创建Fabric对象 + if (jsonData) { + canvas.loadFromJSON(jsonData, () => { + canvas.renderAll(); + }); + } + + // 如果需要添加其他元素或者自定义操作,可以在这里进行 + + return () => { + // 在组件卸载时清理 + canvas.dispose(); + }; + }, [jsonData]); + + return <Fabric ref={canvasRef} />; +}; + +export default CustomCanvas; diff --git a/src/pages/Fabric/canvas/constants/code.ts b/src/pages/Fabric/canvas/constants/code.ts new file mode 100644 index 0000000..07813e0 --- /dev/null +++ b/src/pages/Fabric/canvas/constants/code.ts @@ -0,0 +1,19 @@ +export const ESCAPE = 'Escape'; +export const DELETE = 'Delete'; +export const BACKSPACE = 'Backspace'; +export const EQUAL = 'Equal'; +export const MINUS = 'Minus'; +export const KEY_A = 'KeyA'; +export const KEY_Q = 'KeyQ'; +export const KEY_W = 'KeyW'; +export const KEY_C = 'KeyC'; +export const KEY_V = 'KeyV'; +export const KEY_Z = 'KeyZ'; +export const KEY_Y = 'KeyY'; +export const KEY_O = 'KeyO'; +export const KEY_P = 'KeyP'; +export const KEY_X = 'KeyX'; +export const ARROW_UP = 'ArrowUp'; +export const ARROW_DOWN = 'ArrowDown'; +export const ARROW_LEFT = 'ArrowLeft'; +export const ARROW_RIGHT = 'ArrowRight'; diff --git a/src/pages/Fabric/canvas/constants/defaults.ts b/src/pages/Fabric/canvas/constants/defaults.ts new file mode 100644 index 0000000..a2d5109 --- /dev/null +++ b/src/pages/Fabric/canvas/constants/defaults.ts @@ -0,0 +1,75 @@ +import { FabricObjectOption, WorkareaObject } from '../utils'; + +export const canvasOption = { + preserveObjectStacking: true, + width: 300, + height: 150, + selection: true, + defaultCursor: 'default', + backgroundColor: '#f3f3f3', +}; + +export const keyEvent = { + move: true, + all: true, + copy: true, + paste: true, + esc: true, + del: true, + clipboard: false, + transaction: true, + zoom: true, + cut: true, + grab: true, +}; + +export const gridOption = { + enabled: false, + grid: 10, + snapToGrid: false, + lineColor: '#ebebeb', + borderColor: '#cccccc', +}; + +export const workareaOption: Partial<WorkareaObject> = { + width: 600, + height: 400, + workareaWidth: 600, + workareaHeight: 400, + lockScalingX: true, + lockScalingY: true, + scaleX: 1, + scaleY: 1, + backgroundColor: '#fff', + hasBorders: false, + hasControls: false, + selectable: false, + lockMovementX: true, + lockMovementY: true, + hoverCursor: 'default', + name: '', + id: 'workarea', + type: 'image', + layout: 'fixed', // fixed, responsive, fullscreen + link: {}, + tooltip: { + enabled: false, + }, + isElement: false, +}; + +export const objectOption: Partial<FabricObjectOption> = { + rotation: 0, + centeredRotation: true, + strokeUniform: true, +}; + +export const guidelineOption = { + enabled: true, +}; + +export const activeSelectionOption = { + hasControls: true, +}; + +export const propertiesToInclude = ['id', 'name', 'locked', 'editable']; diff --git a/src/pages/Fabric/canvas/constants/index.ts b/src/pages/Fabric/canvas/constants/index.ts new file mode 100644 index 0000000..4a28da5 --- /dev/null +++ b/src/pages/Fabric/canvas/constants/index.ts @@ -0,0 +1,4 @@ +import * as defaults from './defaults'; +import * as code from './code'; + +export { defaults, code }; diff --git a/src/pages/Fabric/canvas/global.d.ts b/src/pages/Fabric/canvas/global.d.ts new file mode 100644 index 0000000..68057ea --- /dev/null +++ b/src/pages/Fabric/canvas/global.d.ts @@ -0,0 +1,62 @@ +// export {}; + +type T = Window & typeof globalThis; + +declare module 'fabric/fabric-impl' { + // Common + class Gif {} + class Arrow {} + // Element + class Iframe {} + class Element {} + class Video {} + // Node + class Node {} + // Link + class Link {} + class CurvedLink {} + class OrthogonalLink {} + class Cube {} + // SVG + class Svg {} + + interface ICreateProperties { + type: 'string'; + initialize(options: any): void; + toObject?(propertiesToInclude: string[]): void; + _render?(ctx: CanvasRenderingContext2D): void; + } + + interface IUtilClass { + /** + * Helper for creation of "classes". + * @param [parent] optional "Class" to inherit from + * @param [properties] Properties shared by all instances of this class + * (be careful modifying objects defined here as this would affect all instances) + */ + createClass(parent: any, properties?: ICreateProperties); + } + + type IUtil = fabric.IUtil & IUtilClass; + + export const util: IUtil; +} + +declare global { + interface Window { + // gifler: any; + adsbygoogle: any; + } +} + +declare class MediaElementPlayer { + constructor( + id: string, + options: { + pauseOtherPlayers: boolean; + videoWidth: string; + videoHeight: string; + success: (mediaeElement: any, originalNode: any, instance: any) => void; + }, + ); +} diff --git a/src/pages/Fabric/canvas/handlers/AlignmentHandler.ts b/src/pages/Fabric/canvas/handlers/AlignmentHandler.ts new file mode 100644 index 0000000..909bb86 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/AlignmentHandler.ts @@ -0,0 +1,63 @@ +import Handler from './Handler'; + +class AlignmentHandler { + handler: Handler; + constructor(handler: Handler) { + this.handler = handler; + } + + /** + * Align left at selection + */ + public left = () => { + const activeObject = this.handler.canvas.getActiveObject(); + if (activeObject && activeObject.type === 'activeSelection') { + const activeSelection = activeObject as fabric.ActiveSelection; + const activeObjectLeft = -(activeObject.width / 2); + activeSelection.forEachObject(obj => { + obj.set({ + left: activeObjectLeft, + }); + obj.setCoords(); + this.handler.canvas.renderAll(); + }); + } + } + + /** + * Align center at selection + */ + public center = () => { + const activeObject = this.handler.canvas.getActiveObject(); + if (activeObject && activeObject.type === 'activeSelection') { + const activeSelection = activeObject as fabric.ActiveSelection; + activeSelection.forEachObject(obj => { + obj.set({ + left: 0 - ((obj.width * obj.scaleX) / 2), + }); + obj.setCoords(); + this.handler.canvas.renderAll(); + }); + } + } + + /** + * Align right at selection + */ + public right = () => { + const activeObject = this.handler.canvas.getActiveObject(); + if (activeObject && activeObject.type === 'activeSelection') { + const activeSelection = activeObject as fabric.ActiveSelection; + const activeObjectLeft = (activeObject.width / 2); + activeSelection.forEachObject(obj => { + obj.set({ + left: activeObjectLeft - (obj.width * obj.scaleX), + }); + obj.setCoords(); + this.handler.canvas.renderAll(); + }); + } + } +} + +export default AlignmentHandler; diff --git a/src/pages/Fabric/canvas/handlers/AnimationHandler.ts b/src/pages/Fabric/canvas/handlers/AnimationHandler.ts new file mode 100644 index 0000000..6468693 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/AnimationHandler.ts @@ -0,0 +1,338 @@ +// import anime from 'animejs'; +import { message } from 'antd'; +import { Handler } from '.'; +import { FabricObject } from '../utils'; + +class AnimationHandler { + handler: Handler; + + constructor(handler: Handler) { + this.handler = handler; + } + + /** + * Play the animation + * @param {string} id + * @param {boolean} [hasControls] + * @returns + */ + public play = (id: string, hasControls?: boolean) => { + const findObject = this.handler.findById(id); + if (!findObject) { + return; + } + if (findObject.anime) { + findObject.anime.restart(); + return; + } + if (findObject.animation.type === 'none') { + return; + } + const instance = this.getAnime(findObject, hasControls); + if (instance) { + findObject.set('anime', instance); + findObject.set({ + hasControls: false, + lockMovementX: true, + lockMovementY: true, + hoverCursor: 'pointer', + }); + this.handler.canvas.requestRenderAll(); + instance.play(); + } + }; + + /** + * Pause the animation + * @param {string} id + * @returns + */ + public pause = (id: string) => { + const findObject = this.handler.findById(id); + if (!findObject) { + return; + } + findObject.anime.pause(); + }; + + /** + * Stop the animation + * @param {string} id + * @param {boolean} [hasControls=true] + * @returns + */ + public stop = (id: string, hasControls = true) => { + const findObject = this.handler.findById(id); + if (!findObject) { + return; + } + this.resetAnimation(findObject, hasControls); + }; + + /** + * Restart the animation + * @param {string} id + * @returns + */ + public restart = (id: string) => { + const findObject = this.handler.findById(id); + if (!findObject) { + return; + } + if (!findObject.anime) { + return; + } + this.stop(id); + this.play(id); + }; + + /** + * Reset animation + * + * @param {FabricObject} obj + * @param {boolean} [hasControls=true] + * @returns + */ + public resetAnimation = (obj: FabricObject, hasControls = true) => { + if (!obj.anime) { + return; + } + let option; + if (this.handler.editable) { + option = { + anime: null, + hasControls, + lockMovementX: !hasControls, + lockMovementY: !hasControls, + hoverCursor: hasControls ? 'move' : 'pointer', + }; + } else { + option = { + anime: null, + hasControls: false, + lockMovementX: true, + lockMovementY: true, + hoverCursor: 'pointer', + }; + } + anime.remove(obj); + const { type } = obj.animation; + if (type === 'fade') { + Object.assign(option, { + opacity: obj.originOpacity, + originOpacity: null, + }); + } else if (type === 'bounce') { + if (obj.animation.bounce === 'vertical') { + Object.assign(option, { + top: obj.originTop, + originTop: null, + }); + } else { + Object.assign(option, { + left: obj.originLeft, + originLeft: null, + }); + } + } else if (type === 'shake') { + if (obj.animation.shake === 'vertical') { + Object.assign(option, { + top: obj.originTop, + originTop: null, + }); + } else { + Object.assign(option, { + left: obj.originLeft, + originLeft: null, + }); + } + } else if (type === 'scaling') { + Object.assign(option, { + scaleX: obj.originScaleX, + scaleY: obj.originScaleY, + originScaleX: null, + originScaleY: null, + }); + } else if (type === 'rotation') { + Object.assign(option, { + angle: obj.originAngle, + rotation: obj.originAngle, + left: obj.originLeft, + top: obj.originTop, + originLeft: null, + originTop: null, + originAngle: null, + }); + } else if (type === 'flash') { + if (obj.type === 'svg') { + (obj as fabric.Group)._objects.forEach(child => + this.handler.setByPartial(child, { + fill: (child as FabricObject).originFill, + stroke: (child as FabricObject).originStroke, + originFill: null, + originStroke: null, + }), + ); + } + Object.assign(option, { + fill: obj.originFill, + stroke: obj.originStroke, + originFill: null, + originStroke: null, + }); + } else { + console.warn('Not supported type.'); + } + obj.set(option); + this.handler.canvas.renderAll(); + }; + + /** + * Get animation option + * + * @param {FabricObject} obj + * @param {boolean} [hasControls] + * @returns + */ + getAnime = (obj: FabricObject, hasControls?: boolean) => { + const { delay = 0, duration = 100, autoplay = true, loop = true, type, ...other } = obj.animation; + const option: anime.AnimeParams = { + targets: obj, + delay, + loop, + autoplay, + duration, + direction: 'alternate', + begin: () => { + obj.set({ + hasControls: false, + lockMovementX: true, + lockMovementY: true, + hoverCursor: 'pointer', + }); + this.handler.canvas.requestRenderAll(); + }, + update: (instance: anime.AnimeInstance) => { + if (type === 'flash') { + // I don't know why it works. Magic code... + message.warning('instance.animations[0] undefined.'); + message.warning('instance.animations[1] undefined.'); + const fill = instance.animations[0]?.currentValue; + const stroke = instance.animations[1]?.currentValue; + if (obj.type === 'svg') { + obj.setFill(fill); + obj.setStroke(stroke); + } else { + obj.set('fill', ''); + obj.set('fill', fill); + obj.set('stroke', stroke); + } + } else if (type === 'rotation') { + let angle = instance.animations[0].currentValue as string | number; + if (typeof angle === 'string') { + angle = parseInt(angle, 10); + } + obj.rotate(angle); + this.handler.canvas.requestRenderAll(); + return; + } + obj.setCoords(); + this.handler.canvas.requestRenderAll(); + }, + complete: () => { + this.resetAnimation(obj, hasControls); + }, + }; + if (type === 'fade') { + const { opacity = 0 } = other; + obj.set('originOpacity', obj.opacity); + Object.assign(option, { + opacity, + easing: 'easeInQuad', + }); + } else if (type === 'bounce') { + const { offset = 1 } = other; + if (other.bounce === 'vertical') { + obj.set('originTop', obj.top); + Object.assign(option, { + top: obj.top + offset, + easing: 'easeInQuad', + }); + } else { + obj.set('originLeft', obj.left); + Object.assign(option, { + left: obj.left + offset, + easing: 'easeInQuad', + }); + } + } else if (type === 'shake') { + const { offset = 1 } = other; + if (other.shake === 'vertical') { + obj.set('originTop', obj.top); + Object.assign(option, { + top: obj.top + offset, + delay: 0, + elasticity: 1000, + duration: 500, + }); + } else { + obj.set('originLeft', obj.left); + Object.assign(option, { + left: obj.left + offset, + delay: 0, + elasticity: 1000, + duration: 500, + }); + } + } else if (type === 'scaling') { + const { scale = 2 } = other; + obj.set('originScaleX', obj.scaleX); + obj.set('originScaleY', obj.scaleY); + obj.set({ + originScaleX: obj.scaleX, + originScaleY: obj.scaleY, + }); + const scaleX = obj.scaleX * scale; + const scaleY = obj.scaleY * scale; + Object.assign(option, { + scaleX, + scaleY, + easing: 'easeInQuad', + }); + } else if (type === 'rotation') { + const { angle = 360 } = other; + obj.set('rotation', obj.angle); + obj.set('originAngle', obj.angle); + obj.set('originLeft', obj.left); + obj.set('originTop', obj.top); + Object.assign(option, { + rotation: angle, + easing: 'linear', + direction: 'normal', + }); + } else if (type === 'flash') { + const { fill = obj.fill, stroke = obj.stroke } = other; + if (obj.type === 'svg') { + (obj as fabric.Group)._objects.forEach(child => + this.handler.setByPartial(child, { + originFill: child.fill, + originStroke: child.stroke, + }), + ); + } + obj.set('originFill', obj.fill as string); + obj.set('originStroke', obj.stroke); + Object.assign(option, { + fill, + stroke, + easing: 'easeInQuad', + }); + } else { + console.warn('Not supported type.'); + return null; + } + return anime(option); + }; +} + +export default AnimationHandler; diff --git a/src/pages/Fabric/canvas/handlers/ChartHandler.ts b/src/pages/Fabric/canvas/handlers/ChartHandler.ts new file mode 100644 index 0000000..e583a32 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/ChartHandler.ts @@ -0,0 +1,14 @@ +import * as echarts from 'echarts'; + +import Handler from './Handler'; + +class ChartHandler { + handler?: Handler; + instance?: echarts.ECharts; + + constructor(handler: Handler) { + this.handler = handler; + } +} + +export default ChartHandler; diff --git a/src/pages/Fabric/canvas/handlers/ContextmenuHandler.ts b/src/pages/Fabric/canvas/handlers/ContextmenuHandler.ts new file mode 100644 index 0000000..9376999 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/ContextmenuHandler.ts @@ -0,0 +1,71 @@ +import ReactDOM from 'react-dom'; +import {debounce } from 'lodash'; + +import { Handler } from '.'; + +class ContextmenuHandler { + handler: Handler; + contextmenuEl: HTMLDivElement; + + constructor(handler: Handler) { + this.handler = handler; + this.initialize(); + } + + /** + * Initialize contextmenu + * + */ + public initialize() { + this.contextmenuEl = document.createElement('div'); + this.contextmenuEl.id = `${this.handler.id}_contextmenu`; + this.contextmenuEl.className = 'rde-contextmenu contextmenu-hidden'; + document.body.appendChild(this.contextmenuEl); + } + + /** + * Destroy contextmenu + * + */ + public destory() { + if (this.contextmenuEl) { + document.body.removeChild(this.contextmenuEl); + } + } + + /** + * Show context menu + * + */ + public show = debounce(async (e, target) => { + const { onContext } = this.handler; + while (this.contextmenuEl.hasChildNodes()) { + this.contextmenuEl.removeChild(this.contextmenuEl.firstChild); + } + const contextmenu = document.createElement('div'); + contextmenu.className = 'rde-contextmenu-right'; + const element = await onContext(this.contextmenuEl, e, target); + if (!element) { + return; + } + contextmenu.innerHTML = element; + this.contextmenuEl.appendChild(contextmenu); + ReactDOM.render(element, contextmenu); + this.contextmenuEl.classList.remove('contextmenu-hidden'); + const { clientX: left, clientY: top } = e; + this.contextmenuEl.style.left = `${left}px`; + this.contextmenuEl.style.top = `${top}px`; + }, 100); + + /** + * Hide context menu + * + */ + public hide = debounce(() => { + if (this.contextmenuEl) { + this.contextmenuEl.classList.add('contextmenu-hidden'); + } + }, 100); +} + +export default ContextmenuHandler; diff --git a/src/pages/Fabric/canvas/handlers/CropHandler.ts b/src/pages/Fabric/canvas/handlers/CropHandler.ts new file mode 100644 index 0000000..6e60e6a --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/CropHandler.ts @@ -0,0 +1,278 @@ +import { fabric } from 'fabric'; + +import { Handler } from '.'; +import { FabricImage } from '../utils'; + +class CropHandler { + handler: Handler; + cropRect: fabric.Rect; + cropObject: FabricImage; + + constructor(handler: Handler) { + this.handler = handler; + this.cropRect = null; + this.cropObject = null; + } + + /** + * Validate crop type + * + * @returns + */ + public validType = () => { + const activeObject = this.handler.canvas.getActiveObject(); + if (!activeObject) { + return false; + } + if (activeObject.type === 'image') { + return true; + } + return false; + }; + + /** + * Start crop image + * + */ + public start = () => { + if (this.validType()) { + this.handler.interactionMode = 'crop'; + this.cropObject = this.handler.canvas.getActiveObject() as FabricImage; + const { left, top } = this.cropObject; + this.cropRect = new fabric.Rect({ + width: this.cropObject.width, + height: this.cropObject.height, + scaleX: this.cropObject.scaleX, + scaleY: this.cropObject.scaleY, + originX: 'left', + originY: 'top', + left, + top, + hasRotatingPoint: false, + fill: 'rgba(0, 0, 0, 0.2)', + }); + this.handler.canvas.add(this.cropRect); + this.handler.canvas.setActiveObject(this.cropRect); + this.cropObject.selectable = false; + this.cropObject.evented = false; + this.handler.canvas.renderAll(); + } + }; + + /** + * Finish crop image + * + */ + public finish = () => { + const { left, top, width, height, scaleX, scaleY } = this.cropRect; + const croppedImg = this.cropObject.toDataURL({ + left: left - this.cropObject.left, + top: top - this.cropObject.top, + width: width * scaleX, + height: height * scaleY, + }); + this.handler.setImage(this.cropObject, croppedImg); + this.cancel(); + }; + + /** + * Cancel crop + * + */ + public cancel = () => { + this.handler.interactionMode = 'selection'; + this.cropObject.selectable = true; + this.cropObject.evented = true; + this.handler.canvas.setActiveObject(this.cropObject); + this.handler.canvas.remove(this.cropRect); + this.cropRect = null; + this.cropObject = null; + this.handler.canvas.renderAll(); + }; + + /** + * Resize crop + * + * @param {FabricEvent} opt + */ + public resize = (opt: fabric.IEvent) => { + const { + target, + transform: { original, corner }, + } = opt; + const { left, top, width, height, scaleX, scaleY } = target; + const { + left: cropLeft, + top: cropTop, + width: cropWidth, + height: cropHeight, + scaleX: cropScaleX, + scaleY: cropScaleY, + } = this.cropObject; + if (corner === 'tl') { + if (Math.round(cropLeft) > Math.round(left)) { + // left + const originRight = Math.round(cropLeft + cropWidth); + const targetRight = Math.round(target.getBoundingRect().left + target.getBoundingRect().width); + const diffRightRatio = 1 - (originRight - targetRight) / cropWidth; + target.set({ + left: cropLeft, + scaleX: diffRightRatio > 1 ? 1 : diffRightRatio, + }); + } + if (Math.round(cropTop) > Math.round(top)) { + // top + const originBottom = Math.round(cropTop + cropHeight); + const targetBottom = Math.round(target.getBoundingRect().top + target.getBoundingRect().height); + const diffBottomRatio = 1 - (originBottom - targetBottom) / cropHeight; + target.set({ + top: cropTop, + scaleY: diffBottomRatio > 1 ? 1 : diffBottomRatio, + }); + } + } else if (corner === 'bl') { + if (Math.round(cropLeft) > Math.round(left)) { + // left + const originRight = Math.round(cropLeft + cropWidth); + const targetRight = Math.round(target.getBoundingRect().left + target.getBoundingRect().width); + const diffRightRatio = 1 - (originRight - targetRight) / cropWidth; + target.set({ + left: cropLeft, + scaleX: diffRightRatio > 1 ? 1 : diffRightRatio, + }); + } + if (Math.round(cropTop + cropHeight * cropScaleY) < Math.round(top + height * scaleY)) { + // bottom + const diffTopRatio = 1 - (original.top - cropTop) / cropHeight; + target.set({ + top: original.top, + scaleY: diffTopRatio > 1 ? 1 : diffTopRatio, + }); + } + } else if (corner === 'tr') { + if (Math.round(cropLeft + cropWidth * cropScaleX) < Math.round(left + width * scaleX)) { + // right + const diffLeftRatio = 1 - (original.left - cropLeft) / cropWidth; + target.set({ + left: original.left, + scaleX: diffLeftRatio > 1 ? 1 : diffLeftRatio, + }); + } + if (Math.round(cropTop) > Math.round(top)) { + // top + const originBottom = Math.round(cropTop + cropHeight); + const targetBottom = Math.round(target.getBoundingRect().top + target.getBoundingRect().height); + const diffBottomRatio = 1 - (originBottom - targetBottom) / cropHeight; + target.set({ + top: cropTop, + scaleY: diffBottomRatio > 1 ? 1 : diffBottomRatio, + }); + } + } else if (corner === 'br') { + if (Math.round(cropLeft + cropWidth * cropScaleX) < Math.round(left + width * scaleX)) { + // right + const diffLeftRatio = 1 - (original.left - cropLeft) / cropWidth; + target.set({ + left: original.left, + scaleX: diffLeftRatio > 1 ? 1 : diffLeftRatio, + }); + } + if (Math.round(cropTop + cropHeight * cropScaleY) < Math.round(top + height * scaleY)) { + // bottom + const diffTopRatio = 1 - (original.top - cropTop) / cropHeight; + target.set({ + top: original.top, + scaleY: diffTopRatio > 1 ? 1 : diffTopRatio, + }); + } + } else if (corner === 'ml') { + if (Math.round(cropLeft) > Math.round(left)) { + // left + const originRight = Math.round(cropLeft + cropWidth); + const targetRight = Math.round(target.getBoundingRect().left + target.getBoundingRect().width); + const diffRightRatio = 1 - (originRight - targetRight) / cropWidth; + target.set({ + left: cropLeft, + scaleX: diffRightRatio > 1 ? 1 : diffRightRatio, + }); + } + } else if (corner === 'mt') { + if (Math.round(cropTop) > Math.round(top)) { + // top + const originBottom = Math.round(cropTop + cropHeight); + const targetBottom = Math.round(target.getBoundingRect().top + target.getBoundingRect().height); + const diffBottomRatio = 1 - (originBottom - targetBottom) / cropHeight; + target.set({ + top: cropTop, + scaleY: diffBottomRatio > 1 ? 1 : diffBottomRatio, + }); + } + } else if (corner === 'mb') { + if (Math.round(cropTop + cropHeight * cropScaleY) < Math.round(top + height * scaleY)) { + // bottom + const diffTopRatio = 1 - (original.top - cropTop) / cropHeight; + target.set({ + top: original.top, + scaleY: diffTopRatio > 1 ? 1 : diffTopRatio, + }); + } + } else if (corner === 'mr') { + if (Math.round(cropLeft + cropWidth * cropScaleX) < Math.round(left + width * scaleX)) { + // right + const diffLeftRatio = 1 - (original.left - cropLeft) / cropWidth; + target.set({ + left: original.left, + scaleX: diffLeftRatio > 1 ? 1 : diffLeftRatio, + }); + } + } + }; + + /** + * Resize crop + * + * @param {FabricEvent} opt + */ + public moving = (opt: fabric.IEvent) => { + const { target } = opt; + const { left, top, width, height, scaleX, scaleY } = target; + const { + left: cropLeft, + top: cropTop, + width: cropWidth, + height: cropHeight, + } = this.cropObject.getBoundingRect(); + const movedTop = () => { + if (Math.round(cropTop) >= Math.round(top)) { + target.set({ + top: cropTop, + }); + } else if (Math.round(cropTop + cropHeight) <= Math.round(top + height * scaleY)) { + target.set({ + top: cropTop + cropHeight - height * scaleY, + }); + } + }; + if (Math.round(cropLeft) >= Math.round(left)) { + target.set({ + left: Math.max(left, cropLeft), + }); + movedTop(); + } else if (Math.round(cropLeft + cropWidth) <= Math.round(left + width * scaleX)) { + target.set({ + left: cropLeft + cropWidth - width * scaleX, + }); + movedTop(); + } else if (Math.round(cropTop) >= Math.round(top)) { + target.set({ + top: cropTop, + }); + } else if (Math.round(cropTop + cropHeight) <= Math.round(top + height * scaleY)) { + target.set({ + top: cropTop + cropHeight - height * scaleY, + }); + } + }; +} + +export default CropHandler; diff --git a/src/pages/Fabric/canvas/handlers/CustomHandler.ts b/src/pages/Fabric/canvas/handlers/CustomHandler.ts new file mode 100644 index 0000000..f97f9cf --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/CustomHandler.ts @@ -0,0 +1,14 @@ +import { Handler } from '.'; + +class CustomHandler { + handler: Handler; + + constructor(handler: Handler) { + this.handler = handler; + this.initialze(); + } + + protected initialze() {} +} + +export default CustomHandler; diff --git a/src/pages/Fabric/canvas/handlers/DrawingHandler.ts b/src/pages/Fabric/canvas/handlers/DrawingHandler.ts new file mode 100644 index 0000000..da7006d --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/DrawingHandler.ts @@ -0,0 +1,374 @@ +import { fabric } from 'fabric'; +import { useUuid } from '@/hooks/useUuid'; +import { Arrow, Line } from '../objects'; +import { FabricEvent, FabricObject } from '../utils'; +import Handler from './Handler'; + +// eslint-disable-next-line react-hooks/rules-of-hooks +const { fetchUuid } = useUuid(); + +class DrawingHandler { + handler: Handler; + constructor(handler: Handler) { + this.handler = handler; + } + + polygon = { + init: () => { + this.handler.interactionHandler.drawing('polygon'); + this.handler.pointArray = []; + this.handler.lineArray = []; + this.handler.activeLine = null; + this.handler.activeShape = null; + }, + finish: () => { + this.handler.pointArray.forEach(point => { + this.handler.canvas.remove(point); + }); + this.handler.lineArray.forEach(line => { + this.handler.canvas.remove(line); + }); + this.handler.canvas.remove(this.handler.activeLine); + this.handler.canvas.remove(this.handler.activeShape); + this.handler.pointArray = []; + this.handler.lineArray = []; + this.handler.activeLine = null; + this.handler.activeShape = null; + this.handler.canvas.renderAll(); + this.handler.interactionHandler.selection(); + }, + addPoint: (opt: FabricEvent) => { + const { e, absolutePointer } = opt; + const { x, y } = absolutePointer; + const circle = new fabric.Circle({ + radius: 1, + fill: '#ffffff', + stroke: '#333333', + strokeWidth: 0.5, + left: x, + top: y, + selectable: false, + hasBorders: false, + hasControls: false, + originX: 'center', + originY: 'center', + hoverCursor: 'pointer', + }) as FabricObject<fabric.Circle>; + circle.set({ + id: fetchUuid(), + }); + if (!this.handler.pointArray.length) { + circle.set({ + fill: 'red', + }); + } + const points = [x, y, x, y]; + const line = new fabric.Line(points, { + strokeWidth: 1, + fill: '#999999', + stroke: '#999999', + originX: 'center', + originY: 'center', + selectable: false, + hasBorders: false, + hasControls: false, + evented: false, + }) as FabricObject<fabric.Line>; + line.set({ + class: 'line', + }); + if (this.handler.activeShape) { + const position = this.handler.canvas.getPointer(e); + const activeShapePoints = this.handler.activeShape.get('points') as Array<{ x: number; y: number }>; + activeShapePoints.push({ + x: position.x, + y: position.y, + }); + const polygon = new fabric.Polygon(activeShapePoints, { + stroke: '#333333', + strokeWidth: 1, + fill: '#cccccc', + opacity: 0.1, + selectable: false, + hasBorders: false, + hasControls: false, + evented: false, + }); + this.handler.canvas.remove(this.handler.activeShape); + this.handler.canvas.add(polygon); + this.handler.activeShape = polygon; + this.handler.canvas.renderAll(); + } else { + const polyPoint = [{ x, y }]; + const polygon = new fabric.Polygon(polyPoint, { + stroke: '#333333', + strokeWidth: 1, + fill: '#cccccc', + opacity: 0.1, + selectable: false, + hasBorders: false, + hasControls: false, + evented: false, + }); + this.handler.activeShape = polygon; + this.handler.canvas.add(polygon); + } + this.handler.activeLine = line; + this.handler.pointArray.push(circle); + this.handler.lineArray.push(line); + this.handler.canvas.add(line); + this.handler.canvas.add(circle); + }, + generate: (pointArray: FabricObject<fabric.Circle>[]) => { + const points = [] as any[]; + const id = fetchUuid(); + pointArray.forEach(point => { + points.push({ + x: point.left, + y: point.top, + }); + this.handler.canvas.remove(point); + }); + this.handler.lineArray.forEach(line => { + this.handler.canvas.remove(line); + }); + this.handler.canvas.remove(this.handler.activeShape).remove(this.handler.activeLine); + const option = { + id, + points, + type: 'polygon', + stroke: 'rgba(0, 0, 0, 1)', + strokeWidth: 1, + fill: 'rgba(0, 0, 0, 0.25)', + opacity: 1, + objectCaching: !this.handler.editable, + name: 'New polygon', + superType: 'drawing', + }; + this.handler.add(option, false); + this.handler.pointArray = []; + this.handler.activeLine = null; + this.handler.activeShape = null; + this.handler.interactionHandler.selection(); + }, + // TODO... polygon resize + // createResize: (target, points) => { + // points.forEach((point, index) => { + // const { x, y } = point; + // const circle = new fabric.Circle({ + // name: index, + // radius: 3, + // fill: '#ffffff', + // stroke: '#333333', + // strokeWidth: 0.5, + // left: x, + // top: y, + // hasBorders: false, + // hasControls: false, + // originX: 'center', + // originY: 'center', + // hoverCursor: 'pointer', + // parentId: target.id, + // }); + // this.handler.pointArray.push(circle); + // }); + // const group = [target].concat(this.pointArray); + // this.handler.canvas.add(new fabric.Group(group, { type: 'polygon', id: fetchUuid() })); + // }, + // removeResize: () => { + // if (this.handler.pointArray) { + // this.handler.pointArray.forEach((point) => { + // this.handler.canvas.remove(point); + // }); + // this.handler.pointArray = []; + // } + // }, + // movingResize: (target, e) => { + // const points = target.diffPoints || target.points; + // const diffPoints = []; + // points.forEach((point) => { + // diffPoints.push({ + // x: point.x + e.movementX, + // y: point.y + e.movementY, + // }); + // }); + // target.set({ + // diffPoints, + // }); + // this.handler.canvas.renderAll(); + // }, + }; + + line = { + init: () => { + this.handler.interactionHandler.drawing('line'); + this.handler.pointArray = []; + this.handler.activeLine = null; + }, + finish: () => { + this.handler.pointArray.forEach(point => { + this.handler.canvas.remove(point); + }); + this.handler.canvas.remove(this.handler.activeLine); + this.handler.pointArray = []; + this.handler.activeLine = null; + this.handler.canvas.renderAll(); + this.handler.interactionHandler.selection(); + }, + addPoint: (opt: FabricEvent) => { + const { absolutePointer } = opt; + const { x, y } = absolutePointer; + const circle = new fabric.Circle({ + radius: 3, + fill: '#ffffff', + stroke: '#333333', + strokeWidth: 0.5, + left: x, + top: y, + selectable: false, + hasBorders: false, + hasControls: false, + originX: 'center', + originY: 'center', + hoverCursor: 'pointer', + }); + if (!this.handler.pointArray.length) { + circle.set({ + fill: 'red', + }); + } + const points = [x, y, x, y]; + this.handler.activeLine = new Line(points, { + strokeWidth: 2, + fill: '#999999', + stroke: '#999999', + originX: 'center', + originY: 'center', + selectable: false, + hasBorders: false, + hasControls: false, + evented: false, + }); + this.handler.activeLine.set({ + class: 'line', + }); + this.handler.pointArray.push(circle); + this.handler.canvas.add(this.handler.activeLine); + this.handler.canvas.add(circle); + }, + generate: (opt: FabricEvent) => { + const { absolutePointer } = opt; + const { x, y } = absolutePointer; + let points = [] as number[]; + const id = fetchUuid(); + this.handler.pointArray.forEach(point => { + points = points.concat(point.left, point.top, x, y); + this.handler.canvas.remove(point); + }); + this.handler.canvas.remove(this.handler.activeLine); + const option = { + id, + points, + type: 'line', + stroke: 'rgba(0, 0, 0, 1)', + strokeWidth: 3, + opacity: 1, + objectCaching: !this.handler.editable, + name: 'New line', + superType: 'drawing', + }; + this.handler.add(option, false); + this.handler.pointArray = []; + this.handler.activeLine = null; + this.handler.interactionHandler.selection(); + }, + }; + + arrow = { + init: () => { + this.handler.interactionHandler.drawing('arrow'); + this.handler.pointArray = []; + this.handler.activeLine = null; + }, + finish: () => { + this.handler.pointArray.forEach(point => { + this.handler.canvas.remove(point); + }); + this.handler.canvas.remove(this.handler.activeLine); + this.handler.pointArray = []; + this.handler.activeLine = null; + this.handler.canvas.renderAll(); + this.handler.interactionHandler.selection(); + }, + addPoint: (opt: FabricEvent) => { + const { absolutePointer } = opt; + const { x, y } = absolutePointer; + const circle = new fabric.Circle({ + radius: 3, + fill: '#ffffff', + stroke: '#333333', + strokeWidth: 0.5, + left: x, + top: y, + selectable: false, + hasBorders: false, + hasControls: false, + originX: 'center', + originY: 'center', + hoverCursor: 'pointer', + }); + if (!this.handler.pointArray.length) { + circle.set({ + fill: 'red', + }); + } + const points = [x, y, x, y]; + this.handler.activeLine = new Arrow(points, { + strokeWidth: 2, + fill: '#999999', + stroke: '#999999', + class: 'line', + originX: 'center', + originY: 'center', + selectable: false, + hasBorders: false, + hasControls: false, + evented: false, + }); + this.handler.pointArray.push(circle); + this.handler.canvas.add(this.handler.activeLine); + this.handler.canvas.add(circle); + }, + generate: (opt: FabricEvent) => { + const { absolutePointer } = opt; + const { x, y } = absolutePointer; + let points = [] as number[]; + this.handler.pointArray.forEach(point => { + points = points.concat(point.left, point.top, x, y); + this.handler.canvas.remove(point); + }); + this.handler.canvas.remove(this.handler.activeLine); + const option = { + id: fetchUuid(), + points, + type: 'arrow', + stroke: 'rgba(0, 0, 0, 1)', + strokeWidth: 3, + opacity: 1, + objectCaching: !this.handler.editable, + name: 'New line', + superType: 'drawing', + }; + this.handler.add(option, false); + this.handler.pointArray = []; + this.handler.activeLine = null; + this.handler.interactionHandler.selection(); + }, + }; + + orthogonal = {}; + + curve = {}; +} + +export default DrawingHandler; diff --git a/src/pages/Fabric/canvas/handlers/ElementHandler.ts b/src/pages/Fabric/canvas/handlers/ElementHandler.ts new file mode 100644 index 0000000..d2b6154 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/ElementHandler.ts @@ -0,0 +1,187 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-12-05 13:39:46 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-05 15:51:59 + * @FilePath: \react-adpro-fabric\src\pages\Fabric\canvas\handlers\ElementHandler.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { fabric } from 'fabric'; + +import Handler from './Handler'; +import { VideoObject } from '../objects/Video'; +import { IframeObject } from '../objects/Iframe'; +import { ElementObject } from '../objects/Element'; + +export type ElementType = 'container' | 'script' | 'style'; + +export type ElementObjectType = VideoObject | IframeObject | ElementObject; + +export interface ElementCode { + html?: string; + css?: string; + js?: string; +} + +class ElementHandler { + handler?: Handler; + + constructor(handler: Handler) { + this.handler = handler; + } + + /** + * Set element by id + * @param {string} id + * @param {*} source + * @returns {void} + */ + public setById = (id: string, source: any): void => { + const obj = this.handler.findById(id) as ElementObjectType; + if (!obj) { + return; + } + this.set(obj, source); + } + + /** + * Set element + * @param {ElementObjectType} obj + * @param {*} source + */ + public set = (obj: ElementObjectType, source: any) => { + obj.setSource(source); + } + + /** + * Find element by id with type + * @param {string} id + * @param {ElementType} [type='container'] + * @returns + */ + public findById = (id: string, type: ElementType = 'container') => { + return document.getElementById(`${id}_${type}`); + } + + /** + * Remove element + * @param {HTMLElement} el + * @returns + */ + public remove = (el: HTMLElement) => { + if (!el) { + return; + } + this.handler.container.removeChild(el); + } + + /** + * Remove element by id + * @param {string} id + */ + public removeById = (id: string) => { + const el = this.findById(id); + const scriptEl = this.findById(id, 'script'); + const styleEl = this.findById(id, 'style'); + if (el) { + if (el.remove) { + el.remove(); + } else { + this.remove(el); + } + } + if (scriptEl) { + if (scriptEl.remove) { + scriptEl.remove(); + } else { + document.head.removeChild(scriptEl); + } + } + if (styleEl) { + if (styleEl.remove) { + styleEl.remove(); + } else { + document.head.removeChild(styleEl); + } + } + } + + /** + * Remove element by ids + * @param {string[]} ids + */ + public removeByIds = (ids: string[]) => { + ids.forEach(id => { + this.removeById(id); + }); + } + + /** + * Set position + * @param {HTMLElement} el + * @param {number} left + * @param {number} top + * @returns + */ + public setPosition = (el: HTMLElement, obj: fabric.Object) => { + if (!el) { + return; + } + obj.setCoords(); + const zoom = this.handler.canvas.getZoom(); + const { scaleX, scaleY, width, height } = obj; + const { left, top } = obj.getBoundingRect(false); + const padLeft = ((width * scaleX * zoom) - width) / 2; + const padTop = ((height * scaleY * zoom) - height) / 2; + el.style.left = `${left + padLeft}px`; + el.style.top = `${top + padTop}px`; + } + + public setPositionByOrigin = (el: HTMLElement, obj: fabric.Object, left: number, top: number) => { + if (!el) { + return; + } + obj.setCoords(); + const zoom = this.handler.canvas.getZoom(); + const { scaleX, scaleY, width, height } = obj; + const padLeft = ((width * scaleX * zoom) - width) / 2; + const padTop = ((height * scaleY * zoom) - height) / 2; + el.style.left = `${left + padLeft}px`; + el.style.top = `${top + padTop}px`; + } + + /** + * Set size + * @param {HTMLElement} el + * @param {number} width + * @param {number} height + * @returns + */ + public setSize = (el: HTMLElement, obj: fabric.Object) => { + if (!el) { + return; + } + const { width, height } = obj; + el.style.width = `${width}px`; + el.style.height = `${height}px`; + } + + /** + * Set scale or angle + * @param {HTMLElement} el + * @param {number} scaleX + * @param {number} scaleY + * @param {number} angle + * @returns + */ + public setScaleOrAngle = (el: HTMLElement, obj: fabric.Object) => { + if (!el) { + return; + } + const zoom = this.handler.canvas.getZoom(); + const { scaleX, scaleY, angle } = obj; + el.style.transform = `rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom})`; + } +} + +export default ElementHandler; diff --git a/src/pages/Fabric/canvas/handlers/EventHandler.ts b/src/pages/Fabric/canvas/handlers/EventHandler.ts new file mode 100644 index 0000000..3725617 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/EventHandler.ts @@ -0,0 +1,879 @@ +// import anime from 'animejs'; +import { fabric } from 'fabric'; +import { code } from '../constants'; +import { NodeObject } from '../objects/Node'; +import { VideoObject } from '../objects/Video'; +import { FabricEvent, FabricObject } from '../utils'; +import Handler from './Handler'; + +/** + * Event Handler Class + * @author salgum1114 + * @class EventHandler + */ +class EventHandler { + handler: Handler; + code: string; + panning: boolean; + + constructor(handler: Handler) { + this.handler = handler; + this.initialize(); + } + + /** + * Attch event on document + * + */ + public initialize() { + if (this.handler.editable) { + // @ts-ignore + this.handler.canvas.on({ + 'object:modified': this.modified, + 'object:scaling': this.scaling, + 'object:scaled': this.scaled, + 'object:moving': this.moving, + 'object:moved': this.moved, + 'object:rotating': this.rotating, + 'object:rotated': this.rotated, + 'mouse:wheel': this.mousewheel, + 'mouse:down': this.mousedown, + 'mouse:move': this.mousemove, + 'mouse:up': this.mouseup, + 'selection:cleared': this.selection, + 'selection:created': this.selection, + 'selection:updated': this.selection, + }); + } else { + // @ts-ignore + this.handler.canvas.on({ + 'mouse:down': this.mousedown, + 'mouse:move': this.mousemove, + 'mouse:out': this.mouseout, + 'mouse:up': this.mouseup, + 'mouse:wheel': this.mousewheel, + }); + } + this.handler.canvas.wrapperEl.tabIndex = 1000; + this.handler.canvas.wrapperEl.addEventListener('keydown', this.keydown, false); + this.handler.canvas.wrapperEl.addEventListener('keyup', this.keyup, false); + this.handler.canvas.wrapperEl.addEventListener('mousedown', this.onmousedown, false); + this.handler.canvas.wrapperEl.addEventListener('contextmenu', this.contextmenu, false); + if (this.handler.keyEvent.clipboard) { + document.addEventListener('paste', this.paste, false); + } + } + + /** + * Detach event on document + * + */ + public destroy = () => { + if (this.handler.editable) { + this.handler.canvas.off({ + 'object:modified': this.modified, + 'object:scaling': this.scaling, + 'object:moving': this.moving, + 'object:moved': this.moved, + 'object:rotating': this.rotating, + 'mouse:wheel': this.mousewheel, + 'mouse:down': this.mousedown, + 'mouse:move': this.mousemove, + 'mouse:up': this.mouseup, + 'selection:cleared': this.selection, + 'selection:created': this.selection, + 'selection:updated': this.selection, + }); + } else { + this.handler.canvas.off({ + 'mouse:down': this.mousedown, + 'mouse:move': this.mousemove, + 'mouse:out': this.mouseout, + 'mouse:up': this.mouseup, + 'mouse:wheel': this.mousewheel, + }); + this.handler.getObjects().forEach(object => { + object.off('mousedown', this.handler.eventHandler.object.mousedown); + // if (object.anime) { + // anime.remove(object); + // } + }); + } + this.handler.canvas.wrapperEl.removeEventListener('keydown', this.keydown); + this.handler.canvas.wrapperEl.removeEventListener('keyup', this.keyup); + this.handler.canvas.wrapperEl.removeEventListener('mousedown', this.onmousedown); + this.handler.canvas.wrapperEl.removeEventListener('contextmenu', this.contextmenu); + if (this.handler.keyEvent.clipboard) { + this.handler.canvas.wrapperEl.removeEventListener('paste', this.paste); + } + }; + + /** + * Individual object event + * + */ + public object = { + /** + * Mouse down event on object + * @param {FabricEvent} opt + */ + mousedown: (opt: FabricEvent) => { + const { target } = opt; + if (target && target.link && target.link.enabled) { + const { onClick } = this.handler; + if (onClick) { + onClick(this.handler.canvas, target); + } + } + }, + /** + * Mouse double click event on object + * @param {FabricEvent} opt + */ + mousedblclick: (opt: FabricEvent) => { + const { target } = opt; + if (target) { + const { onDblClick } = this.handler; + if (onDblClick) { + onDblClick(this.handler.canvas, target); + } + } + }, + }; + + /** + * Modified event object + * + * @param {FabricEvent} opt + * @returns + */ + public modified = (opt: FabricEvent) => { + const { target } = opt; + if (!target) { + return; + } + if (target.type === 'circle' && target.parentId) { + return; + } + const { onModified } = this.handler; + if (onModified) { + onModified(target); + } + }; + + /** + * Moving event object + * + * @param {FabricEvent} opt + * @returns + */ + public moving = (opt: FabricEvent) => { + const { target } = opt as any; + if (this.handler.interactionMode === 'crop') { + this.handler.cropHandler.moving(opt); + } else { + if (this.handler.editable && this.handler.guidelineOption.enabled) { + this.handler.guidelineHandler.movingGuidelines(target); + } + if (target.type === 'activeSelection') { + const activeSelection = target as fabric.ActiveSelection; + activeSelection.getObjects().forEach((obj: any) => { + const left = target.left + obj.left + target.width / 2; + const top = target.top + obj.top + target.height / 2; + if (obj.superType === 'node') { + this.handler.portHandler.setCoords({ ...obj, left, top }); + } else if (obj.superType === 'element') { + const { id } = obj; + const el = this.handler.elementHandler.findById(id); + // TODO... Element object incorrect position + this.handler.elementHandler.setPositionByOrigin(el, obj, left, top); + } + }); + return; + } + if (target.superType === 'node') { + this.handler.portHandler.setCoords(target); + } else if (target.superType === 'element') { + const { id } = target; + const el = this.handler.elementHandler.findById(id); + this.handler.elementHandler.setPosition(el, target); + } + } + }; + + /** + * Moved event object + * + * @param {FabricEvent} opt + */ + public moved = (opt: FabricEvent) => { + const { target } = opt; + this.handler.gridHandler.setCoords(target); + if (!this.handler.transactionHandler.active) { + this.handler.transactionHandler.save('moved'); + } + if (target.superType === 'element') { + const { id } = target; + const el = this.handler.elementHandler.findById(id); + this.handler.elementHandler.setPosition(el, target); + } + }; + + /** + * Scaling event object + * + * @param {FabricEvent} opt + */ + public scaling = (opt: FabricEvent) => { + const { target } = opt as any; + if (this.handler.interactionMode === 'crop') { + this.handler.cropHandler.resize(opt); + } + // TODO...this.handler.guidelineHandler.scalingGuidelines(target); + if (target.superType === 'element') { + const { id, width, height } = target; + const el = this.handler.elementHandler.findById(id); + // update the element + this.handler.elementHandler.setScaleOrAngle(el, target); + this.handler.elementHandler.setSize(el, target); + this.handler.elementHandler.setPosition(el, target); + const video = target as VideoObject; + if (video.type === 'video' && video.player) { + video.player.setPlayerSize(width, height); + } + } + }; + + /** + * Scaled event object + * + * @param {FabricEvent} opt + */ + public scaled = (_opt: FabricEvent) => { + if (!this.handler.transactionHandler.active) { + this.handler.transactionHandler.save('scaled'); + } + }; + + /** + * Rotating event object + * + * @param {FabricEvent} opt + */ + public rotating = (opt: FabricEvent) => { + const { target } = opt as any; + if (target.superType === 'element') { + const { id } = target; + const el = this.handler.elementHandler.findById(id); + // update the element + this.handler.elementHandler.setScaleOrAngle(el, target); + } + }; + + /** + * Rotated event object + * + * @param {FabricEvent} opt + */ + public rotated = (_opt: FabricEvent) => { + if (!this.handler.transactionHandler.active) { + this.handler.transactionHandler.save('rotated'); + } + }; + + /** + * Moing object at keyboard arrow key down event + * + * @param {KeyboardEvent} e + * @returns + */ + public arrowmoving = (e: KeyboardEvent) => { + const activeObject = this.handler.canvas.getActiveObject() as FabricObject; + if (!activeObject) { + return false; + } + if (activeObject.id === 'workarea') { + return false; + } + if (e.code === code.ARROW_UP) { + activeObject.set('top', activeObject.top - 2); + activeObject.setCoords(); + this.handler.canvas.renderAll(); + return true; + } else if (e.code === code.ARROW_DOWN) { + activeObject.set('top', activeObject.top + 2); + activeObject.setCoords(); + this.handler.canvas.renderAll(); + return true; + } else if (e.code === code.ARROW_LEFT) { + activeObject.set('left', activeObject.left - 2); + activeObject.setCoords(); + this.handler.canvas.renderAll(); + return true; + } else if (e.code === code.ARROW_RIGHT) { + activeObject.set('left', activeObject.left + 2); + activeObject.setCoords(); + this.handler.canvas.renderAll(); + return true; + } + if (this.handler.onModified) { + this.handler.onModified(activeObject); + } + return true; + }; + + /** + * Zoom at mouse wheel event + * + * @param {FabricEvent<WheelEvent>} opt + * @returns + */ + public mousewheel = (opt: FabricEvent) => { + const event = opt as FabricEvent<WheelEvent>; + const { zoomEnabled } = this.handler; + if (!zoomEnabled) { + return; + } + const delta = event.e.deltaY; + let zoomRatio = this.handler.canvas.getZoom(); + if (delta > 0) { + zoomRatio -= this.handler.zoomStep; + } else { + zoomRatio += this.handler.zoomStep; + } + this.handler.zoomHandler.zoomToPoint( + new fabric.Point(this.handler.canvas.getWidth() / 2, this.handler.canvas.getHeight() / 2), + zoomRatio, + ); + event.e.preventDefault(); + event.e.stopPropagation(); + }; + + /** + * Mouse down event on object + * + * @param {FabricEvent<MouseEvent>} opt + * @returns + */ + public mousedown = (opt: FabricEvent) => { + const event = opt as FabricEvent<MouseEvent>; + const { editable } = this.handler; + if (event.e.altKey && editable && !this.handler.interactionHandler.isDrawingMode()) { + this.handler.interactionHandler.grab(); + this.panning = true; + return; + } + if (this.handler.interactionMode === 'grab') { + this.panning = true; + return; + } + const { target } = event; + if (editable) { + if (this.handler.prevTarget && this.handler.prevTarget.superType === 'link') { + this.handler.prevTarget.set({ + stroke: this.handler.prevTarget.originStroke || this.handler.prevTarget.stroke, + }); + } + if (target && target.type === 'fromPort') { + this.handler.linkHandler.init(target); + return; + } + if ( + target && + this.handler.interactionMode === 'link' && + (target.type === 'toPort' || target.superType === 'node') + ) { + let toPort; + if (target.superType === 'node') { + toPort = target.toPort; + } else { + toPort = target; + } + this.handler.linkHandler.generate(toPort); + return; + } + this.handler.guidelineHandler.viewportTransform = this.handler.canvas.viewportTransform; + this.handler.guidelineHandler.zoom = this.handler.canvas.getZoom(); + if (this.handler.interactionMode === 'selection') { + if (target && target.superType === 'link') { + target.set({ + stroke: target.selectedStroke || 'green', + }); + } + this.handler.prevTarget = target; + return; + } + if (this.handler.interactionMode === 'polygon') { + if (target && this.handler.pointArray.length && target.id === this.handler.pointArray[0].id) { + this.handler.drawingHandler.polygon.generate(this.handler.pointArray); + } else { + this.handler.drawingHandler.polygon.addPoint(event); + } + } else if (this.handler.interactionMode === 'line') { + if (this.handler.pointArray.length && this.handler.activeLine) { + this.handler.drawingHandler.line.generate(event); + } else { + this.handler.drawingHandler.line.addPoint(event); + } + } else if (this.handler.interactionMode === 'arrow') { + if (this.handler.pointArray.length && this.handler.activeLine) { + this.handler.drawingHandler.arrow.generate(event); + } else { + this.handler.drawingHandler.arrow.addPoint(event); + } + } + } + }; + + /** + * Mouse move event on canvas + * + * @param {FabricEvent<MouseEvent>} opt + * @returns + */ + public mousemove = (opt: FabricEvent) => { + const event = opt as FabricEvent<MouseEvent>; + if (this.handler.interactionMode === 'grab' && this.panning) { + this.handler.interactionHandler.moving(event.e); + this.handler.canvas.requestRenderAll(); + } + if (!this.handler.editable && event.target) { + if (event.target.superType === 'element') { + return; + } + if (event.target.id !== 'workarea') { + if (event.target !== this.handler.target) { + this.handler.tooltipHandler.show(event.target); + } + } else { + this.handler.tooltipHandler.hide(event.target); + } + } + if (this.handler.interactionMode === 'polygon') { + if (this.handler.activeLine && this.handler.activeLine.class === 'line') { + const pointer = this.handler.canvas.getPointer(event.e); + this.handler.activeLine.set({ x2: pointer.x, y2: pointer.y }); + const points = this.handler.activeShape.get('points'); + points[this.handler.pointArray.length] = { + x: pointer.x, + y: pointer.y, + }; + this.handler.activeShape.set({ + points, + }); + this.handler.canvas.requestRenderAll(); + } + } else if (this.handler.interactionMode === 'line') { + if (this.handler.activeLine && this.handler.activeLine.class === 'line') { + const pointer = this.handler.canvas.getPointer(event.e); + this.handler.activeLine.set({ x2: pointer.x, y2: pointer.y }); + } + this.handler.canvas.requestRenderAll(); + } else if (this.handler.interactionMode === 'arrow') { + if (this.handler.activeLine && this.handler.activeLine.class === 'line') { + const pointer = this.handler.canvas.getPointer(event.e); + this.handler.activeLine.set({ x2: pointer.x, y2: pointer.y }); + } + this.handler.canvas.requestRenderAll(); + } else if (this.handler.interactionMode === 'link') { + if (this.handler.activeLine && this.handler.activeLine.class === 'line') { + const pointer = this.handler.canvas.getPointer(event.e); + this.handler.activeLine.set({ x2: pointer.x, y2: pointer.y }); + } + this.handler.canvas.requestRenderAll(); + } + return; + }; + + /** + * Mouse up event on canvas + * + * @param {FabricEvent<MouseEvent>} opt + * @returns + */ + public mouseup = (opt: FabricEvent) => { + const event = opt as FabricEvent<MouseEvent>; + if (this.handler.interactionMode === 'grab') { + this.panning = false; + return; + } + const { target, e } = event; + if (this.handler.interactionMode === 'selection') { + if (target && e.shiftKey && target.superType === 'node') { + const node = target as NodeObject; + this.handler.canvas.discardActiveObject(); + const nodes = [] as NodeObject[]; + this.handler.nodeHandler.getNodePath(node, nodes); + const activeSelection = new fabric.ActiveSelection(nodes, { + canvas: this.handler.canvas, + ...this.handler.activeSelectionOption, + }); + this.handler.canvas.setActiveObject(activeSelection); + this.handler.canvas.requestRenderAll(); + } + } + if (this.handler.editable && this.handler.guidelineOption.enabled) { + this.handler.guidelineHandler.verticalLines.length = 0; + this.handler.guidelineHandler.horizontalLines.length = 0; + } + this.handler.canvas.renderAll(); + }; + + /** + * Mouse out event on canvas + * + * @param {FabricEvent<MouseEvent>} opt + */ + public mouseout = (opt: FabricEvent) => { + const event = opt as FabricEvent<MouseEvent>; + if (!event.target) { + this.handler.tooltipHandler.hide(); + } + }; + + /** + * Selection event event on canvas + * + * @param {FabricEvent} opt + */ + public selection = (opt: FabricEvent) => { + const { onSelect, activeSelectionOption } = this.handler; + const target = opt.target as FabricObject<fabric.ActiveSelection>; + if (target && target.type === 'activeSelection') { + target.set({ + ...activeSelectionOption, + }); + } + if (onSelect) { + onSelect(target); + } + }; + + /** + * Called resize event on canvas + * + * @param {number} nextWidth + * @param {number} nextHeight + * @returns + */ + public resize = (nextWidth: number, nextHeight: number) => { + this.handler.canvas.setWidth(nextWidth).setHeight(nextHeight); + this.handler.canvas.setBackgroundColor( + this.handler.canvasOption.backgroundColor, + this.handler.canvas.renderAll.bind(this.handler.canvas), + ); + if (!this.handler.workarea) { + return; + } + const diffWidth = nextWidth / 2 - this.handler.width / 2; + const diffHeight = nextHeight / 2 - this.handler.height / 2; + this.handler.width = nextWidth; + this.handler.height = nextHeight; + if (this.handler.workarea.layout === 'fixed') { + this.handler.canvas.centerObject(this.handler.workarea); + this.handler.workarea.setCoords(); + if (this.handler.gridOption.enabled) { + return; + } + this.handler.canvas.getObjects().forEach((obj: FabricObject) => { + if (obj.id !== 'workarea') { + const left = obj.left + diffWidth; + const top = obj.top + diffHeight; + obj.set({ + left, + top, + }); + obj.setCoords(); + if (obj.superType === 'element') { + const { id } = obj; + const el = this.handler.elementHandler.findById(id); + // update the element + this.handler.elementHandler.setPosition(el, obj); + } + } + }); + this.handler.canvas.requestRenderAll(); + return; + } + if (this.handler.workarea.layout === 'responsive') { + const { scaleX } = this.handler.workareaHandler.calculateScale(); + const center = this.handler.canvas.getCenter(); + const deltaPoint = new fabric.Point(diffWidth, diffHeight); + this.handler.canvas.relativePan(deltaPoint); + this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), scaleX); + return; + } + const scaleX = nextWidth / this.handler.workarea.width; + const scaleY = nextHeight / this.handler.workarea.height; + const diffScaleX = nextWidth / (this.handler.workarea.width * this.handler.workarea.scaleX); + const diffScaleY = nextHeight / (this.handler.workarea.height * this.handler.workarea.scaleY); + this.handler.workarea.set({ + scaleX, + scaleY, + }); + this.handler.canvas.getObjects().forEach((obj: any) => { + const { id } = obj; + if (obj.id !== 'workarea') { + const left = obj.left * diffScaleX; + const top = obj.top * diffScaleY; + const newScaleX = obj.scaleX * diffScaleX; + const newScaleY = obj.scaleY * diffScaleY; + obj.set({ + scaleX: newScaleX, + scaleY: newScaleY, + left, + top, + }); + obj.setCoords(); + if (obj.superType === 'element') { + const video = obj as VideoObject; + const { width, height } = obj; + const el = this.handler.elementHandler.findById(id); + this.handler.elementHandler.setSize(el, obj); + if (video.player) { + video.player.setPlayerSize(width, height); + } + this.handler.elementHandler.setPosition(el, obj); + } + } + }); + this.handler.canvas.renderAll(); + }; + + /** + * Paste event on canvas + * + * @param {ClipboardEvent} e + * @returns + */ + public paste = async (e: ClipboardEvent) => { + if (this.handler.canvas.wrapperEl !== document.activeElement) { + return false; + } + if (e.preventDefault) { + e.preventDefault(); + } + if (e.stopPropagation) { + e.stopPropagation(); + } + const clipboardData = e.clipboardData; + if (clipboardData.types.length) { + clipboardData.types.forEach((clipboardType: string) => { + if (clipboardType === 'text/plain') { + const textPlain = clipboardData.getData('text/plain'); + try { + const objects = JSON.parse(textPlain); + const { + gridOption: { grid = 10 }, + isCut, + } = this.handler; + const padding = isCut ? 0 : grid; + if (objects && Array.isArray(objects)) { + const filteredObjects = objects.filter(obj => obj !== null); + if (filteredObjects.length === 1) { + const obj = filteredObjects[0]; + if (typeof obj.cloneable !== 'undefined' && !obj.cloneable) { + return; + } + obj.left = obj.properties.left + padding; + obj.top = obj.properties.top + padding; + const createdObj = this.handler.add(obj, false, true); + this.handler.canvas.setActiveObject(createdObj as FabricObject); + this.handler.canvas.requestRenderAll(); + } else { + const nodes = [] as any[]; + const targets = [] as any[]; + objects.forEach(obj => { + if (!obj) { + return; + } + if (obj.superType === 'link') { + obj.fromNodeId = nodes[obj.fromNodeIndex].id; + obj.toNodeId = nodes[obj.toNodeIndex].id; + } else { + obj.left = obj.properties.left + padding; + obj.top = obj.properties.top + padding; + } + const createdObj = this.handler.add(obj, false, true); + if (obj.superType === 'node') { + nodes.push(createdObj); + } else { + targets.push(createdObj); + } + }); + const activeSelection = new fabric.ActiveSelection(nodes.length ? nodes : targets, { + canvas: this.handler.canvas, + ...this.handler.activeSelectionOption, + }); + this.handler.canvas.setActiveObject(activeSelection); + this.handler.canvas.requestRenderAll(); + } + if (!this.handler.transactionHandler.active) { + this.handler.transactionHandler.save('paste'); + } + this.handler.isCut = false; + this.handler.copy(); + } + } catch (error) { + console.error(error); + // const item = { + // id: uuv4id(), + // type: 'textbox', + // text: textPlain, + // }; + // this.handler.add(item, true); + } + } else if (clipboardType === 'text/html') { + // Todo ... + // const textHtml = clipboardData.getData('text/html'); + // console.log(textHtml); + } else if (clipboardType === 'Files') { + // Array.from(clipboardData.files).forEach((file) => { + // const { type } = file; + // if (type === 'image/png' || type === 'image/jpeg' || type === 'image/jpg') { + // const item = { + // id: fetchUuid(), + // type: 'image', + // file, + // superType: 'image', + // }; + // this.handler.add(item, true); + // } else { + // console.error('Not supported file type'); + // } + // }); + } + }); + } + return true; + }; + + /** + * Keydown event on document + * + * @param {KeyboardEvent} e + */ + public keydown = (e: KeyboardEvent) => { + const { keyEvent, editable } = this.handler; + if (!Object.keys(keyEvent).length) { + return; + } + const { clipboard, grab } = keyEvent; + if (this.handler.interactionHandler.isDrawingMode()) { + if (this.handler.shortcutHandler.isEscape(e)) { + if (this.handler.interactionMode === 'polygon') { + this.handler.drawingHandler.polygon.finish(); + } else if (this.handler.interactionMode === 'line') { + this.handler.drawingHandler.line.finish(); + } else if (this.handler.interactionMode === 'arrow') { + this.handler.drawingHandler.arrow.finish(); + } else if (this.handler.interactionMode === 'link') { + this.handler.linkHandler.finish(); + } + } + return; + } + if (this.handler.shortcutHandler.isW(e) && grab) { + this.code = e.code; + this.handler.interactionHandler.grab(); + return; + } + if (e.altKey && editable && grab) { + this.handler.interactionHandler.grab(); + return; + } + if (this.handler.shortcutHandler.isEscape(e)) { + if (this.handler.interactionMode === 'selection') { + this.handler.canvas.discardActiveObject(); + this.handler.canvas.renderAll(); + } + this.handler.tooltipHandler.hide(); + } + if (this.handler.canvas.wrapperEl !== document.activeElement) { + return; + } + if (editable) { + if (this.handler.shortcutHandler.isQ(e)) { + this.code = e.code; + } else if (this.handler.shortcutHandler.isDelete(e)) { + this.handler.remove(); + } else if (this.handler.shortcutHandler.isArrow(e)) { + this.arrowmoving(e); + } else if (this.handler.shortcutHandler.isCtrlA(e)) { + e.preventDefault(); + this.handler.selectAll(); + } else if (this.handler.shortcutHandler.isCtrlC(e)) { + e.preventDefault(); + this.handler.copy(); + } else if (this.handler.shortcutHandler.isCtrlV(e) && !clipboard) { + e.preventDefault(); + this.handler.paste(); + } else if (this.handler.shortcutHandler.isCtrlX(e)) { + e.preventDefault(); + this.handler.cut(); + } else if (this.handler.shortcutHandler.isCtrlZ(e)) { + e.preventDefault(); + this.handler.transactionHandler.undo(); + } else if (this.handler.shortcutHandler.isCtrlY(e)) { + e.preventDefault(); + this.handler.transactionHandler.redo(); + } else if (this.handler.shortcutHandler.isPlus(e)) { + e.preventDefault(); + this.handler.zoomHandler.zoomIn(); + } else if (this.handler.shortcutHandler.isMinus(e)) { + e.preventDefault(); + this.handler.zoomHandler.zoomOut(); + } else if (this.handler.shortcutHandler.isO(e)) { + e.preventDefault(); + this.handler.zoomHandler.zoomOneToOne(); + } else if (this.handler.shortcutHandler.isP(e)) { + e.preventDefault(); + this.handler.zoomHandler.zoomToFit(); + } + return; + } + return; + }; + + /** + * Key up event on canvas + * + * @param {KeyboardEvent} _e + */ + public keyup = (e: KeyboardEvent) => { + if (this.handler.interactionHandler.isDrawingMode()) { + return; + } + if (!this.handler.shortcutHandler.isW(e)) { + this.handler.interactionHandler.selection(); + } + }; + + /** + * Context menu event on canvas + * + * @param {MouseEvent} e + */ + public contextmenu = (e: MouseEvent) => { + e.preventDefault(); + const { editable, onContext } = this.handler; + if (editable && onContext) { + const target = this.handler.canvas.findTarget(e, false) as FabricObject; + if (target && target.type !== 'activeSelection') { + this.handler.select(target); + } + this.handler.contextmenuHandler.show(e, target); + } + }; + + /** + * Mouse down event on canvas + * + * @param {MouseEvent} _e + */ + public onmousedown = (_e: MouseEvent) => { + this.handler.contextmenuHandler.hide(); + }; +} + +export default EventHandler; diff --git a/src/pages/Fabric/canvas/handlers/FiberHandler.ts b/src/pages/Fabric/canvas/handlers/FiberHandler.ts new file mode 100644 index 0000000..e509a88 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/FiberHandler.ts @@ -0,0 +1,21 @@ +import { fabric } from 'fabric'; +import CustomHandler from './CustomHandler'; + +class FiberHandler extends CustomHandler { + protected initialze() { + this.handler.canvas.on('mouse:down', this.mousedown); + } + + private mousedown(opt: fabric.IEvent) { + const { subTargets } = opt; + if (subTargets.length) { + const target = subTargets[0]; + console.log(target); + if (target.type === 'container') { + } else if (target.type === 'coreContainer') { + } + } + } +} + +export default FiberHandler; diff --git a/src/pages/Fabric/canvas/handlers/GridHandler.ts b/src/pages/Fabric/canvas/handlers/GridHandler.ts new file mode 100644 index 0000000..7245285 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/GridHandler.ts @@ -0,0 +1,87 @@ +import { fabric } from 'fabric'; + +import Handler from './Handler'; +import { FabricObject } from '../utils'; +import { NodeObject } from '../objects/Node'; + +class GridHandler { + handler?: Handler; + + constructor(handler: Handler) { + this.handler = handler; + this.initialize(); + } + + /** + * Init grid + * + */ + public initialize = () => { + const { grid, lineColor, borderColor, enabled } = this.handler.gridOption; + if (enabled && grid) { + const width = 5000; + const gridLength = width / grid; + const lineOptions = { + stroke: lineColor, + selectable: false, + evented: false, + id: 'grid', + }; + for (let i = 0; i < gridLength; i++) { + const distance = i * grid; + const fhorizontal = new fabric.Line([distance, -width, distance, width], lineOptions); + const shorizontal = new fabric.Line([distance - width, -width, distance - width, width], lineOptions); + this.handler.canvas.add(fhorizontal); + this.handler.canvas.add(shorizontal); + const fvertical = new fabric.Line([-width, distance - width, width, distance - width], lineOptions); + const svertical = new fabric.Line([-width, distance, width, distance], lineOptions); + this.handler.canvas.add(fvertical); + this.handler.canvas.add(svertical); + if (i % 5 === 0) { + fhorizontal.set({ stroke: borderColor }); + shorizontal.set({ stroke: borderColor }); + fvertical.set({ stroke: borderColor }); + svertical.set({ stroke: borderColor }); + } + } + } + }; + + /** + * Set coords in grid + * @param {(FabricObject | fabric.ActiveSelection)} target + * @returns + */ + public setCoords = (target: FabricObject | fabric.ActiveSelection) => { + const { + gridOption: { enabled, grid, snapToGrid }, + } = this.handler; + if (enabled && grid && snapToGrid) { + if (target.type === 'activeSelection') { + const activeSelection = target as fabric.ActiveSelection; + activeSelection.set({ + left: Math.round(target.left / grid) * grid, + top: Math.round(target.top / grid) * grid, + }); + activeSelection.setCoords(); + activeSelection.getObjects().forEach((obj: any) => { + if (obj.superType === 'node') { + const left = target.left + obj.left + target.width / 2; + const top = target.top + obj.top + target.height / 2; + this.handler.portHandler.setCoords({ ...obj, left, top }); + } + }); + return; + } + const obj = target as FabricObject; + obj.set({ + left: Math.round(target.left / grid) * grid, + top: Math.round(target.top / grid) * grid, + }); + target.setCoords(); + this.handler.portHandler.setCoords(target as NodeObject); + } + }; +} + +export default GridHandler; diff --git a/src/pages/Fabric/canvas/handlers/GuidelineHandler.ts b/src/pages/Fabric/canvas/handlers/GuidelineHandler.ts new file mode 100644 index 0000000..4d1478f --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/GuidelineHandler.ts @@ -0,0 +1,378 @@ +import { fabric } from 'fabric'; +import { FabricEvent, FabricObject, WorkareaObject } from '../utils'; +import Handler from './Handler'; + +class GuidelineHandler { + handler: Handler; + verticalLines: { x?: number; y1?: number; y2?: number }[]; + horizontalLines: { y?: number; x1?: number; x2?: number }[]; + ctx: CanvasRenderingContext2D; + viewportTransform: number[]; + + aligningLineOffset = 5; + aligningLineMargin = 4; + aligningLineWidth = 1; + aligningLineColor = 'rgb(255, 0, 0)'; + zoom = 1; + + constructor(handler: Handler) { + this.handler = handler; + this.initialize(); + } + + /** + * Initialize guideline handler + * + */ + public initialize() { + if (this.handler.guidelineOption.enabled) { + // @ts-ignore + this.handler.canvas.on({ + 'before:render': this.beforeRender, + 'after:render': this.afterRender, + }); + } else { + this.handler.canvas.off({ + 'before:render': this.beforeRender, + 'after:render': this.afterRender, + }); + } + this.ctx = this.handler.canvas.getSelectionContext(); + this.aligningLineOffset = 5; + this.aligningLineMargin = 4; + this.aligningLineWidth = 1; + this.aligningLineColor = 'rgb(255, 0, 0)'; + this.viewportTransform = this.handler.canvas.viewportTransform; + this.zoom = 1; + this.verticalLines = []; + this.horizontalLines = []; + } + + /** + * Destroy guideline handler + * + * @author salgum1114 + */ + public destroy() { + this.handler.canvas.off({ + 'before:render': this.beforeRender, + 'after:render': this.afterRender, + }); + } + + /** + * Before the render + * + * @param {FabricEvent} _opt + */ + public beforeRender = (_opt: FabricEvent) => { + this.handler.canvas.clearContext(this.handler.guidelineHandler.ctx); + }; + + /** + * After the render + * + * @param {FabricEvent} _opt + */ + public afterRender = (_opt: FabricEvent) => { + for (let i = this.handler.guidelineHandler.verticalLines.length; i--; ) { + this.handler.guidelineHandler.drawVerticalLine(this.handler.guidelineHandler.verticalLines[i]); + } + for (let i = this.handler.guidelineHandler.horizontalLines.length; i--; ) { + this.handler.guidelineHandler.drawHorizontalLine(this.handler.guidelineHandler.horizontalLines[i]); + } + this.handler.guidelineHandler.verticalLines.length = 0; + this.handler.guidelineHandler.horizontalLines.length = 0; + }; + + drawVerticalLine = (coords: { x?: number; y1?: number; y2?: number }) => { + this.drawLine( + coords.x + 0.5, + coords.y1 > coords.y2 ? coords.y2 : coords.y1, + coords.x + 0.5, + coords.y2 > coords.y1 ? coords.y2 : coords.y1, + ); + }; + + drawHorizontalLine = (coords: { y?: number; x1?: number; x2?: number }) => { + this.drawLine( + coords.x1 > coords.x2 ? coords.x2 : coords.x1, + coords.y + 0.5, + coords.x2 > coords.x1 ? coords.x2 : coords.x1, + coords.y + 0.5, + ); + }; + + drawLine = (x1: number, y1: number, x2: number, y2: number) => { + const { ctx, aligningLineWidth, aligningLineColor, viewportTransform, zoom } = this; + ctx.save(); + ctx.lineWidth = aligningLineWidth; + ctx.strokeStyle = aligningLineColor; + ctx.beginPath(); + ctx.moveTo(x1 * zoom + viewportTransform[4], y1 * zoom + viewportTransform[5]); + ctx.lineTo(x2 * zoom + viewportTransform[4], y2 * zoom + viewportTransform[5]); + ctx.stroke(); + ctx.restore(); + }; + + isInRange = (v1: number, v2: number) => { + const { aligningLineMargin } = this; + v1 = Math.round(v1); + v2 = Math.round(v2); + for (let i = v1 - aligningLineMargin, len = v1 + aligningLineMargin; i <= len; i++) { + if (i === v2) { + return true; + } + } + return false; + }; + + movingGuidelines = (target: FabricObject) => { + const canvasObjects = this.handler.canvas.getObjects() as FabricObject[]; + const activeObjectCenter = target.getCenterPoint(); + const activeObjectLeft = activeObjectCenter.x; + const activeObjectTop = activeObjectCenter.y; + const activeObjectBoundingRect = target.getBoundingRect(); + const activeObjectHeight = activeObjectBoundingRect.height / this.viewportTransform[3]; + const activeObjectWidth = activeObjectBoundingRect.width / this.viewportTransform[0]; + let horizontalInTheRange = false; + let verticalInTheRange = false; + const { _currentTransform: transform } = this.handler.canvas as any; + if (!transform) { + return; + } + + // It should be trivial to DRY this up by encapsulating (repeating) creation of x1, x2, y1, and y2 into functions, + // but we're not doing it here for perf. reasons -- as this a function that's invoked on every mouse move + + for (let i = canvasObjects.length; i--; ) { + if ( + canvasObjects[i] === target || + canvasObjects[i].superType === 'port' || + canvasObjects[i].superType === 'link' || + !canvasObjects[i].evented + ) { + continue; + } + + const objectCenter = canvasObjects[i].getCenterPoint(); + const objectLeft = objectCenter.x; + const objectTop = objectCenter.y; + const objectBoundingRect = canvasObjects[i].getBoundingRect(); + const objectHeight = objectBoundingRect.height / this.viewportTransform[3]; + const objectWidth = objectBoundingRect.width / this.viewportTransform[0]; + + // snap by the horizontal center line + if (this.isInRange(objectLeft, activeObjectLeft)) { + verticalInTheRange = true; + if (canvasObjects[i].id === 'workarea') { + const y1 = -5000; + const y2 = 5000; + this.verticalLines.push({ + x: objectLeft, + y1, + y2, + }); + } else { + this.verticalLines.push({ + x: objectLeft, + y1: + objectTop < activeObjectTop + ? objectTop - objectHeight / 2 - this.aligningLineOffset + : objectTop + objectHeight / 2 + this.aligningLineOffset, + y2: + activeObjectTop > objectTop + ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset + : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset, + }); + } + target.setPositionByOrigin(new fabric.Point(objectLeft, activeObjectTop), 'center', 'center'); + } + + // snap by the left edge + if (this.isInRange(objectLeft - objectWidth / 2, activeObjectLeft - activeObjectWidth / 2)) { + verticalInTheRange = true; + if (canvasObjects[i].id === 'workarea') { + const workarea = canvasObjects[i] as WorkareaObject; + const y1 = -5000; + const y2 = 5000; + let x = objectLeft - objectWidth / 2; + if (workarea.layout === 'fullscreen') { + x = 0; + } + this.verticalLines.push({ + x, + y1, + y2, + }); + } else { + this.verticalLines.push({ + x: objectLeft - objectWidth / 2, + y1: + objectTop < activeObjectTop + ? objectTop - objectHeight / 2 - this.aligningLineOffset + : objectTop + objectHeight / 2 + this.aligningLineOffset, + y2: + activeObjectTop > objectTop + ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset + : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset, + }); + } + target.setPositionByOrigin( + new fabric.Point(objectLeft - objectWidth / 2 + activeObjectWidth / 2, activeObjectTop), + 'center', + 'center', + ); + } + + // snap by the right edge + if (this.isInRange(objectLeft + objectWidth / 2, activeObjectLeft + activeObjectWidth / 2)) { + verticalInTheRange = true; + if (canvasObjects[i].id === 'workarea') { + const workarea = canvasObjects[i] as WorkareaObject; + const y1 = -5000; + const y2 = 5000; + let x = objectLeft + objectWidth / 2; + if (workarea.layout === 'fullscreen') { + x = this.handler.canvas.getWidth(); + } + this.verticalLines.push({ + x, + y1, + y2, + }); + } else { + this.verticalLines.push({ + x: objectLeft + objectWidth / 2, + y1: + objectTop < activeObjectTop + ? objectTop - objectHeight / 2 - this.aligningLineOffset + : objectTop + objectHeight / 2 + this.aligningLineOffset, + y2: + activeObjectTop > objectTop + ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset + : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset, + }); + } + target.setPositionByOrigin( + new fabric.Point(objectLeft + objectWidth / 2 - activeObjectWidth / 2, activeObjectTop), + 'center', + 'center', + ); + } + + // snap by the vertical center line + if (this.isInRange(objectTop, activeObjectTop)) { + horizontalInTheRange = true; + if (canvasObjects[i].id === 'workarea') { + const x1 = -5000; + const x2 = 5000; + this.horizontalLines.push({ + y: objectTop, + x1, + x2, + }); + } else { + this.horizontalLines.push({ + y: objectTop, + x1: + objectLeft < activeObjectLeft + ? objectLeft - objectWidth / 2 - this.aligningLineOffset + : objectLeft + objectWidth / 2 + this.aligningLineOffset, + x2: + activeObjectLeft > objectLeft + ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset + : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset, + }); + } + target.setPositionByOrigin(new fabric.Point(activeObjectLeft, objectTop), 'center', 'center'); + } + + // snap by the top edge + if (this.isInRange(objectTop - objectHeight / 2, activeObjectTop - activeObjectHeight / 2)) { + horizontalInTheRange = true; + if (canvasObjects[i].id === 'workarea') { + const workarea = canvasObjects[i] as WorkareaObject; + const x1 = -5000; + const x2 = 5000; + let y = objectTop - objectHeight / 2; + if (workarea.layout === 'fullscreen') { + y = 0; + } + this.horizontalLines.push({ + y, + x1, + x2, + }); + } else { + this.horizontalLines.push({ + y: objectTop - objectHeight / 2, + x1: + objectLeft < activeObjectLeft + ? objectLeft - objectWidth / 2 - this.aligningLineOffset + : objectLeft + objectWidth / 2 + this.aligningLineOffset, + x2: + activeObjectLeft > objectLeft + ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset + : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset, + }); + } + target.setPositionByOrigin( + new fabric.Point(activeObjectLeft, objectTop - objectHeight / 2 + activeObjectHeight / 2), + 'center', + 'center', + ); + } + + // snap by the bottom edge + if (this.isInRange(objectTop + objectHeight / 2, activeObjectTop + activeObjectHeight / 2)) { + horizontalInTheRange = true; + if (canvasObjects[i].id === 'workarea') { + const workarea = canvasObjects[i] as WorkareaObject; + const x1 = -5000; + const x2 = 5000; + let y = objectTop + objectHeight / 2; + if (workarea.layout === 'fullscreen') { + y = this.handler.canvas.getHeight(); + } + this.horizontalLines.push({ + y, + x1, + x2, + }); + } else { + this.horizontalLines.push({ + y: objectTop + objectHeight / 2, + x1: + objectLeft < activeObjectLeft + ? objectLeft - objectWidth / 2 - this.aligningLineOffset + : objectLeft + objectWidth / 2 + this.aligningLineOffset, + x2: + activeObjectLeft > objectLeft + ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset + : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset, + }); + } + target.setPositionByOrigin( + new fabric.Point(activeObjectLeft, objectTop + objectHeight / 2 - activeObjectHeight / 2), + 'center', + 'center', + ); + } + } + + if (!horizontalInTheRange) { + this.horizontalLines.length = 0; + } + + if (!verticalInTheRange) { + this.verticalLines.length = 0; + } + }; + + scalingGuidelines = (_target: FabricObject) => { + // TODO... object scaling guideline + }; +} + +export default GuidelineHandler; diff --git a/src/pages/Fabric/canvas/handlers/Handler.ts b/src/pages/Fabric/canvas/handlers/Handler.ts new file mode 100644 index 0000000..2c5e0a9 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/Handler.ts @@ -0,0 +1,1980 @@ +import { fabric } from 'fabric'; +import { union } from 'lodash'; +import { useUuid } from '@/hooks/useUuid'; +import { message } from 'antd'; +import { + AlignmentHandler, + AnimationHandler, + ChartHandler, + ContextmenuHandler, + CropHandler, + CustomHandler, + DrawingHandler, + ElementHandler, + EventHandler, + GridHandler, + GuidelineHandler, + ImageHandler, + InteractionHandler, + LinkHandler, + NodeHandler, + PortHandler, + ShortcutHandler, + TooltipHandler, + TransactionHandler, + WorkareaHandler, + ZoomHandler, +} from '.'; +import CanvasObject from '../CanvasObject'; +import { defaults } from '../constants'; +import { LinkObject } from '../objects/Link'; +import { NodeObject } from '../objects/Node'; +import { PortObject } from '../objects/Port'; +import { + CanvasOption, + FabricCanvas, + FabricElement, + FabricGroup, + FabricImage, + FabricObject, + FabricObjectOption, + FabricObjects, + GridOption, + GuidelineOption, + InteractionMode, + KeyEvent, + WorkareaObject, + WorkareaOption, +} from '../utils'; +import { LinkOption } from './LinkHandler'; +import { TransactionEvent } from './TransactionHandler'; + +// eslint-disable-next-line react-hooks/rules-of-hooks +const { fetchUuid } = useUuid(); + +export interface HandlerCallback { + /** + * When has been added object in Canvas, Called function + * + */ + onAdd?: (object: FabricObject) => void; + /** + * Return contextmenu element + * + */ + onContext?: (el: HTMLDivElement, e: React.MouseEvent, target?: FabricObject) => Promise<any> | any; + /** + * Return tooltip element + * + */ + onTooltip?: (el: HTMLDivElement, target?: FabricObject) => Promise<any> | any; + /** + * When zoom, Called function + */ + onZoom?: (zoomRatio: number) => void; + /** + * When clicked object, Called function + * + */ + onClick?: (canvas: FabricCanvas, target: FabricObject) => void; + /** + * When double clicked object, Called function + * + */ + onDblClick?: (canvas: FabricCanvas, target: FabricObject) => void; + /** + * When modified object, Called function + */ + onModified?: (target: FabricObject) => void; + /** + * When select object, Called function + * + */ + onSelect?: (target: FabricObject) => void; + /** + * When has been removed object in Canvas, Called function + * + */ + onRemove?: (target: FabricObject) => void; + /** + * When has been undo or redo, Called function + * + */ + onTransaction?: (transaction: TransactionEvent) => void; + /** + * When has been changed interaction mode, Called function + * + */ + onInteraction?: (interactionMode: InteractionMode) => void; + /** + * When canvas has been loaded + * + */ + onLoad?: (handler: Handler, canvas?: fabric.Canvas) => void; +} + +export interface HandlerOption { + /** + * Canvas id + * @type {string} + */ + id?: string; + /** + * Canvas object + * @type {FabricCanvas} + */ + canvas?: FabricCanvas; + /** + * Canvas parent element + * @type {HTMLDivElement} + */ + container?: HTMLDivElement; + /** + * Canvas editable + * @type {boolean} + */ + editable?: boolean; + /** + * Canvas interaction mode + * @type {InteractionMode} + */ + interactionMode?: InteractionMode; + /** + * Persist properties for object + * @type {string[]} + */ + propertiesToInclude?: string[]; + /** + * Minimum zoom ratio + * @type {number} + */ + minZoom?: number; + /** + * Maximum zoom ratio + * @type {number} + */ + maxZoom?: number; + /** + * Zoom ratio step + * @type {number} + */ + zoomStep?: number; + /** + * Workarea option + * @type {WorkareaOption} + */ + workareaOption?: WorkareaOption; + /** + * Canvas option + * @type {CanvasOption} + */ + canvasOption?: CanvasOption; + /** + * Grid option + * @type {GridOption} + */ + gridOption?: GridOption; + /** + * Default option for Fabric Object + * @type {FabricObjectOption} + */ + objectOption?: FabricObjectOption; + /** + * Guideline option + * @type {GuidelineOption} + */ + guidelineOption?: GuidelineOption; + /** + * Whether to use zoom + * @type {boolean} + */ + zoomEnabled?: boolean; + /** + * ActiveSelection option + * @type {Partial<FabricObjectOption<fabric.ActiveSelection>>} + */ + activeSelectionOption?: Partial<FabricObjectOption<fabric.ActiveSelection>>; + /** + * Canvas width + * @type {number} + */ + width?: number; + /** + * Canvas height + * @type {number} + */ + height?: number; + /** + * Keyboard event in Canvas + * @type {KeyEvent} + */ + keyEvent?: KeyEvent; + /** + * Append custom objects + * @type {{ [key: string]: any }} + */ + fabricObjects?: FabricObjects; + handlers?: { [key: string]: CustomHandler }; + [key: string]: any; +} + +export type HandlerOptions = HandlerOption & HandlerCallback; + +/** + * Main handler for Canvas + * @class Handler + * @implements {HandlerOptions} + */ +class Handler implements HandlerOptions { + public id: string; + public canvas: FabricCanvas; + public workarea: WorkareaObject; + public container: HTMLDivElement; + public editable: boolean; + public interactionMode: InteractionMode; + public minZoom: number; + public maxZoom: number; + public zoomStep: number = 0.05; + public propertiesToInclude?: string[] = defaults.propertiesToInclude; + public workareaOption?: WorkareaOption = defaults.workareaOption; + public canvasOption?: CanvasOption = defaults.canvasOption; + public gridOption?: GridOption = defaults.gridOption; + public objectOption?: FabricObjectOption = defaults.objectOption; + public guidelineOption?: GuidelineOption = defaults.guidelineOption; + public keyEvent?: KeyEvent = defaults.keyEvent; + public activeSelectionOption?: Partial<FabricObjectOption<fabric.ActiveSelection>> = defaults.activeSelectionOption; + public fabricObjects?: FabricObjects = CanvasObject; + public zoomEnabled?: boolean; + public width?: number; + public height?: number; + + public onAdd?: (object: FabricObject) => void; + public onContext?: (el: HTMLDivElement, e: React.MouseEvent, target?: FabricObject) => Promise<any>; + public onTooltip?: (el: HTMLDivElement, target?: FabricObject) => Promise<any>; + public onZoom?: (zoomRatio: number) => void; + public onClick?: (canvas: FabricCanvas, target: FabricObject) => void; + public onDblClick?: (canvas: FabricCanvas, target: FabricObject) => void; + public onModified?: (target: FabricObject) => void; + public onSelect?: (target: FabricObject) => void; + public onRemove?: (target: FabricObject) => void; + public onTransaction?: (transaction: TransactionEvent) => void; + public onInteraction?: (interactionMode: InteractionMode) => void; + public onLoad?: (handler: Handler, canvas?: fabric.Canvas) => void; + + public imageHandler: ImageHandler; + public chartHandler: ChartHandler; + public elementHandler: ElementHandler; + public cropHandler: CropHandler; + public animationHandler: AnimationHandler; + public contextmenuHandler: ContextmenuHandler; + public tooltipHandler: TooltipHandler; + public zoomHandler: ZoomHandler; + public workareaHandler: WorkareaHandler; + public interactionHandler: InteractionHandler; + public transactionHandler: TransactionHandler; + public gridHandler: GridHandler; + public portHandler: PortHandler; + public linkHandler: LinkHandler; + public nodeHandler: NodeHandler; + public alignmentHandler: AlignmentHandler; + public guidelineHandler: GuidelineHandler; + public eventHandler: EventHandler; + public drawingHandler: DrawingHandler; + public shortcutHandler: ShortcutHandler; + public handlers: { [key: string]: CustomHandler } = {}; + + public objectMap: Record<string, FabricObject> = {}; + public objects: FabricObject[]; + public activeLine?: any; + public activeShape?: any; + public zoom = 1; + public prevTarget?: FabricObject; + public target?: FabricObject; + public pointArray?: any[]; + public lineArray?: any[]; + public isCut = false; + + private isRequsetAnimFrame = false; + private requestFrame: any; + /** + * Copied object + * + * @private + * @type {*} + */ + private clipboard: any; + + constructor(options: HandlerOptions) { + this.initialize(options); + } + + /** + * Initialize handler + * + * @author salgum1114 + * @param {HandlerOptions} options + */ + public initialize(options: HandlerOptions) { + this.initOption(options); + this.initCallback(options); + this.initHandler(); + } + + /** + * Init class fields + * @param {HandlerOptions} options + */ + public initOption = (options: HandlerOptions) => { + this.id = options.id; + this.canvas = options.canvas; + this.container = options.container; + this.editable = options.editable; + this.interactionMode = options.interactionMode; + this.minZoom = options.minZoom; + this.maxZoom = options.maxZoom; + this.zoomStep = options.zoomStep || 0.05; + this.zoomEnabled = options.zoomEnabled; + this.width = options.width; + this.height = options.height; + this.objects = []; + this.setPropertiesToInclude(options.propertiesToInclude); + this.setWorkareaOption(options.workareaOption); + this.setCanvasOption(options.canvasOption); + this.setGridOption(options.gridOption); + this.setObjectOption(options.objectOption); + this.setFabricObjects(options.fabricObjects); + this.setGuidelineOption(options.guidelineOption); + this.setActiveSelectionOption(options.activeSelectionOption); + this.setKeyEvent(options.keyEvent); + }; + + /** + * Initialize callback + * @param {HandlerOptions} options + */ + public initCallback = (options: HandlerOptions) => { + this.onAdd = options.onAdd; + this.onTooltip = options.onTooltip; + this.onZoom = options.onZoom; + this.onContext = options.onContext; + this.onClick = options.onClick; + this.onModified = options.onModified; + this.onDblClick = options.onDblClick; + this.onSelect = options.onSelect; + this.onRemove = options.onRemove; + this.onTransaction = options.onTransaction; + this.onInteraction = options.onInteraction; + this.onLoad = options.onLoad; + }; + + /** + * Initialize handlers + * + */ + public initHandler = () => { + this.workareaHandler = new WorkareaHandler(this); + this.imageHandler = new ImageHandler(this); + this.chartHandler = new ChartHandler(this); + this.elementHandler = new ElementHandler(this); + this.cropHandler = new CropHandler(this); + this.animationHandler = new AnimationHandler(this); + this.contextmenuHandler = new ContextmenuHandler(this); + this.tooltipHandler = new TooltipHandler(this); + this.zoomHandler = new ZoomHandler(this, this.zoomStep); + this.interactionHandler = new InteractionHandler(this); + this.transactionHandler = new TransactionHandler(this); + this.gridHandler = new GridHandler(this); + this.portHandler = new PortHandler(this); + this.linkHandler = new LinkHandler(this); + this.nodeHandler = new NodeHandler(this); + this.alignmentHandler = new AlignmentHandler(this); + this.guidelineHandler = new GuidelineHandler(this); + this.eventHandler = new EventHandler(this); + this.drawingHandler = new DrawingHandler(this); + this.shortcutHandler = new ShortcutHandler(this); + }; + + /** + * Get primary object + * @returns {FabricObject[]} + */ + public getObjects = (): FabricObject[] => { + const objects = this.canvas.getObjects().filter((obj: FabricObject) => { + if (obj.id === 'workarea') { + return false; + } else if (obj.id === 'grid') { + return false; + } else if (obj.superType === 'port') { + return false; + } else if (!obj.id) { + return false; + } + return true; + }) as FabricObject[]; + if (objects.length) { + objects.forEach(obj => (this.objectMap[obj.id] = obj)); + } else { + this.objectMap = {}; + } + return objects; + }; + + /** + * Set key pair + * @param {keyof FabricObject} key + * @param {*} value + * @returns + */ + public set = (key: keyof FabricObject, value: any) => { + const activeObject = this.canvas.getActiveObject() as FabricObject; + if (!activeObject) { + return; + } + if (activeObject.type === 'svg' && (key === 'fill' || key === 'stroke')) { + (activeObject as FabricGroup)._objects.forEach(obj => obj.set(key, value)); + } + activeObject.set(key, value); + activeObject.setCoords(); + this.canvas.requestRenderAll(); + const { id, superType, type, player, width, height } = activeObject as any; + if (superType === 'element') { + if (key === 'visible') { + if (value) { + activeObject.element.style.display = 'block'; + } else { + activeObject.element.style.display = 'none'; + } + } + const el = this.elementHandler.findById(id); + // update the element + this.elementHandler.setScaleOrAngle(el, activeObject); + this.elementHandler.setSize(el, activeObject); + this.elementHandler.setPosition(el, activeObject); + if (type === 'video' && player) { + player.setPlayerSize(width, height); + } + } + const { onModified } = this; + if (onModified) { + onModified(activeObject); + } + }; + + /** + * Set option + * @param {Partial<FabricObject>} option + * @returns + */ + public setObject = (option: Partial<FabricObject>) => { + const activeObject = this.canvas.getActiveObject() as any; + if (!activeObject) { + return; + } + Object.keys(option).forEach(key => { + if (option[key] !== activeObject[key]) { + activeObject.set(key, option[key]); + activeObject.setCoords(); + } + }); + this.canvas.requestRenderAll(); + const { id, superType, type, player, width, height } = activeObject; + if (superType === 'element') { + if ('visible' in option) { + if (option.visible) { + activeObject.element.style.display = 'block'; + } else { + activeObject.element.style.display = 'none'; + } + } + const el = this.elementHandler.findById(id); + // update the element + this.elementHandler.setScaleOrAngle(el, activeObject); + this.elementHandler.setSize(el, activeObject); + this.elementHandler.setPosition(el, activeObject); + if (type === 'video' && player) { + player.setPlayerSize(width, height); + } + } + const { onModified } = this; + if (onModified) { + onModified(activeObject); + } + }; + + /** + * Set key pair by object + * @param {FabricObject} obj + * @param {string} key + * @param {*} value + * @returns + */ + public setByObject = (obj: any, key: string, value: any) => { + if (!obj) { + return; + } + if (obj.type === 'svg') { + if (key === 'fill') { + obj.setFill(value); + } else if (key === 'stroke') { + obj.setStroke(value); + } + } + obj.set(key, value); + obj.setCoords(); + this.canvas.renderAll(); + const { id, superType, type, player, width, height } = obj as any; + if (superType === 'element') { + if (key === 'visible') { + if (value) { + obj.element.style.display = 'block'; + } else { + obj.element.style.display = 'none'; + } + } + const el = this.elementHandler.findById(id); + // update the element + this.elementHandler.setScaleOrAngle(el, obj); + this.elementHandler.setSize(el, obj); + this.elementHandler.setPosition(el, obj); + if (type === 'video' && player) { + player.setPlayerSize(width, height); + } + } + const { onModified } = this; + if (onModified) { + onModified(obj); + } + }; + + /** + * Set key pair by id + * @param {string} id + * @param {string} key + * @param {*} value + */ + public setById = (id: string, key: string, value: any) => { + const findObject = this.findById(id); + this.setByObject(findObject, key, value); + }; + + /** + * Set partial by object + * @param {FabricObject} obj + * @param {FabricObjectOption} option + * @returns + */ + public setByPartial = (obj: FabricObject, option: FabricObjectOption) => { + if (!obj) { + return; + } + if (obj.type === 'svg') { + if (option.fill) { + obj.setFill(option.fill); + } else if (option.stroke) { + obj.setStroke(option.stroke); + } + } + obj.set(option); + obj.setCoords(); + this.canvas.renderAll(); + const { id, superType, type, player, width, height } = obj as any; + if (superType === 'element') { + if ('visible' in option) { + if (option.visible) { + obj.element.style.display = 'block'; + } else { + obj.element.style.display = 'none'; + } + } + const el = this.elementHandler.findById(id); + // update the element + this.elementHandler.setScaleOrAngle(el, obj); + this.elementHandler.setSize(el, obj); + this.elementHandler.setPosition(el, obj); + if (type === 'video' && player) { + player.setPlayerSize(width, height); + } + } + }; + + /** + * Set shadow + * @param {fabric.Shadow} option + * @returns + */ + public setShadow = (option: fabric.IShadowOptions) => { + const activeObject = this.canvas.getActiveObject() as FabricObject; + if (!activeObject) { + return; + } + activeObject.set('shadow', new fabric.Shadow(option)); + this.canvas.requestRenderAll(); + const { onModified } = this; + if (onModified) { + onModified(activeObject); + } + }; + + /** + * Set the image + * @param {FabricImage} obj + * @param {(File | string)} [source] + * @returns + */ + public setImage = (obj: FabricImage, source?: File | string): Promise<FabricImage> => { + return new Promise(resolve => { + if (!source) { + obj.set('file', null); + obj.set('src', null); + resolve( + obj.setSrc('./images/sample/transparentBg.png', () => this.canvas.renderAll(), { + dirty: true, + }) as FabricImage, + ); + } + if (source instanceof File) { + const reader = new FileReader(); + reader.onload = () => { + obj.set('file', source); + obj.set('src', null); + resolve( + obj.setSrc(reader.result as string, () => this.canvas.renderAll(), { + dirty: true, + }) as FabricImage, + ); + }; + reader.readAsDataURL(source); + } else { + obj.set('file', null); + obj.set('src', source); + resolve( + obj.setSrc(source, () => this.canvas.renderAll(), { + dirty: true, + }) as FabricImage, + ); + } + }); + }; + + /** + * Set image by id + * @param {string} id + * @param {*} source + * @returns + */ + public setImageById = (id: string, source: any) => { + const findObject = this.findById(id) as FabricImage; + return Promise.resolve(this.setImage(findObject, source)); + }; + + /** + * Set visible + * @param {boolean} [visible] + * @returns + */ + public setVisible = (visible?: boolean) => { + const activeObject = this.canvas.getActiveObject() as FabricElement; + if (!activeObject) { + return; + } + if (activeObject.superType === 'element') { + if (visible) { + activeObject.element.style.display = 'block'; + } else { + activeObject.element.style.display = 'none'; + } + } + activeObject.set({ + visible, + }); + this.canvas.renderAll(); + }; + + /** + * Set the position on Object + * + * @param {FabricObject} obj + * @param {boolean} [centered] + */ + public centerObject = (obj: FabricObject, centered?: boolean) => { + if (centered) { + this.canvas.centerObject(obj); + obj.setCoords(); + } else { + this.setByPartial(obj, { + left: + obj.left / this.canvas.getZoom() - + obj.width / 2 - + this.canvas.viewportTransform[4] / this.canvas.getZoom(), + top: + obj.top / this.canvas.getZoom() - + obj.height / 2 - + this.canvas.viewportTransform[5] / this.canvas.getZoom(), + }); + } + }; + + /** + * Add object + * @param {FabricObjectOption} obj + * @param {boolean} [centered=true] + * @param {boolean} [loaded=false] + * @param {boolean} [group=false] + * @returns + */ + public add = (obj: FabricObjectOption, centered = true, loaded = false, group = false) => { + const { editable, onAdd, gridOption, objectOption } = this; + const option: any = { + hasControls: editable, + hasBorders: editable, + selectable: editable, + lockMovementX: !editable, + lockMovementY: !editable, + hoverCursor: !editable ? 'pointer' : 'move', + }; + if (obj.type === 'i-text') { + option.editable = false; + } else { + option.editable = editable; + } + if (editable && this.workarea.layout === 'fullscreen') { + option.scaleX = this.workarea.scaleX; + option.scaleY = this.workarea.scaleY; + } + const newOption = Object.assign( + {}, + objectOption, + obj, + { + container: this.container.id, + editable, + }, + option, + ); + // Individually create canvas object + if (obj.superType === 'link') { + return this.linkHandler.create(newOption, loaded); + } + let createdObj; + // Create canvas object + console.log(obj, 'obj_newOption', newOption) + // return + if (obj.type === 'image') { + createdObj = this.addImage(newOption); + } else if (obj.type === 'group') { + createdObj = this.addGroup(newOption); + } else { + createdObj = this.fabricObjects[obj.type].create(newOption); + } + if (group) { + return createdObj; + } + this.canvas.add(createdObj); + this.objects = this.getObjects(); + if (!editable && !(obj.superType === 'element')) { + createdObj.on('mousedown', this.eventHandler.object.mousedown); + } + if (createdObj.dblclick) { + createdObj.on('mousedblclick', this.eventHandler.object.mousedblclick); + } + if (this.objects.some(object => object.type === 'gif')) { + this.startRequestAnimFrame(); + } else { + this.stopRequestAnimFrame(); + } + if (obj.superType !== 'drawing' && obj.superType !== 'link' && editable && !loaded) { + this.centerObject(createdObj, centered); + } + if (createdObj.superType === 'node') { + this.portHandler.create(createdObj as NodeObject); + if (createdObj.iconButton) { + this.canvas.add(createdObj.iconButton); + } + } + if (!editable && createdObj.animation && createdObj.animation.autoplay) { + this.animationHandler.play(createdObj.id); + } + if (createdObj.superType === 'node') { + createdObj.set('shadow', { + color: createdObj.stroke, + } as fabric.Shadow); + } + if (gridOption.enabled) { + this.gridHandler.setCoords(createdObj); + } + if (!this.transactionHandler.active && !loaded) { + this.transactionHandler.save('add'); + } + if (onAdd && editable && !loaded) { + onAdd(createdObj); + } + return createdObj; + }; + + /** + * Add group object + * + * @param {FabricGroup} obj + * @param {boolean} [centered=true] + * @param {boolean} [loaded=false] + * @returns + */ + public addGroup = (obj: FabricGroup) => { + const { objects = [], ...other } = obj; + const _objects = objects.map(child => this.add(child, false, true, true)) as FabricObject[]; + return new fabric.Group(_objects, other) as FabricGroup; + }; + + /** + * Add iamge object + * @param {FabricImage} obj + * @returns + */ + public addImage = (obj: FabricImage) => { + const { objectOption } = this; + const { filters = [], src, file, ...otherOption } = obj; + const image = new Image(); + // if (typeof src === 'string') { + // image.src = src; + // } + const createdObj = new fabric.Image(image, { + ...objectOption, + ...otherOption, + }) as FabricImage; + createdObj.set({ + filters: this.imageHandler.createFilters(filters), + }); + this.setImage(createdObj, src || file); + return createdObj; + }; + + /** + * Remove object + * @param {FabricObject} target + * @returns {any} + */ + public remove = (target?: FabricObject) => { + const activeObject = target || (this.canvas.getActiveObject() as any); + if (this.prevTarget && this.prevTarget.superType === 'link') { + this.linkHandler.remove(this.prevTarget as LinkObject); + if (!this.transactionHandler.active) { + this.transactionHandler.save('remove'); + } + return; + } + if (!activeObject) { + return; + } + if (typeof activeObject.deletable !== 'undefined' && !activeObject.deletable) { + return; + } + if (activeObject.type !== 'activeSelection') { + this.canvas.discardActiveObject(); + if (activeObject.superType === 'element') { + this.elementHandler.removeById(activeObject.id); + } + if (activeObject.superType === 'link') { + this.linkHandler.remove(activeObject); + } else if (activeObject.superType === 'node') { + if (activeObject.toPort) { + if (activeObject.toPort.links.length) { + activeObject.toPort.links.forEach((link: any) => { + this.linkHandler.remove(link, 'from'); + }); + } + this.canvas.remove(activeObject.toPort); + } + if (activeObject.fromPort && activeObject.fromPort.length) { + activeObject.fromPort.forEach((port: any) => { + if (port.links.length) { + port.links.forEach((link: any) => { + this.linkHandler.remove(link, 'to'); + }); + } + this.canvas.remove(port); + }); + } + } + this.canvas.remove(activeObject); + } else { + const { _objects: activeObjects } = activeObject; + const existDeleted = activeObjects.some( + (obj: any) => typeof obj.deletable !== 'undefined' && !obj.deletable, + ); + if (existDeleted) { + return; + } + this.canvas.discardActiveObject(); + activeObjects.forEach((obj: any) => { + if (obj.superType === 'element') { + this.elementHandler.removeById(obj.id); + } else if (obj.superType === 'node') { + if (obj.toPort) { + if (obj.toPort.links.length) { + obj.toPort.links.forEach((link: any) => { + this.linkHandler.remove(link, 'from'); + }); + } + this.canvas.remove(obj.toPort); + } + if (obj.fromPort && obj.fromPort.length) { + obj.fromPort.forEach((port: any) => { + if (port.links.length) { + port.links.forEach((link: any) => { + this.linkHandler.remove(link, 'to'); + }); + } + this.canvas.remove(port); + }); + } + } + this.canvas.remove(obj); + }); + } + if (!this.transactionHandler.active) { + this.transactionHandler.save('remove'); + } + this.objects = this.getObjects(); + const { onRemove } = this; + if (onRemove) { + onRemove(activeObject); + } + }; + + /** + * Remove object by id + * @param {string} id + */ + public removeById = (id: string) => { + const findObject = this.findById(id); + if (findObject) { + this.remove(findObject); + } + }; + + /** + * Delete at origin object list + * @param {string} id + */ + public removeOriginById = (id: string) => { + const object = this.findOriginByIdWithIndex(id); + if (object.index > 0) { + this.objects.splice(object.index, 1); + } + }; + + /** + * Duplicate object + * @returns + */ + public duplicate = () => { + const { + onAdd, + propertiesToInclude, + gridOption: { grid = 10 }, + } = this; + const activeObject = this.canvas.getActiveObject() as FabricObject; + if (!activeObject) { + return; + } + if (typeof activeObject.cloneable !== 'undefined' && !activeObject.cloneable) { + return; + } + activeObject.clone((clonedObj: FabricObject) => { + this.canvas.discardActiveObject(); + clonedObj.set({ + left: clonedObj.left + grid, + top: clonedObj.top + grid, + evented: true, + }); + if (clonedObj.type === 'activeSelection') { + const activeSelection = clonedObj as fabric.ActiveSelection; + activeSelection.canvas = this.canvas; + activeSelection.forEachObject((obj: any) => { + obj.set('id', fetchUuid()); + if (obj.superType === 'node') { + obj.set('shadow', { + color: obj.stroke, + } as fabric.Shadow); + } + this.canvas.add(obj); + this.objects = this.getObjects(); + if (obj.dblclick) { + obj.on('mousedblclick', this.eventHandler.object.mousedblclick); + } + }); + if (onAdd) { + onAdd(activeSelection); + } + activeSelection.setCoords(); + } else { + if (activeObject.id === clonedObj.id) { + clonedObj.set('id', fetchUuid()); + } + if (clonedObj.superType === 'node') { + clonedObj.set('shadow', { + color: clonedObj.stroke, + } as fabric.Shadow); + } + this.canvas.add(clonedObj); + this.objects = this.getObjects(); + if (clonedObj.dblclick) { + clonedObj.on('mousedblclick', this.eventHandler.object.mousedblclick); + } + if (onAdd) { + onAdd(clonedObj); + } + } + this.canvas.setActiveObject(clonedObj); + this.portHandler.create(clonedObj as NodeObject); + this.canvas.requestRenderAll(); + }, propertiesToInclude); + }; + + /** + * Duplicate object by id + * @param {string} id + * @returns + */ + public duplicateById = (id: string) => { + const { + onAdd, + propertiesToInclude, + gridOption: { grid = 10 }, + } = this; + const findObject = this.findById(id); + if (findObject) { + if (typeof findObject.cloneable !== 'undefined' && !findObject.cloneable) { + return false; + } + findObject.clone((cloned: FabricObject) => { + cloned.set({ + left: cloned.left + grid, + top: cloned.top + grid, + id: fetchUuid(), + evented: true, + }); + this.canvas.add(cloned); + this.objects = this.getObjects(); + if (onAdd) { + onAdd(cloned); + } + if (cloned.dblclick) { + cloned.on('mousedblclick', this.eventHandler.object.mousedblclick); + } + this.canvas.setActiveObject(cloned); + this.portHandler.create(cloned as NodeObject); + this.canvas.requestRenderAll(); + }, propertiesToInclude); + } + return true; + }; + + /** + * Cut object + * + */ + public cut = () => { + this.copy(); + this.remove(); + this.isCut = true; + }; + + /** + * Copy to clipboard + * + * @param {*} value + */ + public copyToClipboard = (value: any) => { + const textarea = document.createElement('textarea'); + document.body.appendChild(textarea); + textarea.value = value; + textarea.select(); + document.execCommand('copy'); + document.body.removeChild(textarea); + this.canvas.wrapperEl.focus(); + }; + + /** + * Copy object + * + * @returns + */ + public copy = () => { + const { propertiesToInclude } = this; + const activeObject = this.canvas.getActiveObject() as FabricObject; + if (activeObject && activeObject.superType === 'link') { + return false; + } + if (activeObject) { + if (typeof activeObject.cloneable !== 'undefined' && !activeObject.cloneable) { + return false; + } + if (activeObject.type === 'activeSelection') { + const activeSelection = activeObject as fabric.ActiveSelection; + if (activeSelection.getObjects().some((obj: any) => obj.superType === 'node')) { + if (this.keyEvent.clipboard) { + const links = [] as any[]; + const objects = activeSelection.getObjects().map((obj: any, index: number) => { + if (typeof obj.cloneable !== 'undefined' && !obj.cloneable) { + return null; + } + if (obj.fromPort.length) { + obj.fromPort.forEach((port: any) => { + if (port.links.length) { + port.links.forEach((link: any) => { + const linkTarget = { + fromNodeIndex: index, + fromPortId: port.id, + type: 'curvedLink', + superType: 'link', + } as any; + const findIndex = activeSelection + .getObjects() + .findIndex((compObj: any) => compObj.id === link.toNode.id); + if (findIndex >= 0) { + linkTarget.toNodeIndex = findIndex; + links.push(linkTarget); + } + }); + } + }); + } + return { + name: obj.name, + description: obj.description, + superType: obj.superType, + type: obj.type, + nodeClazz: obj.nodeClazz, + configuration: obj.configuration, + properties: { + left: activeObject.left + activeObject.width / 2 + obj.left || 0, + top: activeObject.top + activeObject.height / 2 + obj.top || 0, + iconName: obj.descriptor.icon, + }, + }; + }); + this.copyToClipboard(JSON.stringify(objects.concat(links), null, '\t')); + return true; + } + this.clipboard = activeObject; + return true; + } + } + activeObject.clone((cloned: FabricObject) => { + if (this.keyEvent.clipboard) { + if (cloned.superType === 'node') { + const node = { + name: cloned.name, + description: cloned.description, + superType: cloned.superType, + type: cloned.type, + nodeClazz: cloned.nodeClazz, + configuration: cloned.configuration, + properties: { + left: cloned.left || 0, + top: cloned.top || 0, + iconName: cloned.descriptor.icon, + }, + }; + const objects = [node]; + this.copyToClipboard(JSON.stringify(objects, null, '\t')); + } else { + this.copyToClipboard(JSON.stringify(cloned.toObject(propertiesToInclude), null, '\t')); + } + } else { + this.clipboard = cloned; + } + }, propertiesToInclude); + } + return true; + }; + + /** + * Paste object + * + * @returns + */ + public paste = () => { + const { + onAdd, + propertiesToInclude, + gridOption: { grid = 10 }, + clipboard, + isCut, + } = this; + const padding = isCut ? 0 : grid; + if (!clipboard) { + return false; + } + if (typeof clipboard.cloneable !== 'undefined' && !clipboard.cloneable) { + return false; + } + this.isCut = false; + if (clipboard.type === 'activeSelection') { + if (clipboard.getObjects().some((obj: any) => obj.superType === 'node')) { + this.canvas.discardActiveObject(); + const objects = [] as any[]; + const linkObjects = [] as LinkOption[]; + clipboard.getObjects().forEach((obj: any) => { + if (typeof obj.cloneable !== 'undefined' && !obj.cloneable) { + return; + } + const clonedObj = obj.duplicate(); + if (clonedObj.type === 'SwitchNode') { + clonedObj.set({ + left: obj.left + padding + padding, + top: obj.top + padding, + }); + } else { + clonedObj.set({ + left: obj.left + padding, + top: obj.top + padding, + }); + } + if (obj.fromPort.length) { + obj.fromPort.forEach((port: PortObject) => { + if (port.links.length) { + port.links.forEach((link: LinkObject) => { + const linkTarget = { + fromNode: clonedObj.id, + fromPort: port.id, + } as any; + const findIndex = clipboard + .getObjects() + .findIndex((compObj: any) => compObj.id === link.toNode.id); + if (findIndex >= 0) { + linkTarget.toNodeIndex = findIndex; + linkObjects.push(linkTarget); + } + }); + } + }); + } + if (clonedObj.dblclick) { + clonedObj.on('mousedblclick', this.eventHandler.object.mousedblclick); + } + this.canvas.add(clonedObj); + this.objects = this.getObjects(); + this.portHandler.create(clonedObj); + objects.push(clonedObj); + }); + if (linkObjects.length) { + linkObjects.forEach((linkObject: any) => { + const { fromNode, fromPort, toNodeIndex } = linkObject; + const toNode = objects[toNodeIndex]; + const link = { + type: 'curvedLink', + fromNodeId: fromNode, + fromPortId: fromPort, + toNodeId: toNode.id, + toPortId: toNode.toPort.id, + }; + this.linkHandler.create(link); + }); + } + const activeSelection = new fabric.ActiveSelection(objects, { + canvas: this.canvas, + ...this.activeSelectionOption, + }); + if (isCut) { + this.clipboard = null; + } else { + this.clipboard = activeSelection; + } + if (!this.transactionHandler.active) { + this.transactionHandler.save('paste'); + } + this.canvas.setActiveObject(activeSelection); + this.canvas.renderAll(); + return true; + } + } + clipboard.clone((clonedObj: any) => { + this.canvas.discardActiveObject(); + clonedObj.set({ + left: clonedObj.left + padding, + top: clonedObj.top + padding, + id: isCut ? clipboard.id : fetchUuid(), + evented: true, + }); + if (clonedObj.type === 'activeSelection') { + clonedObj.canvas = this.canvas; + clonedObj.forEachObject((obj: any) => { + obj.set('id', isCut ? obj.id : fetchUuid()); + this.canvas.add(obj); + if (obj.dblclick) { + obj.on('mousedblclick', this.eventHandler.object.mousedblclick); + } + }); + } else { + if (clonedObj.superType === 'node') { + clonedObj = clonedObj.duplicate(); + } + this.canvas.add(clonedObj); + if (clonedObj.dblclick) { + clonedObj.on('mousedblclick', this.eventHandler.object.mousedblclick); + } + } + const newClipboard = clipboard.set({ + top: clonedObj.top, + left: clonedObj.left, + }); + if (isCut) { + this.clipboard = null; + } else { + this.clipboard = newClipboard; + } + if (clonedObj.superType === 'node') { + this.portHandler.create(clonedObj); + } + if (!this.transactionHandler.active) { + this.transactionHandler.save('paste'); + } + // TODO... + // After toGroup svg elements not rendered. + this.objects = this.getObjects(); + if (onAdd) { + onAdd(clonedObj); + } + clonedObj.setCoords(); + this.canvas.setActiveObject(clonedObj); + this.canvas.requestRenderAll(); + }, propertiesToInclude); + return true; + }; + + /** + * Find object by object + * @param {FabricObject} obj + */ + public find = (obj: FabricObject) => this.findById(obj.id); + + /** + * Find object by id + * @param {string} id + * @returns {(FabricObject | null)} + */ + public findById = (id: string): FabricObject | null => { + let findObject; + const exist = this.objects.some(obj => { + if (obj.id === id) { + findObject = obj; + return true; + } + return false; + }); + if (!exist) { + message.warning('Not found object by id.'); + return null; + } + return findObject; + }; + + /** + * Find object in origin list + * @param {string} id + * @returns + */ + public findOriginById = (id: string) => { + let findObject: FabricObject; + const exist = this.objects.some(obj => { + if (obj.id === id) { + findObject = obj; + return true; + } + return false; + }); + if (!exist) { + console.warn('Not found object by id.'); + return null; + } + return findObject; + }; + + /** + * Return origin object list + * @param {string} id + * @returns + */ + public findOriginByIdWithIndex = (id: string) => { + let findObject; + let index = -1; + const exist = this.objects.some((obj, i) => { + if (obj.id === id) { + findObject = obj; + index = i; + return true; + } + return false; + }); + if (!exist) { + console.warn('Not found object by id.'); + return {}; + } + return { + object: findObject, + index, + }; + }; + + /** + * Select object + * @param {FabricObject} obj + * @param {boolean} [find] + */ + public select = (obj: FabricObject, find?: boolean) => { + let findObject = obj; + if (find) { + findObject = this.find(obj); + } + if (findObject) { + this.canvas.discardActiveObject(); + this.canvas.setActiveObject(findObject); + this.canvas.requestRenderAll(); + } + }; + + /** + * Select by id + * @param {string} id + */ + public selectById = (id: string) => { + const findObject = this.findById(id); + if (findObject) { + this.canvas.discardActiveObject(); + this.canvas.setActiveObject(findObject); + this.canvas.requestRenderAll(); + } + }; + + /** + * Select all + * @returns + */ + public selectAll = () => { + this.canvas.discardActiveObject(); + const filteredObjects = this.canvas.getObjects().filter((obj: any) => { + if (obj.id === 'workarea') { + return false; + } else if (!obj.evented) { + return false; + } else if (obj.superType === 'link') { + return false; + } else if (obj.superType === 'port') { + return false; + } else if (obj.superType === 'element') { + return false; + } else if (obj.locked) { + return false; + } + return true; + }); + if (!filteredObjects.length) { + return; + } + if (filteredObjects.length === 1) { + this.canvas.setActiveObject(filteredObjects[0]); + this.canvas.renderAll(); + return; + } + const activeSelection = new fabric.ActiveSelection(filteredObjects, { + canvas: this.canvas, + ...this.activeSelectionOption, + }); + this.canvas.setActiveObject(activeSelection); + this.canvas.renderAll(); + }; + + /** + * Save origin width, height + * @param {FabricObject} obj + * @param {number} width + * @param {number} height + */ + public originScaleToResize = (obj: FabricObject, width: number, height: number) => { + if (obj.id === 'workarea') { + this.setByPartial(obj, { + workareaWidth: obj.width, + workareaHeight: obj.height, + }); + } + this.setByPartial(obj, { + scaleX: width / obj.width, + scaleY: height / obj.height, + }); + }; + + /** + * When set the width, height, Adjust the size + * @param {number} width + * @param {number} height + */ + public scaleToResize = (width: number, height: number) => { + const activeObject = this.canvas.getActiveObject() as FabricObject; + const { id } = activeObject; + const obj = { + id, + scaleX: width / activeObject.width, + scaleY: height / activeObject.height, + }; + this.setObject(obj); + activeObject.setCoords(); + this.canvas.requestRenderAll(); + }; + + /** + * Import json + * @param {*} json + * @param {(canvas: FabricCanvas) => void} [callback] + */ + public importJSON = async (json: any, callback?: (canvas: FabricCanvas) => void) => { + if (typeof json === 'string') { + json = JSON.parse(json); + } + let prevLeft = 0; + let prevTop = 0; + this.canvas.setBackgroundColor(this.canvasOption.backgroundColor, this.canvas.renderAll.bind(this.canvas)); + const workarea = json.find((obj: FabricObjectOption) => obj.id === 'workarea'); + if (!this.workarea) { + this.workareaHandler.initialize(); + } + if (workarea) { + prevLeft = workarea.left; + prevTop = workarea.top; + this.workarea.set(workarea); + await this.workareaHandler.setImage(workarea.src, true); + this.workarea.setCoords(); + } else { + this.canvas.centerObject(this.workarea); + this.workarea.setCoords(); + prevLeft = this.workarea.left; + prevTop = this.workarea.top; + } + json.forEach((obj: FabricObjectOption) => { + if (obj.id === 'workarea') { + return; + } + const canvasWidth = this.canvas.getWidth(); + const canvasHeight = this.canvas.getHeight(); + const { width, height, scaleX, scaleY, layout, left, top } = this.workarea; + if (layout === 'fullscreen') { + const leftRatio = canvasWidth / (width * scaleX); + const topRatio = canvasHeight / (height * scaleY); + obj.left *= leftRatio; + obj.top *= topRatio; + obj.scaleX *= leftRatio; + obj.scaleY *= topRatio; + } else { + const diffLeft = left - prevLeft; + const diffTop = top - prevTop; + obj.left += diffLeft; + obj.top += diffTop; + } + if (obj.superType === 'element') { + obj.id = fetchUuid(); + } + this.add(obj, false, true); + this.canvas.renderAll(); + }); + this.objects = this.getObjects(); + if (callback) { + callback(this.canvas); + } + return Promise.resolve(this.canvas); + }; + + /** + * Export json + */ + public exportJSON = () => this.canvas.toObject(this.propertiesToInclude).objects as FabricObject[]; + + /** + * Active selection to group + * @returns + */ + public toGroup = (target?: FabricObject) => { + const activeObject = target || (this.canvas.getActiveObject() as fabric.ActiveSelection); + if (!activeObject) { + return null; + } + if (activeObject.type !== 'activeSelection') { + return null; + } + const group = activeObject.toGroup() as FabricObject<fabric.Group>; + group.set({ + id: fetchUuid(), + name: 'New group', + type: 'group', + ...this.objectOption, + }); + this.objects = this.getObjects(); + if (!this.transactionHandler.active) { + this.transactionHandler.save('group'); + } + if (this.onSelect) { + this.onSelect(group); + } + this.canvas.renderAll(); + return group; + }; + + /** + * Group to active selection + * @returns + */ + public toActiveSelection = (target?: FabricObject) => { + const activeObject = target || (this.canvas.getActiveObject() as fabric.Group); + if (!activeObject) { + return; + } + if (activeObject.type !== 'group') { + return; + } + const activeSelection = activeObject.toActiveSelection(); + this.objects = this.getObjects(); + if (!this.transactionHandler.active) { + this.transactionHandler.save('ungroup'); + } + if (this.onSelect) { + this.onSelect(activeSelection); + } + this.canvas.renderAll(); + return activeSelection; + }; + + /** + * Bring forward + */ + public bringForward = () => { + const activeObject = this.canvas.getActiveObject() as FabricObject; + if (activeObject) { + this.canvas.bringForward(activeObject); + if (!this.transactionHandler.active) { + this.transactionHandler.save('bringForward'); + } + const { onModified } = this; + if (onModified) { + onModified(activeObject); + } + } + }; + + /** + * Bring to front + */ + public bringToFront = () => { + const activeObject = this.canvas.getActiveObject() as FabricObject; + if (activeObject) { + this.canvas.bringToFront(activeObject); + if (!this.transactionHandler.active) { + this.transactionHandler.save('bringToFront'); + } + const { onModified } = this; + if (onModified) { + onModified(activeObject); + } + } + }; + + /** + * Send backwards + * @returns + */ + public sendBackwards = () => { + const activeObject = this.canvas.getActiveObject() as FabricObject; + if (activeObject) { + const firstObject = this.canvas.getObjects()[1] as FabricObject; + if (firstObject.id === activeObject.id) { + return; + } + if (!this.transactionHandler.active) { + this.transactionHandler.save('sendBackwards'); + } + this.canvas.sendBackwards(activeObject); + const { onModified } = this; + if (onModified) { + onModified(activeObject); + } + } + }; + + /** + * Send to back + */ + public sendToBack = () => { + const activeObject = this.canvas.getActiveObject() as FabricObject; + if (activeObject) { + this.canvas.sendToBack(activeObject); + this.canvas.sendToBack(this.canvas.getObjects()[1]); + if (!this.transactionHandler.active) { + this.transactionHandler.save('sendToBack'); + } + const { onModified } = this; + if (onModified) { + onModified(activeObject); + } + } + }; + + /** + * Clear canvas + * @param {boolean} [includeWorkarea=false] + */ + public clear = (includeWorkarea = false) => { + const ids = this.canvas.getObjects().reduce((prev, curr: any) => { + if (curr.superType === 'element') { + prev.push(curr.id); + return prev; + } + return prev; + }, []); + this.elementHandler.removeByIds(ids); + if (includeWorkarea) { + this.canvas.clear(); + this.workarea = null; + } else { + this.canvas.discardActiveObject(); + this.canvas.getObjects().forEach((obj: any) => { + if (obj.id === 'grid' || obj.id === 'workarea') { + return; + } + this.canvas.remove(obj); + }); + } + this.objects = this.getObjects(); + this.canvas.renderAll(); + }; + + /** + * Start request animation frame + */ + public startRequestAnimFrame = () => { + if (!this.isRequsetAnimFrame) { + this.isRequsetAnimFrame = true; + const render = () => { + this.canvas.renderAll(); + this.requestFrame = fabric.util.requestAnimFrame(render); + }; + fabric.util.requestAnimFrame(render); + } + }; + + /** + * Stop request animation frame + */ + public stopRequestAnimFrame = () => { + this.isRequsetAnimFrame = false; + const cancelRequestAnimFrame = (() => + window.cancelAnimationFrame || + // || window.webkitCancelRequestAnimationFrame + // || window.mozCancelRequestAnimationFrame + // || window.oCancelRequestAnimationFrame + // || window.msCancelRequestAnimationFrame + clearTimeout)(); + cancelRequestAnimFrame(this.requestFrame); + }; + + /** + * Save target object as image + * @param {FabricObject} targetObject + * @param {string} [option={ name: 'New Image', format: 'png', quality: 1 }] + */ + public saveImage = (targetObject: FabricObject, option = { name: 'New Image', format: 'png', quality: 1 }) => { + let dataUrl; + let target = targetObject; + if (target) { + dataUrl = target.toDataURL(option); + } else { + target = this.canvas.getActiveObject() as FabricObject; + if (target) { + dataUrl = target.toDataURL(option); + } + } + if (dataUrl) { + const anchorEl = document.createElement('a'); + anchorEl.href = dataUrl; + anchorEl.download = `${option.name}.png`; + document.body.appendChild(anchorEl); + anchorEl.click(); + anchorEl.remove(); + } + }; + + /** + * Save canvas as image + * @param {string} [option={ name: 'New Image', format: 'png', quality: 1 }] + */ + public saveCanvasImage = (option = { name: 'New Image', format: 'png', quality: 1 }) => { + // If it's zoomed out/in, the container will also include in the image + // hence need to reset the zoom level. + this.zoomHandler.zoomOneToOne(); + + const { left, top, width, height } = this.workarea; + const dataUrl = this.canvas.toDataURL({ + ...option, + left, + top, + width, + height, + enableRetinaScaling: true, + }); + + if (dataUrl) { + const anchorEl = document.createElement('a'); + anchorEl.href = dataUrl; + anchorEl.download = `${option.name}.png`; + document.body.appendChild(anchorEl); + anchorEl.click(); + anchorEl.remove(); + } + }; + + /** + * Sets "angle" of an instance with centered rotation + * + * @param {number} angle + */ + public rotate = (angle: number) => { + const activeObject = this.canvas.getActiveObject(); + if (activeObject) { + this.set('rotation', angle); + activeObject.rotate(angle); + this.canvas.requestRenderAll(); + } + }; + + /** + * Destroy canvas + * + */ + public destroy = () => { + this.eventHandler.destroy(); + this.guidelineHandler.destroy(); + this.contextmenuHandler.destory(); + this.tooltipHandler.destroy(); + this.clear(true); + }; + + /** + * Set canvas option + * + * @param {CanvasOption} canvasOption + */ + public setCanvasOption = (canvasOption: CanvasOption) => { + this.canvasOption = Object.assign({}, this.canvasOption, canvasOption); + this.canvas.setBackgroundColor(canvasOption.backgroundColor, this.canvas.renderAll.bind(this.canvas)); + if (typeof canvasOption.width !== 'undefined' && typeof canvasOption.height !== 'undefined') { + if (this.eventHandler) { + this.eventHandler.resize(canvasOption.width, canvasOption.height); + } else { + this.canvas.setWidth(canvasOption.width).setHeight(canvasOption.height); + } + } + if (typeof canvasOption.selection !== 'undefined') { + this.canvas.selection = canvasOption.selection; + } + if (typeof canvasOption.hoverCursor !== 'undefined') { + this.canvas.hoverCursor = canvasOption.hoverCursor; + } + if (typeof canvasOption.defaultCursor !== 'undefined') { + this.canvas.defaultCursor = canvasOption.defaultCursor; + } + if (typeof canvasOption.preserveObjectStacking !== 'undefined') { + this.canvas.preserveObjectStacking = canvasOption.preserveObjectStacking; + } + }; + + /** + * Set keyboard event + * + * @param {KeyEvent} keyEvent + */ + public setKeyEvent = (keyEvent: KeyEvent) => { + this.keyEvent = Object.assign({}, this.keyEvent, keyEvent); + }; + + /** + * Set fabric objects + * + * @param {FabricObjects} fabricObjects + */ + public setFabricObjects = (fabricObjects: FabricObjects) => { + this.fabricObjects = Object.assign({}, this.fabricObjects, fabricObjects); + }; + + /** + * Set workarea option + * + * @param {WorkareaOption} workareaOption + */ + public setWorkareaOption = (workareaOption: WorkareaOption) => { + this.workareaOption = Object.assign({}, this.workareaOption, workareaOption); + if (this.workarea) { + this.workarea.set({ + ...workareaOption, + }); + } + }; + + /** + * Set guideline option + * + * @param {GuidelineOption} guidelineOption + */ + public setGuidelineOption = (guidelineOption: GuidelineOption) => { + this.guidelineOption = Object.assign({}, this.guidelineOption, guidelineOption); + if (this.guidelineHandler) { + this.guidelineHandler.initialize(); + } + }; + + /** + * Set grid option + * + * @param {GridOption} gridOption + */ + public setGridOption = (gridOption: GridOption) => { + this.gridOption = Object.assign({}, this.gridOption, gridOption); + }; + + /** + * Set object option + * + * @param {FabricObjectOption} objectOption + */ + public setObjectOption = (objectOption: FabricObjectOption) => { + this.objectOption = Object.assign({}, this.objectOption, objectOption); + }; + + /** + * Set activeSelection option + * + * @param {Partial<FabricObjectOption<fabric.ActiveSelection>>} activeSelectionOption + */ + public setActiveSelectionOption = (activeSelectionOption: Partial<FabricObjectOption<fabric.ActiveSelection>>) => { + this.activeSelectionOption = Object.assign({}, this.activeSelectionOption, activeSelectionOption); + }; + + /** + * Set propertiesToInclude + * + * @param {string[]} propertiesToInclude + */ + public setPropertiesToInclude = (propertiesToInclude: string[]) => { + this.propertiesToInclude = union(propertiesToInclude, this.propertiesToInclude); + }; + + /** + * Register custom handler + * + * @param {string} name + * @param {typeof CustomHandler} handler + */ + public registerHandler = (name: string, handler: typeof CustomHandler) => { + this.handlers[name] = new handler(this); + return this.handlers[name]; + }; +} + +export default Handler; diff --git a/src/pages/Fabric/canvas/handlers/ImageHandler.ts b/src/pages/Fabric/canvas/handlers/ImageHandler.ts new file mode 100644 index 0000000..0f94b71 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/ImageHandler.ts @@ -0,0 +1,683 @@ +import { fabric } from 'fabric'; +import {isEqual} from 'lodash'; +import Handler from './Handler'; + +export type GrayscaleModeType = 'average' | 'luminosity' | 'lightness'; + +export interface RemoveColorFilter { + color?: string; + distance?: number; + fragmentSource?: any; + useAlpahe?: any; +} + +export interface BlendColorFilter { + color?: string; + mode?: string; + alpha?: number; +} + +export interface GammaFilter { + gamma?: number[]; +} + +export interface BlendImageFilter { + image?: fabric.Image; + mode?: string; + alpha?: number; +} + +export interface HueRotationFilter { + rotation?: number; +} + +export type ResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos'; + +export interface ResizeFilter { + resizeType?: ResizeType; + scaleX?: number; + scaleY?: number; + lanczosLobes?: number; +} + +export interface TintFilter { + color?: string; + opacity?: number; +} + +export interface MaskFilter { + mask?: fabric.Image; + /** + * Rgb channel (0, 1, 2 or 3) + * @default 0 + */ + channel: number; +} + +export interface MultiplyFilter { + /** + * Color to multiply the image pixels with + * @default #000000 + */ + color: string; +} + +export interface GradientTransparencyFilter { + /** @default 100 */ + threshold?: number; +} + +export interface ColorMatrixFilter { + /** Filter matrix */ + matrix?: number[]; +} + +export interface RemoveWhiteFilter { + /** @default 30 */ + threshold?: number; + /** @default 20 */ + distance?: number; +} + +export type ValuesOf<T extends any[]> = T[number]; + +export interface IFilter { + type: typeof FILTER_TYPES[number]; + [key: string]: any; +} + +export const FILTER_TYPES = [ + 'grayscale', + 'invert', + 'remove-color', + 'sepia', + 'brownie', + 'brightness', + 'contrast', + 'saturation', + 'noise', + 'vintage', + 'pixelate', + 'blur', + 'sharpen', + 'emboss', + 'technicolor', + 'polaroid', + 'blend-color', + 'gamma', + 'kodachrome', + 'blackwhite', + 'blend-image', + 'hue', + 'resize', + 'tint', + 'mask', + 'multiply', + 'sepia2', +]; + +export const capitalize = (str: string) => (str ? str.charAt(0).toUpperCase() + str.slice(1) : false); + +const SHARPEN_MATRIX = [0, -1, 0, -1, 5, -1, 0, -1, 0]; +const EMBOSS_MATRIX = [1, 1, 1, 1, 0.7, -1, -1, -1, -1]; + +/** + * Image Handler + * @author salgum1114 + * @date 2019-09-01 + * @class ImageHandler + * @implements {IBaseHandler} + */ +class ImageHandler { + handler: Handler; + + constructor(handler: Handler) { + this.handler = handler; + } + + /** + * Create filter by type + * @param {IFilter} filter + */ + public createFilter = (filter: IFilter) => { + const { type: filterType, ...other } = filter; + const type = filterType.toLowerCase(); + if (type === 'grayscale') { + return new fabric.Image.filters.Grayscale(other); + } else if (type === 'invert') { + return new fabric.Image.filters.Invert(); + // } else if (type === 'remove-color') { + // return new fabric.Image.filters.RemoveColor(other); + } else if (type === 'sepia') { + return new fabric.Image.filters.Sepia(); + // } else if (type === 'brownie') { + // return new fabric.Image.filters.Brownie(); + } else if (type === 'brightness') { + return new fabric.Image.filters.Brightness({ brightness: other.brightness }); + } else if (type === 'contrast') { + return new fabric.Image.filters.Contrast(other); + } else if (type === 'saturation') { + return new fabric.Image.filters.Saturation(other); + } else if (type === 'noise') { + return new fabric.Image.filters.Noise({ noise: other.noise }); + // } else if (type === 'vintage') { + // return new fabric.Image.filters.Vintage(); + } else if (type === 'pixelate') { + return new fabric.Image.filters.Pixelate(other); + // } else if (type === 'blur') { + // return new fabric.Image.filters.Blur(other); + } else if (type === 'sharpen') { + return new fabric.Image.filters.Convolute({ + matrix: SHARPEN_MATRIX, + }); + } else if (type === 'emboss') { + return new fabric.Image.filters.Convolute({ + matrix: EMBOSS_MATRIX, + }); + // } else if (type === 'technicolor') { + // return new fabric.Image.filters.Technicolor(); + // } else if (type === 'polaroid') { + // return new fabric.Image.filters.Polaroid(); + } else if (type === 'blend-color') { + return new fabric.Image.filters.BlendColor(other); + // } else if (type === 'gamma') { + // return new fabric.Image.filters.Gamma(other); + // } else if (type === 'kodachrome') { + // return new fabric.Image.filters.Kodachrome(); + // } else if (type === 'blackwhite') { + // return new fabric.Image.filters.BlackWhite(); + } else if (type === 'blend-image') { + return new fabric.Image.filters.BlendImage(other); + // } else if (type === 'hue') { + // return new fabric.Image.filters.HueRotation(other); + } else if (type === 'resize') { + return new fabric.Image.filters.Resize(other); + } else if (type === 'tint') { + return new fabric.Image.filters.Tint(other); + } else if (type === 'mask') { + return new fabric.Image.filters.Mask({ + channel: other.channel, + mask: other.mask, + }); + } else if (type === 'multiply') { + return new fabric.Image.filters.Multiply({ + color: other.color, + }); + } else if (type === 'sepia2') { + return new fabric.Image.filters.Sepia2(other); + } + return false; + }; + + /** + * Create filter by types + * @param {IFilter[]} filters + */ + public createFilters = (filters: IFilter[]) => { + return filters.reduce((prev, filter) => { + let type = filter.type; + if (type.toLowerCase() === 'convolute' && isEqual(filter.matrix, SHARPEN_MATRIX)) { + type = 'sharpen'; + } else if (type.toLowerCase() === 'convolute' && isEqual(filter.matrix, EMBOSS_MATRIX)) { + type = 'emboss'; + } + const findIndex = FILTER_TYPES.findIndex(filterType => type.toLowerCase() === filterType); + if (findIndex > -1) { + prev[findIndex] = this.createFilter({ + ...filter, + type, + }); + } + return prev; + }, []); + }; + + /** + * Apply filter by type + * @param {string} type + * @param {*} [value] + * @param {fabric.Image} [imageObj] + */ + public applyFilterByType = (type: string, apply = true, value?: any, imageObj?: fabric.Image): void => { + const obj = imageObj || (this.handler.canvas.getActiveObject() as any); + const findIndex = FILTER_TYPES.findIndex(ft => ft === type); + if (obj.filters && findIndex > -1) { + if (apply) { + obj.filters[findIndex] = this.createFilter({ + type, + ...value, + }); + obj.applyFilters(); + } else { + obj.filters[findIndex] = false; + obj.applyFilters(); + } + this.handler.canvas.requestRenderAll(); + } + }; + + /** + * Apply filter in image + * @param {fabric.Image} [imageObj] + * @param {number} index + * @param {fabric.IBaseFilter} filter + */ + public applyFilter = (index: number, filter: fabric.IBaseFilter | boolean, imageObj?: fabric.Image): void => { + const obj = imageObj || (this.handler.canvas.getActiveObject() as any); + if (obj.filters) { + obj.filters[index] = filter; + obj.applyFilters(); + this.handler.canvas.requestRenderAll(); + } + }; + + /** + * Apply filter value in image + * @param {fabric.Image} [imageObj] + * @param {number} index + * @param {string} prop + * @param {any} value + */ + public applyFilterValue = (index: number, prop: string, value: any, imageObj?: fabric.Image): void => { + const obj = imageObj || (this.handler.canvas.getActiveObject() as fabric.Image); + if (obj.filters) { + const filter = obj.filters[index]; + if (filter) { + filter.setOptions({ + [prop]: value, + }); + obj.applyFilters(); + this.handler.canvas.requestRenderAll(); + } + } + }; + + /** + * Apply grayscale in image + * @param {fabric.Image} [imageObj] + * @param {boolean} [grayscale=false] + * @param {GrayscaleModeType} [value] + */ + public applyGrayscale = (grayscale = false, value?: GrayscaleModeType, imageObj?: fabric.Image): void => { + this.applyFilter( + 0, + grayscale && + new fabric.Image.filters.Grayscale( + value + ? { + mode: value, + } + : undefined, + ), + imageObj, + ); + }; + + /** + * Apply invert in image + * @param {fabric.Image} [imageObj] + * @param {boolean} [invert=false] + */ + public applyInvert = (invert = false, imageObj?: fabric.Image): void => { + this.applyFilter(1, invert && new fabric.Image.filters.Invert(), imageObj); + }; + + /** + * Apply remove color in image + * @param {fabric.Image} [imageObj] + * @param {boolean} [removeColor=false] + * @param {RemoveColorFilter} [value] + */ + // public applyRemoveColor = (removeColor = false, value?: RemoveColorFilter, imageObj?: fabric.Image): void => { + // this.applyFilter(2, removeColor && new fabric.Image.filters.RemoveColor(value), imageObj); + // } + + /** + * Apply sepia in image + * @param {fabric.Image} [imageObj] + * @param {boolean} [sepia=false] + */ + public applySepia = (sepia = false, imageObj?: fabric.Image): void => { + this.applyFilter(3, sepia && new fabric.Image.filters.Sepia(), imageObj); + }; + + /** + * Apply brownie in image + * @param {boolean} [brownie=false] + * @param {fabric.Image} [imageObj] + */ + // public applyBrownie = (brownie = false, imageObj?: fabric.Image): void => { + // this.applyFilter(4, brownie && new fabric.Image.filters.Brownie(), imageObj); + // } + + /** + * Apply brightness in image + * @param {boolean} [brightness=false] + * @param {number} [value] + * @param {fabric.Image} [imageObj] + */ + public applyBrightness = (brightness = false, value?: number, imageObj?: fabric.Image): void => { + this.applyFilter( + 5, + brightness && + new fabric.Image.filters.Brightness( + value + ? { + brightness: value, + } + : undefined, + ), + imageObj, + ); + }; + + /** + * Apply contrast in image + * @param {boolean} [contrast=false] + * @param {number} [value] + * @param {fabric.Image} [imageObj] + */ + public applyContrast = (contrast = false, value?: number, imageObj?: fabric.Image): void => { + this.applyFilter( + 6, + contrast && + new fabric.Image.filters.Contrast( + value + ? { + contrast: value, + } + : undefined, + ), + imageObj, + ); + }; + + /** + * Apply saturation in image + * @param {boolean} [saturation=false] + * @param {number} [value] + * @param {fabric.Image} [imageObj] + */ + public applySaturation = (saturation = false, value?: number, imageObj?: fabric.Image): void => { + this.applyFilter( + 7, + saturation && + new fabric.Image.filters.Saturation( + value + ? { + saturation: value, + } + : undefined, + ), + imageObj, + ); + }; + + /** + * Apply noise in image + * @param {boolean} [noise=false] + * @param {number} [value] + * @param {fabric.Image} [imageObj] + */ + public applyNoise = (noise = false, value?: number, imageObj?: fabric.Image): void => { + this.applyFilter( + 8, + noise && + new fabric.Image.filters.Noise( + value + ? { + noise: value, + } + : undefined, + ), + imageObj, + ); + }; + + /** + * Apply vintage in image + * @param {boolean} [vintage=false] + * @param {fabric.Image} [imageObj] + */ + // public applyVintage = (vintage = false, imageObj?: fabric.Image): void => { + // this.applyFilter(9, vintage && new fabric.Image.filters.Vintage(), imageObj); + // } + + /** + * Apply pixelate in image + * @param {boolean} [pixelate=false] + * @param {number} [value] + * @param {fabric.Image} [imageObj] + */ + public applyPixelate = (pixelate = false, value?: number, imageObj?: fabric.Image): void => { + this.applyFilter( + 10, + pixelate && + new fabric.Image.filters.Pixelate( + value + ? { + blocksize: value, + } + : undefined, + ), + imageObj, + ); + }; + + /** + * Apply blur in image + * @param {boolean} [blur=false] + * @param {number} [value] + * @param {fabric.Image} imageObj + */ + // public applyBlur = (blur = false, value?: number, imageObj?: fabric.Image): void => { + // this.applyFilter(11, blur && new fabric.Image.filters.Blur(value ? { + // value, + // } : undefined), imageObj); + // } + + /** + * Apply sharpen in image + * @param {boolean} [sharpen=false] + * @param {number[]} [value=[0, -1, 0, -1, 5, -1, 0, -1, 0]] + * @param {fabric.Image} [imageObj] + */ + public applySharpen = (sharpen = false, value: number[] = SHARPEN_MATRIX, imageObj?: fabric.Image): void => { + this.applyFilter( + 12, + sharpen && + new fabric.Image.filters.Convolute( + value + ? { + matrix: value, + } + : undefined, + ), + imageObj, + ); + }; + + /** + * Apply emboss in image + * @param {boolean} [emboss=false] + * @param {number[]} [value=[1, 1, 1, 1, 0.7, -1, -1, -1, -1]] + * @param {fabric.Image} [imageObj] + */ + public applyEmboss = (emboss = false, value: number[] = EMBOSS_MATRIX, imageObj?: fabric.Image): void => { + this.applyFilter( + 13, + emboss && + new fabric.Image.filters.Convolute( + value + ? { + matrix: value, + } + : undefined, + ), + imageObj, + ); + }; + + /** + * Apply technicolor in image + * @param {boolean} [technicolor=false] + * @param {fabric.Image} [imageObj] + */ + // public applyTechnicolor = (technicolor = false, imageObj?: fabric.Image): void => { + // this.applyFilter(14, technicolor && new fabric.Image.filters.Technicolor(), imageObj); + // } + + /** + * Apply polaroid in image + * @param {boolean} [polaroid=false] + * @param {fabric.Image} [imageObj] + */ + // public applyPolaroid = (polaroid = false, imageObj?: fabric.Image): void => { + // this.applyFilter(15, polaroid && new fabric.Image.filters.Polaroid(), imageObj); + // } + + /** + * Apply blend color in image + * @param {boolean} [blend=false] + * @param {BlendColorFilter} [value] + * @param {fabric.Image} [imageObj] + */ + public applyBlendColor = (blend = false, value?: BlendColorFilter, imageObj?: fabric.Image): void => { + this.applyFilter(16, blend && new fabric.Image.filters.BlendColor(value), imageObj); + }; + + /** + * Apply gamma in image + * @param {boolean} [gamma=false] + * @param {GammaFilter} [value] + * @param {fabric.Image} [imageObj] + */ + // public applyGamma = (gamma = false, value?: GammaFilter, imageObj?: fabric.Image): void => { + // this.applyFilter(17, gamma && new fabric.Image.filters.Gamma(value), imageObj); + // } + + /** + * Apply kodachrome in image + * @param {boolean} [kodachrome=false] + * @param {fabric.Image} [imageObj] + */ + // public applyKodachrome = (kodachrome = false, imageObj?: fabric.Image): void => { + // this.applyFilter(18, kodachrome && new fabric.Image.filters.Kodachrome(), imageObj); + // } + + /** + * Apply black white in image + * @param {boolean} [blackWhite=false] + * @param {fabric.Image} [imageObj] + */ + // public applyBlackWhite = (blackWhite = false, imageObj?: fabric.Image): void => { + // this.applyFilter(19, blackWhite && new fabric.Image.filters.BlackWhite(), imageObj); + // } + + /** + * Apply blend image in image + * @param {boolean} [blendImage=false] + * @param {BlendImageFilter} value + * @param {fabric.Image} [imageObj] + */ + public applyBlendImage = (blendImage = false, value?: BlendImageFilter, imageObj?: fabric.Image): void => { + this.applyFilter(20, blendImage && new fabric.Image.filters.BlendImage(value), imageObj); + }; + + /** + * Apply hue rotation in image + * @param {boolean} [hue=false] + * @param {HueRotationFilter} [value] + * @param {fabric.Image} [imageObj] + */ + // public applyHue = (hue = false, value?: HueRotationFilter, imageObj?: fabric.Image): void => { + // this.applyFilter(21, hue && new fabric.Image.filters.HueRotation(value ? { + // rotation: value, + // } : undefined), imageObj); + // } + + /** + * Apply resize in image + * @param {boolean} [resize=false] + * @param {ResizeFilter} [value] + * @param {fabric.Image} [imageObj] + */ + public applyResize = (resize = false, value?: ResizeFilter, imageObj?: fabric.Image): void => { + this.applyFilter(22, resize && new fabric.Image.filters.Resize(value), imageObj); + }; + + /** + * Apply tint in image + * @param {boolean} [tint=false] + * @param {TintFilter} [value] + * @param {fabric.Image} [imageObj] + */ + public applyTint = (tint = false, value?: TintFilter, imageObj?: fabric.Image): void => { + this.applyFilter(23, tint && new fabric.Image.filters.Tint(value), imageObj); + }; + + /** + * Apply mask in image + * @param {boolean} [mask=false] + * @param {MaskFilter} [value] + * @param {fabric.Image} [imageObj] + */ + public applyMask = (mask = false, value?: MaskFilter, imageObj?: fabric.Image): void => { + this.applyFilter(24, mask && new fabric.Image.filters.Mask(value), imageObj); + }; + + /** + * Apply multiply in image + * @param {boolean} [multiply=false] + * @param {MultiplyFilter} [value] + * @param {fabric.Image} [imageObj] + */ + public applyMultiply = (multiply = false, value?: MultiplyFilter, imageObj?: fabric.Image): void => { + this.applyFilter(25, multiply && new fabric.Image.filters.Multiply(value), imageObj); + }; + + /** + * Apply sepia2 in image + * @param {boolean} [sepia2=false] + * @param {fabric.Image} [imageObj] + */ + public applySepia2 = (sepia2 = false, imageObj?: fabric.Image): void => { + this.applyFilter(26, sepia2 && new fabric.Image.filters.Sepia2(), imageObj); + }; + + /** + * Apply gradient transparency in image + * @param {boolean} [gradientTransparency=false] + * @param {GradientTransparencyFilter} [value] + * @param {fabric.Image} [imageObj] + */ + public applyGradientTransparency = ( + gradientTransparency = false, + value?: GradientTransparencyFilter, + imageObj?: fabric.Image, + ): void => { + this.applyFilter(27, gradientTransparency && new fabric.Image.filters.GradientTransparency(value), imageObj); + }; + + /** + * Apply color matrix in image + * @param {boolean} [colorMatrix=false] + * @param {ColorMatrixFilter} [value] + * @param {fabric.Image} [imageObj] + */ + public applyColorMatrix = (colorMatrix = false, value?: ColorMatrixFilter, imageObj?: fabric.Image): void => { + this.applyFilter(28, colorMatrix && new fabric.Image.filters.ColorMatrix(value), imageObj); + }; + + /** + * Apply remove white in image + * @param {boolean} [removeWhite=false] + * @param {RemoveWhiteFilter} [value] + * @param {fabric.Image} [imageObj] + */ + public applyRemoveWhite = (removeWhite = false, value?: RemoveWhiteFilter, imageObj?: fabric.Image): void => { + this.applyFilter(29, removeWhite && new fabric.Image.filters.RemoveWhite(value), imageObj); + }; +} + +export default ImageHandler; diff --git a/src/pages/Fabric/canvas/handlers/InteractionHandler.ts b/src/pages/Fabric/canvas/handlers/InteractionHandler.ts new file mode 100644 index 0000000..aaa93d5 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/InteractionHandler.ts @@ -0,0 +1,177 @@ +import { fabric } from 'fabric'; +import { FabricObject, InteractionMode } from '../utils'; +import Handler from './Handler'; + +type IReturnType = { selectable?: boolean; evented?: boolean } | boolean; + +class InteractionHandler { + handler: Handler; + + constructor(handler: Handler) { + this.handler = handler; + if (this.handler.editable) { + this.selection(); + } + } + + /** + * Change selection mode + * @param {(obj: FabricObject) => IReturnType} [callback] + */ + public selection = (callback?: (obj: FabricObject) => IReturnType) => { + if (this.handler.interactionMode === 'selection') { + return; + } + this.handler.interactionMode = 'selection'; + if (typeof this.handler.canvasOption.selection === 'undefined') { + this.handler.canvas.selection = true; + } else { + this.handler.canvas.selection = this.handler.canvasOption.selection; + } + this.handler.canvas.defaultCursor = 'default'; + this.handler.workarea.hoverCursor = 'default'; + this.handler.getObjects().forEach(obj => { + if (callback) { + this.interactionCallback(obj, callback); + } else { + // When typeof selection is ActiveSelection, ignoring selectable, because link position left: 0, top: 0 + if (obj.superType === 'link' || obj.superType === 'port') { + obj.selectable = false; + obj.evented = true; + obj.hoverCursor = 'pointer'; + return; + } + if (this.handler.editable) { + obj.hoverCursor = 'move'; + } else { + obj.hoverCursor = 'pointer'; + } + obj.selectable = true; + obj.evented = true; + } + }); + this.handler.canvas.renderAll(); + this.handler.onInteraction?.('selection'); + }; + + /** + * Change grab mode + * @param {(obj: FabricObject) => IReturnType} [callback] + */ + public grab = (callback?: (obj: FabricObject) => IReturnType) => { + if (this.handler.interactionMode === 'grab') { + return; + } + this.handler.interactionMode = 'grab'; + this.handler.canvas.selection = false; + this.handler.canvas.defaultCursor = 'grab'; + this.handler.workarea.hoverCursor = 'grab'; + this.handler.getObjects().forEach(obj => { + if (callback) { + this.interactionCallback(obj, callback); + } else { + obj.selectable = false; + obj.evented = this.handler.editable ? false : true; + } + }); + this.handler.canvas.renderAll(); + this.handler.onInteraction?.('grab'); + }; + + /** + * Change drawing mode + * @param {InteractionMode} [type] + * @param {(obj: FabricObject) => IReturnType} [callback] + */ + public drawing = (type?: InteractionMode, callback?: (obj: FabricObject) => IReturnType) => { + if (this.isDrawingMode()) { + return; + } + this.handler.interactionMode = type; + this.handler.canvas.selection = false; + this.handler.canvas.defaultCursor = 'pointer'; + this.handler.workarea.hoverCursor = 'pointer'; + this.handler.getObjects().forEach(obj => { + if (callback) { + this.interactionCallback(obj, callback); + } else { + obj.selectable = false; + obj.evented = this.handler.editable ? false : true; + } + }); + this.handler.canvas.renderAll(); + this.handler.onInteraction?.(type); + }; + + public linking = (callback?: (obj: FabricObject) => IReturnType) => { + if (this.isDrawingMode()) { + return; + } + this.handler.interactionMode = 'link'; + this.handler.canvas.selection = false; + this.handler.canvas.defaultCursor = 'default'; + this.handler.workarea.hoverCursor = 'default'; + this.handler.getObjects().forEach(obj => { + if (callback) { + this.interactionCallback(obj, callback); + } else { + if (obj.superType === 'node' || obj.superType === 'port') { + obj.hoverCursor = 'pointer'; + obj.selectable = false; + obj.evented = true; + return; + } + obj.selectable = false; + obj.evented = this.handler.editable ? false : true; + } + }); + this.handler.canvas.renderAll(); + this.handler.onInteraction?.('link'); + }; + + /** + * Moving objects in grap mode + * @param {MouseEvent} e + */ + public moving = (e: MouseEvent) => { + if (this.isDrawingMode()) { + return; + } + const delta = new fabric.Point(e.movementX, e.movementY); + this.handler.canvas.relativePan(delta); + this.handler.canvas.requestRenderAll(); + this.handler.objects.forEach(obj => { + if (obj.superType === 'element') { + const { id } = obj; + const el = this.handler.elementHandler.findById(id); + // update the element + this.handler.elementHandler.setPosition(el, obj); + } + }); + }; + + /** + * Whether is drawing mode + * @returns + */ + public isDrawingMode = () => { + return ( + this.handler.interactionMode === 'link' || + this.handler.interactionMode === 'arrow' || + this.handler.interactionMode === 'line' || + this.handler.interactionMode === 'polygon' + ); + }; + + /** + * Interaction callback + * + * @param {FabricObject} obj + * @param {(obj: FabricObject) => void} [callback] + */ + private interactionCallback = (obj: FabricObject, callback?: (obj: FabricObject) => void) => { + callback(obj); + }; +} + +export default InteractionHandler; diff --git a/src/pages/Fabric/canvas/handlers/LinkHandler.ts b/src/pages/Fabric/canvas/handlers/LinkHandler.ts new file mode 100644 index 0000000..a232d76 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/LinkHandler.ts @@ -0,0 +1,297 @@ +import { message } from 'antd'; +import { CurvedLink } from '../objects'; +import { LinkObject } from '../objects/Link'; +import { NodeObject } from '../objects/Node'; +import { PortObject } from '../objects/Port'; +import Handler from './Handler'; + +export interface LinkOption { + /** + * Link Type + * @type {string} + */ + type: string; + /** + * FromNode id of Link + * @type {string} + */ + fromNodeId?: string; + /** + * FromPort id of Link + * @type {string} + */ + fromPortId?: string; + /** + * ToNode id of Link + * @type {string} + */ + toNodeId?: string; + /** + * ToPort id of Link + * @type {string} + */ + toPortId?: string; +} + +/** + * Link Handler Class + * @author salgum1114 + * @class LinkHandler + */ +class LinkHandler { + private port: PortObject = null; + handler: Handler; + + constructor(handler: Handler) { + this.handler = handler; + } + + /** + * On source port click, start link + * @param {PortObject} port + */ + init = (port: PortObject) => { + if (this.isDrawing()) { + return; + } + if (this.isConnected(port)) { + return; + } + this.port = port; + this.port.set({ + fill: port.selectFill, + }); + this.handler.interactionHandler.linking(); + const { left, top, nodeId, id } = port; + const fromPort = { left, top, id }; + const toPort = { left, top }; + const fromNode = this.handler.objectMap[nodeId]; + this.handler.activeLine = new CurvedLink(fromNode, fromPort, null, toPort, { + strokeWidth: 4, + fill: '#999999', + stroke: '#999999', + class: 'line', + originX: 'center', + originY: 'center', + selectable: false, + hasBorders: false, + hasControls: false, + evented: false, + }); + this.handler.canvas.add(this.handler.activeLine); + }; + + /** + * End drawing link. + */ + finish = (link?: LinkObject) => { + if (!link) { + this.port.set({ + fill: this.port.originFill, + }); + } + this.handler.interactionHandler.selection(); + this.handler.canvas.remove(this.handler.activeLine); + this.handler.activeLine = null; + this.handler.canvas.renderAll(); + }; + + /** + * On dest port click, finish link + * @param {PortObject} port + */ + generate = (port: PortObject) => { + if (!port) { + message.warning(!port); + return; + } + if (this.isDuplicate(port)) { + return; + } + if (this.isSameNode(port)) { + return; + } + const link = { + type: 'curvedLink', + fromNodeId: this.handler.activeLine.fromNode.id, + fromPortId: this.handler.activeLine.fromPort.id, + toNodeId: port.nodeId, + toPortId: port.id, + }; + const createdLink = this.create(link); + this.finish(createdLink); + // TODO... + // Save transactions unconditionally + if (!this.handler.transactionHandler.active) { + this.handler.transactionHandler.save('add'); + } + }; + + /** + * Add link in Canvas + * @param {LinkOption} link + * @param {boolean} [loaded=false] + * @returns + */ + create = (link: LinkOption, loaded = false) => { + const fromNode = this.handler.objectMap[link.fromNodeId] as NodeObject; + const fromPort = fromNode.fromPort.filter((port) => port.id === link.fromPortId || !port.id)[0]; + const toNode = this.handler.objectMap[link.toNodeId] as NodeObject; + const { toPort } = toNode; + const createdObj = this.handler.fabricObjects[link.type].create( + fromNode, + fromPort, + toNode, + toPort, + { + ...link, + }, + ) as LinkObject; + this.handler.canvas.add(createdObj); + this.handler.objects = this.handler.getObjects(); + const { editable } = this.handler; + if (this.handler.onAdd && editable && !loaded) { + this.handler.onAdd(createdObj); + } + this.handler.canvas.renderAll(); + createdObj.setPort(fromNode, fromPort, toNode, toPort); + this.handler.portHandler.setCoords(fromNode); + this.handler.portHandler.setCoords(toNode); + this.handler.canvas.requestRenderAll(); + return createdObj; + }; + + /** + * Set coordinate of link + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {LinkObject} link + */ + setCoords = (x1: number, y1: number, x2: number, y2: number, link: LinkObject) => { + link.set({ + x1, + y1, + x2, + y2, + }); + link.setCoords(); + }; + + /** + * When the link is deleted, linked FromNode delete + * @param {LinkObject} link + */ + removeFrom = (link: LinkObject) => { + if (link.fromPort) { + let index = -1; + if (link.fromPort.links.length) { + link.fromPort.links.some((portLink: any, i: number) => { + if (link.id === portLink.id) { + index = i; + return true; + } + return false; + }); + if (index > -1) { + link.fromPort.links.splice(index, 1); + } + } + link.setPortEnabled(link.fromNode, link.fromPort, true); + } + }; + + /** + * When the link is deleted, linked ToNode delete + * @param {LinkObject} link + */ + removeTo = (link: LinkObject) => { + if (link.toNode.toPort.links.length) { + let index = -1; + link.toNode.toPort.links.some((portLink: any, i: number) => { + if (link.id === portLink.id) { + index = i; + return true; + } + return false; + }); + if (index > -1) { + link.toNode.toPort.links.splice(index, 1); + } + link.setPortEnabled(link.toNode, link.toNode.toPort, true); + } + }; + + /** + * When the link is deleted, linked node delete + * @param {LinkObject} link + */ + removeAll = (link: LinkObject) => { + this.removeFrom(link); + this.removeTo(link); + }; + + /** + * Remove link in canvas + * @param {LinkObject} link + * @param {string} [type] + */ + remove = (link: LinkObject, type?: string) => { + if (type === 'from') { + this.removeFrom(link); + } else if (type === 'to') { + this.removeTo(link); + } else { + this.removeAll(link); + } + this.handler.canvas.remove(link); + this.handler.objects = this.handler.getObjects(); + }; + + /** + * Check if there is a port connected + * @param {PortObject} port + * @returns + */ + isConnected = (port: PortObject) => { + message.warning('A connected node already exists.'); + return !port.enabled; + }; + + /** + * Check if select same node + * @param {PortObject} port + * @returns + */ + isSameNode = (port: PortObject) => { + const validate = port.nodeId === this.handler.activeLine.fromNode.id; + message.warning('Cannot select the same node.'); + return validate; + }; + + /** + * Check if select same node + * @param {PortObject} port + * @returns + */ + isDuplicate = (port: PortObject) => { + const validate = port.links.some( + (link) => link.fromNode.id === this.handler.activeLine.fromNode.id, + ); + message.warning('Duplicate connections cannot be made.'); + return validate; + }; + + /** + * Check if draw the link + * @returns + */ + isDrawing = () => { + const validate = this.handler.interactionMode === 'link' && this.handler.activeLine; + message.warning('Already drawing links.'); + return validate; + }; +} + +export default LinkHandler; diff --git a/src/pages/Fabric/canvas/handlers/NodeHandler.ts b/src/pages/Fabric/canvas/handlers/NodeHandler.ts new file mode 100644 index 0000000..71dd580 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/NodeHandler.ts @@ -0,0 +1,283 @@ +import { fabric } from 'fabric'; +import { LinkObject } from '../objects/Link'; +import { NodeObject } from '../objects/Node'; +import { FabricObject } from '../utils'; +import Handler from './Handler'; + +class NodeHandler { + handler: Handler; + constructor(handler: Handler) { + this.handler = handler; + } + + /** + * Get the node path by target object + * @param {NodeObject} target + * @param {NodeObject[]} [nodes=[]] + * @param {string} [direction='init'] + */ + getNodePath = (target: NodeObject, nodes: NodeObject[] = [], direction = 'init') => { + if (target) { + if (direction === 'to' || direction === 'init') { + if (target.toPort) { + target.toPort.links.forEach(link => { + if (link.fromNode) { + nodes.push(link.fromNode); + this.getNodePath(link.fromNode, nodes, 'to'); + } + }); + } + if (direction === 'init') { + nodes.push(target); + } + } + if (direction === 'from' || direction === 'init') { + target.fromPort.forEach(port => { + port.links.forEach(link => { + if (link.toNode) { + nodes.push(link.toNode); + this.getNodePath(link.toNode, nodes, 'from'); + } + }); + }); + } + } + }; + + /** + * Select the node path + * @param {string[]} [path] + */ + selectByPath = (path?: string[]) => { + if (!path || !path.length) { + return; + } + const targetObjects = this.handler.objects.filter(object => path.some(id => id === object.id)); + const nonTargetObjects = this.handler.objects.filter(object => path.some(id => id !== object.id)); + nonTargetObjects.forEach((object: any) => { + if (object.superType === 'link') { + const { fromNode, toNode } = object as LinkObject; + if (fromNode && toNode) { + const fromIndex = targetObjects.findIndex(obj => obj.id === fromNode.id); + const toIndex = targetObjects.findIndex(obj => obj.id === toNode.id); + if (fromIndex >= 0 && targetObjects[fromIndex] && toIndex >= 0 && targetObjects[toIndex]) { + object.set({ + opacity: 1, + shadow: { + color: object.stroke, + }, + }); + this.highlightingNode(object, 300); + this.handler.canvas.requestRenderAll(); + return; + } + } + } + object.set({ + opacity: 0.2, + }); + if (object.superType === 'node') { + if (object.toPort) { + object.toPort.set({ + opacity: 0.2, + }); + } + object.fromPort.forEach((port: any) => { + port.set({ + opacity: 0.2, + }); + }); + } + if (!object.animating) { + object.set('shadow', { + blur: 0, + }); + } + }); + targetObjects.forEach((object: any) => { + object.set({ + opacity: 1, + shadow: { + color: object.stroke, + }, + }); + this.highlightingNode(object, 300); + if (object.toPort) { + object.toPort.set({ + opacity: 1, + }); + } + if (object.fromPort) { + object.fromPort.forEach((port: any) => { + port.set({ + opacity: 1, + }); + }); + } + }); + this.handler.canvas.requestRenderAll(); + }; + + /** + * Select node by id + * @param {string} id + */ + selectById = (id: string) => { + this.handler.objects.forEach((object: FabricObject) => { + if (id === object.id) { + object.set('shadow', { + color: object.stroke, + blur: 50, + } as fabric.Shadow); + return; + } else if (id === object.nodeId) { + return; + } + object.set('shadow', { + blur: 0, + } as fabric.Shadow); + }); + this.handler.canvas.requestRenderAll(); + }; + + /** + * Deselect nodes + */ + deselect = () => { + this.handler.objects.forEach((object: FabricObject) => { + object.set({ + opacity: 1, + }); + if (object.superType === 'node') { + const node = object as NodeObject; + if (node.toPort) { + node.toPort.set({ + opacity: 1, + }); + } + node.fromPort.forEach(port => { + port.set({ + opacity: 1, + }); + }); + } + if (!object.animating) { + const node = object as FabricObject; + node.set('shadow', { + blur: 0, + } as fabric.Shadow); + } + }); + this.handler.canvas.renderAll(); + }; + + /** + * Highlight path by ids + * @param {string[]} [path] + */ + highlightingByPath = (path?: string[]) => { + if (!path || !path.length) { + return; + } + const targetObjects = this.handler.objects.filter((obj: FabricObject) => path.some(id => id === obj.id)); + const nonTargetObjects = this.handler.objects.filter((obj: FabricObject) => path.some(id => id !== obj.id)); + const lastObject = targetObjects.filter((obj: FabricObject) => obj.id === path[path.length - 1])[0]; + targetObjects.forEach((object: FabricObject) => { + if (lastObject) { + object.set('shadow', { + color: lastObject.stroke, + } as fabric.Shadow); + } else { + object.set('shadow', { + color: object.stroke, + } as fabric.Shadow); + } + this.highlightingNode(object); + this.handler.canvas.requestRenderAll(); + }); + nonTargetObjects.forEach((object: FabricObject) => { + if (object.superType === 'link') { + const { fromNode, toNode } = object; + if (fromNode && toNode) { + const fromIndex = targetObjects.findIndex((obj: FabricObject) => obj.id === fromNode.id); + const toIndex = targetObjects.findIndex((obj: FabricObject) => obj.id === toNode.id); + if (fromIndex >= 0 && targetObjects[fromIndex] && toIndex >= 0 && targetObjects[toIndex]) { + if (lastObject) { + object.set('shadow', { + color: lastObject.stroke, + } as fabric.Shadow); + } else { + object.set('shadow', { + color: object.stroke, + } as fabric.Shadow); + } + this.highlightingNode(object); + this.highlightingLink(object, lastObject); + return; + } + } + } + }); + this.handler.canvas.requestRenderAll(); + }; + + /** + * Highlight link + * @param {FabricObject} object + * @param {FabricObject} targetObject + * @param {number} [duration=500] + */ + highlightingLink = (object: FabricObject, targetObject: FabricObject, duration = 500) => { + object.animation = { + duration, + type: 'flash', + stroke: targetObject ? targetObject.stroke : object.stroke, + loop: 1, + delay: 0, + }; + this.handler.animationHandler.play(object.id, false); + }; + + /** + * Highlight node + * + * @param {*} object + * @param {number} [duration=500] + * @param {number} [minBlur=0] + * @param {number} [maxBlur=50] + */ + highlightingNode = (object: FabricObject, duration = 500, minBlur = 0, maxBlur = 50) => { + const onComplete = () => { + if ((object.shadow as fabric.Shadow).blur === maxBlur) { + object.animating = true; + object.animate('shadow.blur', minBlur, { + easing: fabric.util.ease.easeInOutQuad, + onChange: (value: number) => { + (object.shadow as fabric.Shadow).blur = value; + this.handler.canvas.requestRenderAll(); + }, + onComplete: () => { + object.animating = false; + if (object.superType === 'link') { + object.set({ + stroke: object.originStroke || object.stroke, + }); + } + }, + }); + } + }; + object.animating = true; + object.animate('shadow.blur', maxBlur, { + easing: fabric.util.ease.easeInOutQuad, + duration, + onChange: (value: number) => { + (object.shadow as fabric.Shadow).blur = value; + this.handler.canvas.requestRenderAll(); + }, + onComplete, + }); + }; +} + +export default NodeHandler; diff --git a/src/pages/Fabric/canvas/handlers/PortHandler.ts b/src/pages/Fabric/canvas/handlers/PortHandler.ts new file mode 100644 index 0000000..996ee80 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/PortHandler.ts @@ -0,0 +1,195 @@ +import Handler from './Handler'; +import { NodeObject } from '../objects/Node'; +import { PortObject } from '../objects/Port'; + +class PortHandler { + handler?: Handler; + + constructor(handler: Handler) { + this.handler = handler; + } + + /** + * Create port + * @param {NodeObject} target + */ + create = (target: NodeObject) => { + if (!target.createToPort) { + return; + } + const toPort = target.createToPort(target.left + target.width / 2, target.top); + if (toPort) { + toPort.on('mouseover', () => { + if ( + this.handler.interactionMode === 'link' && + this.handler.activeLine && + this.handler.activeLine.class === 'line' + ) { + if (toPort.links.some(link => link.fromNode === this.handler.activeLine.fromNode)) { + toPort.set({ + fill: 'red', + }); + this.handler.canvas.renderAll(); + return; + } + toPort.set({ + fill: 'green', + }); + this.handler.canvas.renderAll(); + } + }); + toPort.on('mouseout', () => { + toPort.set({ + fill: toPort.originFill, + }); + this.handler.canvas.renderAll(); + }); + this.handler.canvas.add(toPort); + toPort.setCoords(); + this.handler.canvas.bringToFront(toPort); + } + const fromPort = target.createFromPort(target.left + target.width / 2, target.top + target.height); + if (fromPort && fromPort.length) { + fromPort.forEach(port => { + if (port) { + port.on('mouseover', () => { + if (this.handler.interactionMode !== 'link') { + if (port.enabled) { + if (this.handler.activeLine) { + port.set({ + fill: 'red', + }); + this.handler.canvas.renderAll(); + return; + } + port.set({ + fill: 'green', + }); + this.handler.canvas.renderAll(); + return; + } + port.set({ + fill: 'red', + }); + this.handler.canvas.renderAll(); + } + }); + port.on('mouseout', () => { + if (this.handler.interactionMode !== 'link') { + port.set({ + fill: port.enabled ? port.originFill : port.hoverFill, + }); + } + this.handler.canvas.renderAll(); + }); + this.handler.canvas.add(port); + port.setCoords(); + this.handler.canvas.bringToFront(port); + } + }); + } + }; + + /** + * Set coords port + * @param {NodeObject} target + */ + setCoords = (target: NodeObject) => { + if (target.toPort) { + const toCoords = { + left: target.left + target.width / 2, + top: target.top, + }; + target.toPort.set({ + ...toCoords, + }); + target.toPort.setCoords(); + if (target.toPort.links.length) { + target.toPort.links.forEach(link => { + const fromPort = link.fromNode.fromPort.filter(port => port.id === link.fromPort.id)[0]; + this.handler.linkHandler.setCoords(fromPort.left, fromPort.top, toCoords.left, toCoords.top, link); + }); + } + } + if (target.fromPort) { + const fromCoords = { + left: target.left + target.width / 2, + top: target.top + target.height, + }; + target.fromPort.forEach(port => { + const left = port.leftDiff ? fromCoords.left + port.leftDiff : fromCoords.left; + const top = port.topDiff ? fromCoords.top + port.topDiff : fromCoords.top; + port.set({ + left, + top, + }); + port.setCoords(); + if (port.links.length) { + port.links.forEach(link => { + this.handler.linkHandler.setCoords( + left, + top, + link.toNode.toPort.left, + link.toNode.toPort.top, + link, + ); + }); + } + }); + } + }; + + /** + * Recreate port + * @param {NodeObject} target + */ + recreate = (target: NodeObject) => { + const { fromPort, toPort } = target; + const ports = target.ports as PortObject[]; + if (ports) { + ports.forEach(port => { + target.removeWithUpdate(port); + this.handler.canvas.remove(port.fromPort); + }); + } + this.handler.canvas.remove(target.toPort); + if (target.toPort) { + target.toPort.links.forEach(link => { + this.handler.linkHandler.remove(link, 'from'); + }); + } + if (target.fromPort) { + target.fromPort.forEach((port: any) => { + if (port.links.length) { + port.links.forEach((link: any) => { + this.handler.linkHandler.remove(link, 'to'); + }); + } + }); + } + this.create(target); + toPort.links.forEach((link: any) => { + link.fromNode = link.fromNode.id; + link.fromPort = link.fromPort.id; + link.toNode = target.toPort.nodeId; + link.toPort = target.toPort.id; + this.handler.linkHandler.create(link); + }); + fromPort + .filter(op => target.fromPort.some(np => np.id === op.id)) + .forEach(port => { + port.links.forEach((link: any) => { + if (link.fromPort.id === port.id) { + link.fromNode = port.nodeId; + link.fromPort = port.id; + link.toNode = link.toNode.id; + link.toPort = link.toPort.id; + this.handler.linkHandler.create(link); + this.setCoords(target); + } + }); + }); + }; +} + +export default PortHandler; diff --git a/src/pages/Fabric/canvas/handlers/ShortcutHandler.ts b/src/pages/Fabric/canvas/handlers/ShortcutHandler.ts new file mode 100644 index 0000000..9155d72 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/ShortcutHandler.ts @@ -0,0 +1,170 @@ +import Handler from './Handler'; +import { KeyEvent } from '../utils'; +import { code } from '../constants'; + +/** + * Shortcut Handler Class + * + * @author salgum1114 + * @class ShortcutHandler + */ +class ShortcutHandler { + handler: Handler; + keyEvent: KeyEvent; + constructor(handler: Handler) { + this.handler = handler; + this.keyEvent = handler.keyEvent; + } + + /** + * Whether keydown Escape + * + * @param {KeyboardEvent} e + * @returns + */ + public isEscape = (e: KeyboardEvent) => { + return e.code === code.ESCAPE && this.keyEvent.esc; + }; + + /** + * Whether keydown Q + * + * @param {KeyboardEvent} e + * @returns + */ + public isQ = (e: KeyboardEvent) => { + return e.code === code.KEY_Q; + }; + + /** + * Whether keydown W + * + * @param {KeyboardEvent} e + * @returns + */ + public isW = (e: KeyboardEvent) => { + return e.code === code.KEY_W; + }; + + /** + * Whether keydown Delete or Backpsace + * + * @param {KeyboardEvent} e + * @returns + */ + public isDelete = (e: KeyboardEvent) => { + return (e.code === code.BACKSPACE || e.code === code.DELETE) && this.keyEvent.del; + }; + + /** + * Whether keydown Arrow + * + * @param {KeyboardEvent} e + * @returns + */ + public isArrow = (e: KeyboardEvent) => { + return e.code.includes('Arrow') && this.keyEvent.move; + }; + + /** + * Whether keydown Ctrl + A + * + * @param {KeyboardEvent} e + * @returns + */ + public isCtrlA = (e: KeyboardEvent) => { + return (e.ctrlKey || e.metaKey) && e.code === code.KEY_A && this.keyEvent.all; + }; + + /** + * Whether keydown Ctrl + C + * + * @param {KeyboardEvent} e + * @returns + */ + public isCtrlC = (e: KeyboardEvent) => { + return (e.ctrlKey || e.metaKey) && e.code === code.KEY_C && this.keyEvent.copy; + }; + + /** + * Whether keydown Ctrl + V + * + * @param {KeyboardEvent} e + * @returns + */ + public isCtrlV = (e: KeyboardEvent) => { + return (e.ctrlKey || e.metaKey) && e.code === code.KEY_V && this.keyEvent.paste; + }; + + /** + * Whether keydown Ctrl + Z + * + * @param {KeyboardEvent} e + * @returns + */ + public isCtrlZ = (e: KeyboardEvent) => { + return (e.ctrlKey || e.metaKey) && e.code === code.KEY_Z && this.keyEvent.transaction; + }; + + /** + * Whether keydown Ctrl + Y + * + * @param {KeyboardEvent} e + * @returns + */ + public isCtrlY = (e: KeyboardEvent) => { + return (e.ctrlKey || e.metaKey) && e.code === code.KEY_Y && this.keyEvent.transaction; + }; + + /** + * Whether keydown Plus Or Equal + * + * @param {KeyboardEvent} e + * @returns + */ + public isPlus = (e: KeyboardEvent) => { + return e.code === code.EQUAL && this.keyEvent.zoom; + }; + + /** + * Whether keydown Minus + * + * @param {KeyboardEvent} e + * @returns + */ + public isMinus = (e: KeyboardEvent) => { + return e.code === code.MINUS && this.keyEvent.zoom; + }; + + /** + * Whether keydown O + * + * @param {KeyboardEvent} e + * @returns + */ + public isO = (e: KeyboardEvent) => { + return e.code === code.KEY_O && this.keyEvent.zoom; + }; + + /** + * Whether keydown P + * + * @param {KeyboardEvent} e + * @returns + */ + public isP = (e: KeyboardEvent) => { + return e.code === code.KEY_P && this.keyEvent.zoom; + }; + + /** + * Whether keydown Ctrl + X + * + * @param {KeyboardEvent} e + * @returns + */ + public isCtrlX = (e: KeyboardEvent) => { + return (e.ctrlKey || e.metaKey) && e.code === code.KEY_X && this.keyEvent.cut; + }; +} + +export default ShortcutHandler; diff --git a/src/pages/Fabric/canvas/handlers/TooltipHandler.ts b/src/pages/Fabric/canvas/handlers/TooltipHandler.ts new file mode 100644 index 0000000..6511463 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/TooltipHandler.ts @@ -0,0 +1,98 @@ +import {debounce } from 'lodash'; +import ReactDOM from 'react-dom'; +import { FabricObject } from '../utils'; +import Handler from './Handler'; + + +class TooltipHandler { + handler: Handler; + tooltipEl: HTMLDivElement; + target?: fabric.Object; + + constructor(handler: Handler) { + this.handler = handler; + if (!handler.editable) { + this.initialize(); + } + } + + /** + * Initialize tooltip + * + * @author salgum1114 + */ + public initialize() { + this.tooltipEl = document.createElement('div'); + this.tooltipEl.id = `${this.handler.id}_tooltip`; + this.tooltipEl.className = 'rde-tooltip tooltip-hidden'; + document.body.appendChild(this.tooltipEl); + } + + /** + * Destroy tooltip + * + * @author salgum1114 + */ + public destroy() { + if (this.tooltipEl) { + document.body.removeChild(this.tooltipEl); + } + } + + /** + * Show tooltip + * + * @param {FabricObject} [target] + */ + public show = debounce(async (target?: FabricObject) => { + if (target.tooltip && target.tooltip.enabled) { + while (this.tooltipEl.hasChildNodes()) { + this.tooltipEl.removeChild(this.tooltipEl.firstChild); + } + const tooltip = document.createElement('div'); + tooltip.className = 'rde-tooltip-right'; + let element = target.name as any; + const { onTooltip } = this.handler; + if (onTooltip) { + element = await onTooltip(tooltip, target); + if (!element) { + return; + } + } + tooltip.innerHTML = element; + this.tooltipEl.appendChild(tooltip); + ReactDOM.render(element, tooltip); + this.tooltipEl.classList.remove('tooltip-hidden'); + const zoom = this.handler.canvas.getZoom(); + const { clientHeight } = this.tooltipEl; + const { width, height, scaleX, scaleY } = target; + const { left, top } = target.getBoundingRect(); + const { _offset: offset } = this.handler.canvas.calcOffset() as any; + const objWidthDiff = width * scaleX * zoom; + const objHeightDiff = (height * scaleY * zoom) / 2 - clientHeight / 2; + const calcLeft = offset.left + left + objWidthDiff; + const calcTop = offset.top + top + objHeightDiff; + if (document.body.clientWidth <= calcLeft + this.tooltipEl.offsetWidth) { + this.tooltipEl.style.left = `${left + offset.left - this.tooltipEl.offsetWidth}px`; + tooltip.className = 'rde-tooltip-left'; + } else { + this.tooltipEl.style.left = `${calcLeft}px`; + } + this.tooltipEl.style.top = `${calcTop}px`; + this.handler.target = target; + } + }, 100); + + /** + * Hide tooltip + * @param {fabric.Object} [_target] + */ + public hide = debounce((_target?: fabric.Object) => { + this.handler.target = null; + if (this.tooltipEl) { + this.tooltipEl.classList.add('tooltip-hidden'); + } + }, 100); +} + +export default TooltipHandler; diff --git a/src/pages/Fabric/canvas/handlers/TransactionHandler.ts b/src/pages/Fabric/canvas/handlers/TransactionHandler.ts new file mode 100644 index 0000000..d1f4a67 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/TransactionHandler.ts @@ -0,0 +1,184 @@ +import { fabric } from 'fabric'; +import {throttle} from 'lodash'; + +import Handler from './Handler'; +import { FabricObject } from '../utils'; +import { NodeObject } from '../objects/Node'; +import { LinkObject } from '../objects/Link'; + +export type TransactionType = + | 'add' + | 'remove' + | 'moved' + | 'scaled' + | 'rotated' + | 'skewed' + | 'group' + | 'ungroup' + | 'paste' + | 'bringForward' + | 'bringToFront' + | 'sendBackwards' + | 'sendToBack' + | 'redo' + | 'undo'; + +export interface TransactionTransform { + scaleX?: number; + scaleY?: number; + skewX?: number; + skewY?: number; + angle?: number; + left?: number; + top?: number; + flipX?: number; + flipY?: number; + originX?: string; + originY?: string; +} + +export interface TransactionEvent { + json: string; + type: TransactionType; +} + +class TransactionHandler { + handler: Handler; + redos: TransactionEvent[]; + undos: TransactionEvent[]; + active: boolean = false; + state: FabricObject[] = []; + + constructor(handler: Handler) { + this.handler = handler; + this.initialize(); + } + + /** + * Initialize transaction handler + * + */ + public initialize = () => { + this.redos = []; + this.undos = []; + this.state = []; + this.active = false; + }; + + /** + * Save transaction + * + * @param {TransactionType} type + * @param {*} [canvasJSON] + * @param {boolean} [isWorkarea=true] + */ + public save = (type: TransactionType, canvasJSON?: any, _isWorkarea: boolean = true) => { + if (!this.handler.keyEvent.transaction) { + return; + } + try { + if (this.state) { + const json = JSON.stringify(this.state); + this.redos = []; + this.undos.push({ + type, + json, + }); + } + const { objects }: { objects: FabricObject[] } = + canvasJSON || this.handler.canvas.toJSON(this.handler.propertiesToInclude); + this.state = objects.filter(obj => { + if (obj.id === 'workarea') { + return false; + } else if (obj.id === 'grid') { + return false; + } else if (obj.superType === 'port') { + return false; + } + return true; + }); + } catch (error) { + console.error(error); + } + }; + + /** + * Undo transaction + * + */ + public undo = throttle(() => { + const undo = this.undos.pop(); + if (!undo) { + return; + } + this.redos.push({ + type: 'redo', + json: JSON.stringify(this.state), + }); + this.replay(undo); + }, 100); + + /** + * Redo transaction + * + */ + public redo = throttle(() => { + const redo = this.redos.pop(); + if (!redo) { + return; + } + this.undos.push({ + type: 'undo', + json: JSON.stringify(this.state), + }); + this.replay(redo); + }, 100); + + /** + * Replay transaction + * + * @param {TransactionEvent} transaction + */ + public replay = (transaction: TransactionEvent) => { + const objects = JSON.parse(transaction.json) as FabricObject[]; + this.state = objects; + this.active = true; + this.handler.canvas.renderOnAddRemove = false; + this.handler.clear(); + this.handler.canvas.discardActiveObject(); + fabric.util.enlivenObjects( + objects, + (enlivenObjects: FabricObject[]) => { + enlivenObjects.forEach(obj => { + const targetIndex = this.handler.canvas._objects.length; + if (obj.superType === 'node') { + this.handler.canvas.insertAt(obj, targetIndex, false); + this.handler.portHandler.create(obj as NodeObject); + } else if (obj.superType === 'link') { + const link = obj as LinkObject; + this.handler.objects = this.handler.getObjects(); + this.handler.linkHandler.create({ + type: 'curvedLink', + fromNodeId: link.fromNode?.id, + fromPortId: link.fromPort?.id, + toNodeId: link.toNode?.id, + toPortId: link.toPort?.id, + }); + } else { + this.handler.canvas.insertAt(obj, targetIndex, false); + } + }); + this.handler.canvas.renderOnAddRemove = true; + this.active = false; + this.handler.canvas.renderAll(); + this.handler.objects = this.handler.getObjects(); + if (this.handler.onTransaction) { + this.handler.onTransaction(transaction); + } + }, + null, + ); + }; +} + +export default TransactionHandler; diff --git a/src/pages/Fabric/canvas/handlers/WorkareaHandler.ts b/src/pages/Fabric/canvas/handlers/WorkareaHandler.ts new file mode 100644 index 0000000..9d9aed4 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/WorkareaHandler.ts @@ -0,0 +1,354 @@ +import { fabric } from 'fabric'; + +import { Handler } from '.'; +import { WorkareaLayout, WorkareaObject, FabricImage } from '../utils'; +import { VideoObject } from '../objects/Video'; + +class WorkareaHandler { + handler: Handler; + + constructor(handler: Handler) { + this.handler = handler; + this.initialize(); + } + + /** + * Initialize workarea + * + * @author salgum1114 + */ + public initialize() { + const { workareaOption } = this.handler; + const image = new Image(workareaOption.width, workareaOption.height); + image.width = workareaOption.width; + image.height = workareaOption.height; + this.handler.workarea = new fabric.Image(image, workareaOption) as WorkareaObject; + this.handler.canvas.add(this.handler.workarea); + this.handler.objects = this.handler.getObjects(); + this.handler.canvas.centerObject(this.handler.workarea); + this.handler.canvas.renderAll(); + } + + /** + * Set the layout on workarea + * @param {WorkareaLayout} layout + * @returns + */ + public setLayout = (layout: WorkareaLayout) => { + this.handler.workarea.set('layout', layout); + const { _element, isElement, workareaWidth, workareaHeight } = this.handler.workarea; + const { canvas } = this.handler; + let scaleX = 1; + let scaleY = 1; + const isFixed = layout === 'fixed'; + const isResponsive = layout === 'responsive'; + const isFullscreen = layout === 'fullscreen'; + if (isElement) { + if (isFixed) { + scaleX = workareaWidth / _element.width; + scaleY = workareaHeight / _element.height; + } else if (isResponsive) { + const scales = this.calculateScale(); + scaleX = scales.scaleX; + scaleY = scales.scaleY; + } else { + scaleX = canvas.getWidth() / _element.width; + scaleY = canvas.getHeight() / _element.height; + } + } + this.handler.getObjects().forEach(obj => { + const { id, player } = obj as VideoObject; + if (id !== 'workarea') { + const objScaleX = !isFullscreen ? 1 : scaleX; + const objScaleY = !isFullscreen ? 1 : scaleY; + const objWidth = obj.width * objScaleX * canvas.getZoom(); + const objHeight = obj.height * objScaleY * canvas.getZoom(); + const el = this.handler.elementHandler.findById(obj.id); + this.handler.elementHandler.setSize(el, obj); + if (player) { + player.setPlayerSize(objWidth, objHeight); + } + obj.set({ + scaleX: !isFullscreen ? 1 : objScaleX, + scaleY: !isFullscreen ? 1 : objScaleY, + }); + } + }); + if (isResponsive) { + const center = canvas.getCenter(); + if (isElement) { + this.handler.workarea.set({ + scaleX: 1, + scaleY: 1, + }); + this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), scaleX); + } else { + this.handler.workarea.set({ + width: workareaWidth, + height: workareaHeight, + }); + scaleX = canvas.getWidth() / workareaWidth; + scaleY = canvas.getHeight() / workareaHeight; + if (workareaHeight >= workareaWidth) { + scaleX = scaleY; + } else { + scaleY = scaleX; + } + this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), scaleX); + } + canvas.centerObject(this.handler.workarea); + canvas.renderAll(); + return; + } + if (isElement) { + this.handler.workarea.set({ + width: _element.width, + height: _element.height, + scaleX, + scaleY, + }); + } else { + const width = isFixed ? workareaWidth : this.handler.canvas.getWidth(); + const height = isFixed ? workareaHeight : this.handler.canvas.getHeight(); + this.handler.workarea.set({ + width, + height, + backgroundColor: 'rgba(255, 255, 255, 1)', + }); + this.handler.canvas.renderAll(); + if (isFixed) { + canvas.centerObject(this.handler.workarea); + } else { + this.handler.workarea.set({ + left: 0, + top: 0, + }); + } + } + canvas.centerObject(this.handler.workarea); + const center = canvas.getCenter(); + canvas.setViewportTransform([1, 0, 0, 1, 0, 0]); + this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), 1); + canvas.renderAll(); + }; + + /** + * Set the responsive image on Workarea + * @param {string | File} [source] + * @param {boolean} [loaded] + * @returns + */ + public setResponsiveImage = async (source: string | File, loaded?: boolean) => { + const imageFromUrl = async (src: string = '') => { + return new Promise<WorkareaObject>(resolve => { + fabric.Image.fromURL(src, (img: any) => { + const { canvas, workarea, editable } = this.handler; + const { workareaWidth, workareaHeight } = workarea; + const { scaleX, scaleY } = this.calculateScale(img); + if (img._element) { + workarea.set({ + ...img, + isElement: true, + selectable: false, + }); + } else { + const image = new Image(workareaWidth, workareaHeight); + workarea.setElement(image); + workarea.set({ + isElement: false, + selectable: false, + width: workareaWidth, + height: workareaHeight, + }); + } + if (editable && !loaded) { + canvas.getObjects().forEach(obj => { + const { id, player } = obj as VideoObject; + if (id !== 'workarea') { + const objWidth = obj.width * scaleX; + const objHeight = obj.height * scaleY; + const el = this.handler.elementHandler.findById(id); + this.handler.elementHandler.setScaleOrAngle(el, obj); + this.handler.elementHandler.setSize(el, obj); + if (player) { + player.setPlayerSize(objWidth, objHeight); + } + obj.set({ + scaleX: 1, + scaleY: 1, + }); + obj.setCoords(); + } + }); + } + // 파일이 없을 경우 Canvas의 nextWidth, nextHeight 값이 변경되기 전 상태에서 zoomToFit이 동작함 + // 정상 동작 resize event logic => zoomToFit + // 현재 동작 zoomToFit -> resize event logic + this.handler.zoomHandler.zoomToFit(); + canvas.centerObject(workarea); + resolve(workarea); + }); + }); + }; + const { workarea } = this.handler; + if (!source) { + workarea.set({ + src: null, + file: null, + }); + return imageFromUrl(source as string); + } + if (source instanceof File) { + return new Promise<WorkareaObject>(resolve => { + const reader = new FileReader(); + reader.onload = () => { + workarea.set({ + file: source, + }); + imageFromUrl(reader.result as string).then(resolve); + }; + reader.readAsDataURL(source); + }); + } else { + workarea.set({ + src: source, + }); + return imageFromUrl(source); + } + }; + + /** + * Set the image on Workarea + * @param {string | File} source + * @param {boolean} [loaded=false] + * @returns + */ + setImage = async (source: string | File, loaded = false) => { + const { canvas, workarea, editable } = this.handler; + if (workarea.layout === 'responsive') { + return this.setResponsiveImage(source, loaded); + } + const imageFromUrl = async (src: string) => { + return new Promise<WorkareaObject>(resolve => { + fabric.Image.fromURL(src, (img: any) => { + let width = canvas.getWidth(); + let height = canvas.getHeight(); + if (workarea.layout === 'fixed') { + width = workarea.width * workarea.scaleX; + height = workarea.height * workarea.scaleY; + } + let scaleX = 1; + let scaleY = 1; + if (img._element) { + scaleX = width / img.width; + scaleY = height / img.height; + img.set({ + originX: 'left', + originY: 'top', + scaleX, + scaleY, + }); + workarea.set({ + ...img, + isElement: true, + selectable: false, + }); + } else { + workarea.setElement(new Image()); + workarea.set({ + width, + height, + scaleX, + scaleY, + isElement: false, + selectable: false, + }); + } + canvas.centerObject(workarea); + if (editable && !loaded) { + const { layout } = workarea; + canvas.getObjects().forEach(obj => { + const { id, player } = obj as VideoObject; + if (id !== 'workarea') { + scaleX = layout === 'fullscreen' ? scaleX : obj.scaleX; + scaleY = layout === 'fullscreen' ? scaleY : obj.scaleY; + const el = this.handler.elementHandler.findById(id); + this.handler.elementHandler.setSize(el, obj); + if (player) { + const objWidth = obj.width * scaleX; + const objHeight = obj.height * scaleY; + player.setPlayerSize(objWidth, objHeight); + } + obj.set({ + scaleX, + scaleY, + }); + obj.setCoords(); + } + }); + } + const center = canvas.getCenter(); + const zoom = loaded || workarea.layout === 'fullscreen' ? 1 : this.handler.canvas.getZoom(); + canvas.setViewportTransform([1, 0, 0, 1, 0, 0]); + this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), zoom); + canvas.renderAll(); + resolve(workarea); + }); + }); + }; + if (!source) { + workarea.set({ + src: null, + file: null, + }); + return imageFromUrl(source as string); + } + if (source instanceof File) { + return new Promise<WorkareaObject>(resolve => { + const reader = new FileReader(); + reader.onload = () => { + workarea.set({ + file: source, + }); + imageFromUrl(reader.result as string).then(resolve); + }; + reader.readAsDataURL(source); + }); + } else { + workarea.set({ + src: source, + }); + return imageFromUrl(source); + } + }; + + /** + * Calculate scale to the image + * + * @param {FabricImage} [image] + * @returns + */ + public calculateScale = (image?: FabricImage) => { + const { canvas, workarea } = this.handler; + const { workareaWidth, workareaHeight } = workarea; + const { _element } = image || workarea; + const width = _element?.width || workareaWidth; + const height = _element?.height || workareaHeight; + let scaleX = canvas.getWidth() / width; + let scaleY = canvas.getHeight() / height; + if (height >= width) { + scaleX = scaleY; + if (canvas.getWidth() < width * scaleX) { + scaleX = scaleX * (canvas.getWidth() / (width * scaleX)); + } + } else { + scaleY = scaleX; + if (canvas.getHeight() < height * scaleX) { + scaleX = scaleX * (canvas.getHeight() / (height * scaleX)); + } + } + return { scaleX, scaleY }; + }; +} + +export default WorkareaHandler; diff --git a/src/pages/Fabric/canvas/handlers/ZoomHandler.ts b/src/pages/Fabric/canvas/handlers/ZoomHandler.ts new file mode 100644 index 0000000..a6dfe71 --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/ZoomHandler.ts @@ -0,0 +1,154 @@ +import { fabric } from 'fabric'; + +import { VideoObject } from '../objects/Video'; +import { FabricObject } from '../utils'; +import Handler from './Handler'; + +class ZoomHandler { + handler?: Handler; + private _zoomStep?: number; + + constructor(handler: Handler, zoomStep: number = 0.05) { + this.handler = handler; + this._zoomStep = zoomStep; + } + + /** + * Zoom to point + * + * @param {fabric.Point} point + * @param {number} zoom ex) 0 ~ 1. Not percentage value. + */ + public zoomToPoint = (point: fabric.Point, zoom: number) => { + const { minZoom, maxZoom } = this.handler; + let zoomRatio = zoom; + if (zoom <= minZoom / 100) { + zoomRatio = minZoom / 100; + } else if (zoom >= maxZoom / 100) { + zoomRatio = maxZoom / 100; + } + this.handler.canvas.zoomToPoint(point, zoomRatio); + this.handler.getObjects().forEach(obj => { + if (obj.superType === 'element') { + const { id, width, height, player } = obj as VideoObject; + const el = this.handler.elementHandler.findById(id); + // update the element + this.handler.elementHandler.setScaleOrAngle(el, obj); + this.handler.elementHandler.setSize(el, obj); + this.handler.elementHandler.setPosition(el, obj); + if (player) { + player.setPlayerSize(width, height); + } + } + }); + if (this.handler.onZoom) { + this.handler.onZoom(zoomRatio); + } + this.handler.canvas.requestRenderAll(); + }; + + /** + * Zoom one to one + * + */ + public zoomOneToOne = () => { + const center = this.handler.canvas.getCenter(); + this.handler.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]); + this.zoomToPoint(new fabric.Point(center.left, center.top), 1); + }; + + /** + * Zoom to fit + * + */ + public zoomToFit = () => { + let scaleX = this.handler.canvas.getWidth() / this.handler.workarea.width; + const scaleY = this.handler.canvas.getHeight() / this.handler.workarea.height; + if (this.handler.workarea.height >= this.handler.workarea.width) { + scaleX = scaleY; + if (this.handler.canvas.getWidth() < this.handler.workarea.width * scaleX) { + scaleX = scaleX * (this.handler.canvas.getWidth() / (this.handler.workarea.width * scaleX)); + } + } else { + if (this.handler.canvas.getHeight() < this.handler.workarea.height * scaleX) { + scaleX = scaleX * (this.handler.canvas.getHeight() / (this.handler.workarea.height * scaleX)); + } + } + const center = this.handler.canvas.getCenter(); + this.handler.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]); + this.zoomToPoint(new fabric.Point(center.left, center.top), scaleX); + }; + + /** + * Zoom in + * + */ + public zoomIn = () => { + let zoomRatio = this.handler.canvas.getZoom(); + zoomRatio += this._zoomStep; + const center = this.handler.canvas.getCenter(); + this.zoomToPoint(new fabric.Point(center.left, center.top), zoomRatio); + }; + + /** + * Zoom out + * + */ + public zoomOut = () => { + let zoomRatio = this.handler.canvas.getZoom(); + zoomRatio -= this._zoomStep; + const center = this.handler.canvas.getCenter(); + this.zoomToPoint(new fabric.Point(center.left, center.top), zoomRatio); + }; + + /** + * Zoom to center with object + * + * @param {FabricObject} target If zoomFit true, rescaled canvas zoom. + */ + public zoomToCenterWithObject = (target: FabricObject, zoomFit?: boolean) => { + const { left: canvasLeft, top: canvasTop } = this.handler.canvas.getCenter(); + const { left, top, width, height } = target; + const diffTop = canvasTop - (top + height / 2); + const diffLeft = canvasLeft - (left + width / 2); + if (zoomFit) { + let scaleX; + let scaleY; + scaleX = this.handler.canvas.getWidth() / width; + scaleY = this.handler.canvas.getHeight() / height; + if (height > width) { + scaleX = scaleY; + if (this.handler.canvas.getWidth() < width * scaleX) { + scaleX = scaleX * (this.handler.canvas.getWidth() / (width * scaleX)); + } + } else { + scaleY = scaleX; + if (this.handler.canvas.getHeight() < height * scaleX) { + scaleX = scaleX * (this.handler.canvas.getHeight() / (height * scaleX)); + } + } + this.handler.canvas.setViewportTransform([1, 0, 0, 1, diffLeft, diffTop]); + this.zoomToPoint(new fabric.Point(canvasLeft, canvasTop), scaleX); + } else { + const zoom = this.handler.canvas.getZoom(); + this.handler.canvas.setViewportTransform([1, 0, 0, 1, diffLeft, diffTop]); + this.zoomToPoint(new fabric.Point(canvasLeft, canvasTop), zoom); + } + }; + + /** + * Zoom to center with objects + * + * @param {boolean} [zoomFit] If zoomFit true, rescaled canvas zoom. + * @returns + */ + public zoomToCenter = (zoomFit?: boolean) => { + const activeObject = this.handler.canvas.getActiveObject(); + if (!activeObject) { + return; + } + this.zoomToCenterWithObject(activeObject, zoomFit); + }; +} + +export default ZoomHandler; diff --git a/src/pages/Fabric/canvas/handlers/index.ts b/src/pages/Fabric/canvas/handlers/index.ts new file mode 100644 index 0000000..4bd7ded --- /dev/null +++ b/src/pages/Fabric/canvas/handlers/index.ts @@ -0,0 +1,45 @@ +export { default as Handler } from './Handler'; + +export { default as ImageHandler } from './ImageHandler'; + +export { default as ChartHandler } from './ChartHandler'; + +export { default as ElementHandler } from './ElementHandler'; + +export { default as CropHandler } from './CropHandler'; + +export { default as AnimationHandler } from './AnimationHandler'; + +export { default as ContextmenuHandler } from './ContextmenuHandler'; + +export { default as TooltipHandler } from './TooltipHandler'; + +export { default as TransactionHandler } from './TransactionHandler'; + +export { default as ZoomHandler } from './ZoomHandler'; + +export { default as WorkareaHandler } from './WorkareaHandler'; + +export { default as InteractionHandler } from './InteractionHandler'; + +export { default as GridHandler } from './GridHandler'; + +export { default as PortHandler } from './PortHandler'; + +export { default as LinkHandler } from './LinkHandler'; + +export { default as NodeHandler } from './NodeHandler'; + +export { default as AlignmentHandler } from './AlignmentHandler'; + +export { default as GuidelineHandler } from './GuidelineHandler'; + +export { default as EventHandler } from './EventHandler'; + +export { default as DrawingHandler } from './DrawingHandler'; + +export { default as ShortcutHandler } from './ShortcutHandler'; + +export { default as FiberHandler } from './FiberHandler'; + +export { default as CustomHandler } from './CustomHandler'; diff --git a/src/pages/Fabric/canvas/index.tsx b/src/pages/Fabric/canvas/index.tsx new file mode 100644 index 0000000..92dd636 --- /dev/null +++ b/src/pages/Fabric/canvas/index.tsx @@ -0,0 +1,6 @@ +export * from './Canvas'; +export { default as Canvas } from './Canvas'; +export { default as CanvasObject } from './CanvasObject'; +export * from './handlers'; +export * from './objects'; +export * from './utils'; diff --git a/src/pages/Fabric/canvas/objects/Arrow.ts b/src/pages/Fabric/canvas/objects/Arrow.ts new file mode 100644 index 0000000..1a5fcc0 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Arrow.ts @@ -0,0 +1,42 @@ +import { fabric } from 'fabric'; + +const Arrow = fabric.util.createClass(fabric.Line, { + type: 'arrow', + superType: 'drawing', + initialize(points: any, options: any) { + if (!points) { + const { x1, x2, y1, y2 } = options; + points = [x1, y1, x2, y2]; + } + options = options || {}; + this.callSuper('initialize', points, options); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + ctx.save(); + const xDiff = this.x2 - this.x1; + const yDiff = this.y2 - this.y1; + const angle = Math.atan2(yDiff, xDiff); + ctx.translate((this.x2 - this.x1) / 2, (this.y2 - this.y1) / 2); + ctx.rotate(angle); + ctx.beginPath(); + // Move 5px in front of line to start the arrow so it does not have the square line end showing in front (0,0) + ctx.moveTo(5, 0); + ctx.lineTo(-5, 5); + ctx.lineTo(-5, -5); + ctx.closePath(); + ctx.fillStyle = this.stroke; + ctx.fill(); + ctx.restore(); + }, +}); + +Arrow.fromObject = (options: any, callback: any) => { + const { x1, x2, y1, y2 } = options; + return callback(new Arrow([x1, y1, x2, y2], options)); +}; + +// @ts-ignore +window.fabric.Arrow = Arrow; + +export default Arrow; diff --git a/src/pages/Fabric/canvas/objects/Chart.ts b/src/pages/Fabric/canvas/objects/Chart.ts new file mode 100644 index 0000000..50dbb05 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Chart.ts @@ -0,0 +1,112 @@ +import * as echarts from 'echarts'; +import { fabric } from 'fabric'; +import { FabricElement, toObject } from '../utils'; + +export interface ChartObject extends FabricElement { + setSource: (source: echarts.EChartOption) => void; + setChartOption: (chartOption: echarts.EChartOption) => void; + chartOption: echarts.EChartOption; + instance: echarts.ECharts; +} + +const Chart = fabric.util.createClass(fabric.Rect, { + type: 'chart', + superType: 'element', + hasRotatingPoint: false, + initialize(chartOption: echarts.EChartOption, options: any) { + options = options || {}; + this.callSuper('initialize', options); + this.set({ + chartOption, + fill: 'rgba(255, 255, 255, 0)', + stroke: 'rgba(255, 255, 255, 0)', + }); + }, + setSource(source: echarts.EChartOption | string) { + if (typeof source === 'string') { + this.setChartOptionStr(source); + } else { + this.setChartOption(source); + } + }, + setChartOptionStr(chartOptionStr: string) { + this.set({ + chartOptionStr, + }); + }, + setChartOption(chartOption: echarts.EChartOption) { + this.set({ + chartOption, + }); + this.distroyChart(); + this.createChart(chartOption); + }, + createChart(chartOption: echarts.EChartOption) { + this.instance = echarts.init(this.element); + if (!chartOption) { + this.instance.setOption({ + xAxis: {}, + yAxis: {}, + series: [ + { + type: 'line', + data: [ + [0, 1], + [1, 2], + [2, 3], + [3, 4], + ], + }, + ], + }); + } else { + this.instance.setOption(chartOption); + } + }, + distroyChart() { + if (this.instance) { + this.instance.dispose(); + } + }, + toObject(propertiesToInclude: string[]) { + return toObject(this, propertiesToInclude, { + chartOption: this.get('chartOption'), + container: this.get('container'), + editable: this.get('editable'), + }); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + if (!this.instance) { + const { id, scaleX, scaleY, width, height, angle, editable, chartOption } = this; + const zoom = this.canvas.getZoom(); + const left = this.calcCoords().tl.x; + const top = this.calcCoords().tl.y; + const padLeft = (width * scaleX * zoom - width) / 2; + const padTop = (height * scaleY * zoom - height) / 2; + this.element = fabric.util.makeElement('div', { + id: `${id}_container`, + style: `transform: rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom}); + width: ${width}px; + height: ${height}px; + left: ${left + padLeft}px; + top: ${top + padTop}px; + position: absolute; + user-select: ${editable ? 'none' : 'auto'}; + pointer-events: ${editable ? 'none' : 'auto'};`, + }) as HTMLDivElement; + this.createChart(chartOption); + const container = document.getElementById(this.container); + container.appendChild(this.element); + } + }, +}); + +Chart.fromObject = (options: ChartObject, callback: (obj: ChartObject) => any) => { + return callback(new Chart(options.chartOption, options)); +}; + +// @ts-ignore +window.fabric.Chart = Chart; + +export default Chart; diff --git a/src/pages/Fabric/canvas/objects/CirclePort.ts b/src/pages/Fabric/canvas/objects/CirclePort.ts new file mode 100644 index 0000000..8e46cb5 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/CirclePort.ts @@ -0,0 +1,32 @@ +import { fabric } from 'fabric'; + +import { PortObject } from './Port'; + +const CirclePort = fabric.util.createClass(fabric.Circle, { + type: 'port', + superType: 'port', + initialize(options: any) { + options = options || {}; + this.callSuper('initialize', options); + }, + toObject() { + return fabric.util.object.extend(this.callSuper('toObject'), { + id: this.get('id'), + superType: this.get('superType'), + enabled: this.get('enabled'), + nodeId: this.get('nodeId'), + }); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + }, +}); + +CirclePort.fromObject = (options: PortObject, callback: (obj: PortObject) => any) => { + return callback(new CirclePort(options)); +}; + +// @ts-ignore +window.fabric.CirclePort = CirclePort; + +export default CirclePort; diff --git a/src/pages/Fabric/canvas/objects/Cube.ts b/src/pages/Fabric/canvas/objects/Cube.ts new file mode 100644 index 0000000..9b981cb --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Cube.ts @@ -0,0 +1,83 @@ +import { fabric } from 'fabric'; +import { FabricObject } from '../utils'; + +export interface CubeObject extends FabricObject {} + +const Cube = fabric.util.createClass(fabric.Object, { + type: 'cube', + superType: 'shape', + initialize(options: any) { + options = options || {}; + this.callSuper('initialize', options); + }, + shadeColor(color: any, percent: number) { + color = color.substr(1); + const num = parseInt(color, 16); + const amt = Math.round(2.55 * percent); + const R = (num >> 16) + amt; + const G = ((num >> 8) & 0x00ff) + amt; + const B = (num & 0x0000ff) + amt; + return ( + '#' + + ( + 0x1000000 + + (R < 255 ? (R < 1 ? 0 : R) : 255) * 0x10000 + + (G < 255 ? (G < 1 ? 0 : G) : 255) * 0x100 + + (B < 255 ? (B < 1 ? 0 : B) : 255) + ) + .toString(16) + .slice(1) + ); + }, + _render(ctx: CanvasRenderingContext2D) { + const { width, height, fill } = this; + const wx = width / 2; + const wy = width / 2; + const h = height / 2; + const x = 0; + const y = wy; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x - wx, y - wx * 0.5); + ctx.lineTo(x - wx, y - h - wx * 0.5); + ctx.lineTo(x, y - h * 1); + ctx.closePath(); + ctx.fillStyle = this.shadeColor(fill, -10); + ctx.strokeStyle = fill; + ctx.stroke(); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + wy, y - wy * 0.5); + ctx.lineTo(x + wy, y - h - wy * 0.5); + ctx.lineTo(x, y - h * 1); + ctx.closePath(); + ctx.fillStyle = this.shadeColor(fill, 10); + ctx.strokeStyle = this.shadeColor(fill, 50); + ctx.stroke(); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(x, y - h); + ctx.lineTo(x - wx, y - h - wx * 0.5); + ctx.lineTo(x - wx + wy, y - h - (wx * 0.5 + wy * 0.5)); + ctx.lineTo(x + wy, y - h - wy * 0.5); + ctx.closePath(); + ctx.fillStyle = this.shadeColor(fill, 20); + ctx.strokeStyle = this.shadeColor(fill, 60); + ctx.stroke(); + ctx.fill(); + + ctx.restore(); + }, +}); + +Cube.fromObject = (options: CubeObject, callback: (obj: CubeObject) => any) => { + return callback(new Cube(options)); +}; + +// @ts-ignore +window.fabric.Cube = Cube; + +export default Cube; diff --git a/src/pages/Fabric/canvas/objects/CurvedLink.ts b/src/pages/Fabric/canvas/objects/CurvedLink.ts new file mode 100644 index 0000000..7be54d5 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/CurvedLink.ts @@ -0,0 +1,58 @@ +import { fabric } from 'fabric'; +import Link, { LinkObject } from './Link'; +import { NodeObject } from './Node'; +import { PortObject } from './Port'; + +const CurvedLink = fabric.util.createClass(Link, { + type: 'curvedLink', + superType: 'link', + initialize( + fromNode: Partial<NodeObject>, + fromPort: Partial<PortObject>, + toNode: Partial<NodeObject>, + toPort: Partial<PortObject>, + options: Partial<LinkObject>, + ) { + options = options || {}; + this.callSuper('initialize', fromNode, fromPort, toNode, toPort, options); + }, + _render(ctx: CanvasRenderingContext2D) { + // Drawing curved link + const { x1, y1, x2, y2 } = this; + ctx.lineWidth = this.strokeWidth; + ctx.strokeStyle = this.stroke; + const fp = { x: (x1 - x2) / 2, y: (y1 - y2) / 2 }; + const sp = { x: (x2 - x1) / 2, y: (y2 - y1) / 2 }; + ctx.beginPath(); + ctx.moveTo(fp.x, fp.y); + ctx.bezierCurveTo(fp.x, sp.y, sp.x, fp.y, sp.x, sp.y); + ctx.stroke(); + ctx.save(); + const xDiff = x2 - x1; + const yDiff = y2 - y1; + const angle = Math.atan2(yDiff, xDiff); + ctx.translate((x2 - x1) / 2, (y2 - y1) / 2); + ctx.rotate(angle >= 0 ? 1.57 : -1.57); + ctx.beginPath(); + if (this.arrow) { + // Move 5px in front of line to start the arrow so it does not have the square line end showing in front (0,0) + ctx.moveTo(5, 0); + ctx.lineTo(-5, 5); + ctx.lineTo(-5, -5); + } + ctx.closePath(); + ctx.fillStyle = this.stroke; + ctx.fill(); + ctx.restore(); + }, +}); + +CurvedLink.fromObject = (options: LinkObject, callback: (obj: LinkObject) => any) => { + const { fromNode, fromPort, toNode, toPort } = options; + return callback(new CurvedLink(fromNode, fromPort, toNode, toPort, options)); +}; + +// @ts-ignore +window.fabric.CurvedLink = CurvedLink; + +export default CurvedLink; diff --git a/src/pages/Fabric/canvas/objects/Element.ts b/src/pages/Fabric/canvas/objects/Element.ts new file mode 100644 index 0000000..ad73997 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Element.ts @@ -0,0 +1,101 @@ +import { fabric } from 'fabric'; +import { FabricElement, toObject } from '../utils'; + +export interface Code { + html: string; + css: string; + js: string; +} + +export interface ElementObject extends FabricElement { + setSource: (source: Code) => void; + setCode: (code: Code) => void; + code: Code; +} + +const initialCode: Code = { + html: '', + css: '', + js: '', +}; + +const Element = fabric.util.createClass(fabric.Rect, { + type: 'element', + superType: 'element', + hasRotatingPoint: false, + initialize(code = initialCode, options: any) { + options = options || {}; + this.callSuper('initialize', options); + this.set({ + code, + fill: 'rgba(255, 255, 255, 0)', + stroke: 'rgba(255, 255, 255, 0)', + }); + }, + setSource(source: any) { + this.setCode(source); + }, + setCode(code = initialCode) { + this.set({ + code, + }); + const { css, js, html } = code; + this.styleEl.innerHTML = css; + this.scriptEl.innerHTML = js; + this.element.innerHTML = html; + }, + toObject(propertiesToInclude: string[]) { + return toObject(this, propertiesToInclude, { + code: this.get('code'), + container: this.get('container'), + editable: this.get('editable'), + }); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + if (!this.element) { + const { id, scaleX, scaleY, width, height, angle, editable, code } = this; + const zoom = this.canvas.getZoom(); + const left = this.calcCoords().tl.x; + const top = this.calcCoords().tl.y; + const padLeft = (width * scaleX * zoom - width) / 2; + const padTop = (height * scaleY * zoom - height) / 2; + this.element = fabric.util.makeElement('div', { + id: `${id}_container`, + style: `transform: rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom}); + width: ${width}px; + height: ${height}px; + left: ${left + padLeft}px; + top: ${top + padTop}px; + position: absolute; + user-select: ${editable ? 'none' : 'auto'}; + pointer-events: ${editable ? 'none' : 'auto'};`, + }) as HTMLDivElement; + const { html, css, js } = code; + this.styleEl = document.createElement('style'); + this.styleEl.id = `${id}_style`; + this.styleEl.type = 'text/css'; + this.styleEl.innerHTML = css; + document.head.appendChild(this.styleEl); + + this.scriptEl = document.createElement('script'); + this.scriptEl.id = `${id}_script`; + this.scriptEl.type = 'text/javascript'; + this.scriptEl.innerHTML = js; + document.head.appendChild(this.scriptEl); + + const container = document.getElementById(this.container); + container.appendChild(this.element); + this.element.innerHTML = html; + } + }, +}); + +Element.fromObject = (options: ElementObject, callback: (obj: ElementObject) => any) => { + return callback(new Element(options.code, options)); +}; + +// @ts-ignore +window.fabric.Element = Element; + +export default Element; diff --git a/src/pages/Fabric/canvas/objects/Gif.ts b/src/pages/Fabric/canvas/objects/Gif.ts new file mode 100644 index 0000000..6d8fe5a --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Gif.ts @@ -0,0 +1,51 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-12-05 13:55:45 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-05 15:55:58 + * @FilePath: \react-adpro-fabric\src\pages\Fabric\canvas\objects\Gif.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { fabric } from 'fabric'; +// import 'gifler'; + +const Gif = fabric.util.createClass(fabric.Object, { + type: 'gif', + superType: 'image', + gifCanvas: null, + isStarted: false, + initialize(options: any) { + options = options || {}; + this.callSuper('initialize', options); + this.gifCanvas = document.createElement('canvas'); + }, + drawFrame(ctx: CanvasRenderingContext2D, frame: any) { + // update canvas size + this.gifCanvas.width = frame.width; + this.gifCanvas.height = frame.height; + // update canvas that we are using for fabric.js + ctx.drawImage(frame.buffer, -frame.width / 2, -frame.height / 2, frame.width, frame.height); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + if (!this.isStarted) { + this.isStarted = true; + window + // @ts-ignore + .gifler('./images/sample/earth.gif') + .frames(this.gifCanvas, (_c: CanvasRenderingContext2D, frame: any) => { + this.isStarted = true; + this.drawFrame(ctx, frame); + }); + } + }, +}); + +Gif.fromObject = (options: any, callback: (obj: any) => any) => { + return callback(new Gif(options)); +}; + +// @ts-ignore +window.fabric.Gif = Gif; + +export default Gif; diff --git a/src/pages/Fabric/canvas/objects/Iframe.ts b/src/pages/Fabric/canvas/objects/Iframe.ts new file mode 100644 index 0000000..44eb6ed --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Iframe.ts @@ -0,0 +1,79 @@ +import { fabric } from 'fabric'; +import { FabricElement, toObject } from '../utils'; + +export interface IframeObject extends FabricElement { + setSource: (source: string) => void; + setSrc: (src: string) => void; + src: string; + iframeElement: HTMLIFrameElement; +} + +const Iframe = fabric.util.createClass(fabric.Rect, { + type: 'iframe', + superType: 'element', + hasRotatingPoint: false, + initialize(src: string = '', options: any) { + options = options || {}; + this.callSuper('initialize', options); + this.set({ + src, + fill: 'rgba(255, 255, 255, 0)', + stroke: 'rgba(255, 255, 255, 0)', + }); + }, + setSource(source: any) { + this.setSrc(source); + }, + setSrc(src: string) { + this.set({ + src, + }); + this.iframeElement.src = src; + }, + toObject(propertiesToInclude: string[]) { + return toObject(this, propertiesToInclude, { + src: this.get('src'), + container: this.get('container'), + editable: this.get('editable'), + }); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + if (!this.element) { + const { id, scaleX, scaleY, width, height, angle, editable, src } = this; + const zoom = this.canvas.getZoom(); + const left = this.calcCoords().tl.x; + const top = this.calcCoords().tl.y; + const padLeft = (width * scaleX * zoom - width) / 2; + const padTop = (height * scaleY * zoom - height) / 2; + this.iframeElement = fabric.util.makeElement('iframe', { + id, + src, + width: '100%', + height: '100%', + }); + this.element = fabric.util.wrapElement(this.iframeElement, 'div', { + id: `${id}_container`, + style: `transform: rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom}); + width: ${width}px; + height: ${height}px; + left: ${left + padLeft}px; + top: ${top + padTop}px; + position: absolute; + user-select: ${editable ? 'none' : 'auto'}; + pointer-events: ${editable ? 'none' : 'auto'};`, + }) as HTMLDivElement; + const container = document.getElementById(this.container); + container.appendChild(this.element); + } + }, +}); + +Iframe.fromObject = (options: IframeObject, callback: (obj: IframeObject) => any) => { + return callback(new Iframe(options.src, options)); +}; + +// @ts-ignore +window.fabric.Iframe = Iframe; + +export default Iframe; diff --git a/src/pages/Fabric/canvas/objects/Line.ts b/src/pages/Fabric/canvas/objects/Line.ts new file mode 100644 index 0000000..6a0b263 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Line.ts @@ -0,0 +1,26 @@ +import { fabric } from 'fabric'; + +const Line = fabric.util.createClass(fabric.Line, { + type: 'line', + superType: 'drawing', + initialize(points: any, options: any) { + if (!points) { + const { x1, x2, y1, y2 } = options; + points = [x1, y1, x2, y2]; + } + options = options || {}; + this.callSuper('initialize', points, options); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + }, +}); + +Line.fromObject = (options: any, callback: any) => { + const { x1, x2, y1, y2 } = options; + return callback(new Line([x1, y1, x2, y2], options)); +}; + +window.fabric.Line = Line; + +export default Line; diff --git a/src/pages/Fabric/canvas/objects/Link.ts b/src/pages/Fabric/canvas/objects/Link.ts new file mode 100644 index 0000000..7c85672 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Link.ts @@ -0,0 +1,130 @@ +import { fabric } from 'fabric'; +import { useUuid } from '@/hooks/useUuid'; +import { FabricObject } from '../utils'; +import { NodeObject, OUT_PORT_TYPE } from './Node'; +import { PortObject } from './Port'; + + +// eslint-disable-next-line react-hooks/rules-of-hooks +const { fetchUuid } = useUuid(); + +export interface LinkObject extends FabricObject<fabric.Line> { + fromNode?: NodeObject; + toNode?: NodeObject; + fromPort?: PortObject; + toPort?: PortObject; + fromPortIndex?: number; + setPort?: (fromNode: NodeObject, fromPort: PortObject, toNode: NodeObject, toPort: PortObject) => void; + setPortEnabled?: (node: NodeObject, port: PortObject, enabled: boolean) => void; +} + +const Link = fabric.util.createClass(fabric.Line, { + type: 'link', + superType: 'link', + initialize( + fromNode: Partial<NodeObject>, + fromPort: Partial<PortObject>, + toNode: Partial<NodeObject>, + toPort: Partial<PortObject>, + options: Partial<LinkObject>, + ) { + options = options || {}; + const coords = [fromPort.left, fromPort.top, toPort.left, toPort.top]; + Object.assign(options, { + strokeWidth: 4, + id: options.id || fetchUuid(), + originX: 'center', + originY: 'center', + lockScalingX: true, + lockScalingY: true, + lockRotation: true, + hasRotatingPoint: false, + hasControls: false, + hasBorders: false, + perPixelTargetFind: true, + lockMovementX: true, + lockMovementY: true, + selectable: false, + fromNode, + fromPort, + toNode, + toPort, + hoverCursor: 'pointer', + }); + this.callSuper('initialize', coords, options); + }, + setPort(fromNode: NodeObject, fromPort: PortObject, _toNode: NodeObject, toPort: PortObject) { + if (fromNode.type === 'BroadcastNode') { + fromPort = fromNode.fromPort[0]; + } + fromPort.links.push(this); + toPort.links.push(this); + this.setPortEnabled(fromNode, fromPort, false); + }, + setPortEnabled(node: NodeObject, port: PortObject, enabled: boolean) { + if (node.descriptor.outPortType !== OUT_PORT_TYPE.BROADCAST) { + port.set({ + enabled, + fill: enabled ? port.originFill : port.selectFill, + }); + } else { + if (node.toPort.id === port.id) { + return; + } + port.links.forEach((link, index) => { + link.set({ + fromPort: port, + fromPortIndex: index, + }); + }); + node.set({ + configuration: { + outputCount: port.links.length, + }, + }); + } + }, + toObject() { + return fabric.util.object.extend(this.callSuper('toObject'), { + id: this.get('id'), + name: this.get('name'), + superType: this.get('superType'), + configuration: this.get('configuration'), + fromNode: this.get('fromNode'), + fromPort: this.get('fromPort'), + toNode: this.get('toNode'), + toPort: this.get('toPort'), + }); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + ctx.save(); + const xDiff = this.x2 - this.x1; + const yDiff = this.y2 - this.y1; + const angle = Math.atan2(yDiff, xDiff); + ctx.translate((this.x2 - this.x1) / 2, (this.y2 - this.y1) / 2); + ctx.rotate(angle); + ctx.beginPath(); + if (this.arrow) { + // Move 5px in front of line to start the arrow so it does not have the square line end showing in front (0,0) + ctx.moveTo(5, 0); + ctx.lineTo(-5, 5); + ctx.lineTo(-5, -5); + } + ctx.closePath(); + ctx.lineWidth = this.strokeWidth; + ctx.fillStyle = this.stroke; + ctx.fill(); + ctx.restore(); + }, +}); + +Link.fromObject = (options: LinkObject, callback: (obj: LinkObject) => any) => { + const { fromNode, fromPort, toNode, toPort } = options; + return callback(new Link(fromNode, fromPort, toNode, toPort, options)); +}; + +// @ts-ignore +window.fabric.Link = Link; + +export default Link; diff --git a/src/pages/Fabric/canvas/objects/Node.ts b/src/pages/Fabric/canvas/objects/Node.ts new file mode 100644 index 0000000..2573a9e --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Node.ts @@ -0,0 +1,298 @@ +import { fabric } from 'fabric'; +import { useUuid } from '@/hooks/useUuid'; + +import { FabricObject } from '../utils'; +import { LinkObject } from './Link'; +import Port, { PortObject } from './Port'; + +// eslint-disable-next-line react-hooks/rules-of-hooks +const { fetchUuid } = useUuid(); +export const NODE_COLORS = { + TRIGGER: { + fill: '#48C9B0', + border: '#1ABC9C', + }, + LOGIC: { + fill: '#AF7AC5', + border: '#9B59B6', + }, + DATA: { + fill: '#5DADE2', + border: '#3498DB', + }, + ACTION: { + fill: '#F5B041', + border: 'rgb(243, 156, 18)', + }, +}; + +export const OUT_PORT_TYPE = { + SINGLE: 'SINGLE', + STATIC: 'STATIC', + DYNAMIC: 'DYNAMIC', + BROADCAST: 'BROADCAST', + NONE: 'NONE', +}; + +export const DESCRIPTIONS = { + script: "intl.formatMessage({ id: 'fabric.common.name', defaultMessage: '$$$' })", + template: "intl.formatMessage({ id: 'fabric.common.name', defaultMessage: '$$$' })", + json: "intl.formatMessage({ id: 'fabric.common.name', defaultMessage: '$$$' })", + cron: "intl.formatMessage({ id: 'fabric.common.name', defaultMessage: '$$$' })", +}; + +export const getEllipsis = (text: string, length: number) => { + if (!length) { + return /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.test(text) + ? text.length > 8 + ? text.substring(0, 8).concat('...') + : text + : text.length > 15 + ? text.substring(0, 15).concat('...') + : text; + } + return /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.test(text) + ? text.length > length / 2 + ? text.substring(0, length / 2).concat('...') + : text + : text.length > length + ? text.substring(0, length).concat('...') + : text; +}; + +export type NodeType = 'TRIGGER' | 'LOGIC' | 'DATA' | 'ACTION'; + +export interface NodeObject extends FabricObject<fabric.Group> { + errorFlag?: fabric.IText; + label?: fabric.Text; + toPort?: PortObject; + errors?: any; + fromPort?: PortObject[]; + descriptor?: Record<string, any>; + nodeClazz?: string; + configuration?: Record<string, any>; + defaultPortOption?: () => Partial<PortObject>; + toPortOption?: () => Partial<PortObject>; + fromPortOption?: () => Partial<PortObject>; + createToPort?: (left: number, top: number) => PortObject; + createFromPort?: (left: number, top: number) => PortObject[]; + singlePort?: (portOption: Partial<PortObject>) => PortObject[]; + staticPort?: (portOption: Partial<PortObject>) => PortObject[]; + dynamicPort?: (portOption: Partial<PortObject>) => PortObject[]; + broadcastPort?: (portOption: Partial<PortObject>) => PortObject[]; + setErrors?: (errors: any) => void; + duplicate?: () => NodeObject; +} + +const Node = fabric.util.createClass(fabric.Group, { + type: 'node', + superType: 'node', + initialize(options: any) { + options = options || {}; + const icon = new fabric.IText(options.icon || '\uE174', { + fontFamily: 'Font Awesome 5 Free', + fontWeight: 900, + fontSize: 20, + fill: 'rgba(255, 255, 255, 0.8)', + }); + let name = 'Default Node'; + if (options.name) { + name = getEllipsis(options.name, 18); + } + this.label = new fabric.Text(name || 'Default Node', { + fontSize: 16, + fontFamily: 'polestar', + fontWeight: 500, + fill: 'rgba(255, 255, 255, 0.8)', + }); + const rect = new fabric.Rect({ + rx: 10, + ry: 10, + width: 200, + height: 40, + fill: options.fill || 'rgba(0, 0, 0, 0.3)', + stroke: options.stroke || 'rgba(0, 0, 0, 0)', + strokeWidth: 2, + }); + this.errorFlag = new fabric.IText('\uf071', { + fontFamily: 'Font Awesome 5 Free', + fontWeight: 900, + fontSize: 14, + fill: 'rgba(255, 0, 0, 0.8)', + visible: options.errors, + }); + const node = [rect, icon, this.label, this.errorFlag]; + const option = Object.assign({}, options, { + id: options.id || fetchUuid(), + width: 200, + height: 40, + originX: 'left', + originY: 'top', + hasRotatingPoint: false, + hasControls: false, + }); + this.callSuper('initialize', node, option); + icon.set({ + top: icon.top + 10, + left: icon.left + 10, + }); + this.label.set({ + top: this.label.top + this.label.height / 2 + 4, + left: this.label.left + 35, + }); + this.errorFlag.set({ + left: rect.left, + top: rect.top, + visible: options.errors, + }); + }, + toObject() { + return fabric.util.object.extend(this.callSuper('toObject'), { + id: this.get('id'), + name: this.get('name'), + icon: this.get('icon'), + description: this.get('description'), + superType: this.get('superType'), + configuration: this.get('configuration'), + nodeClazz: this.get('nodeClazz'), + descriptor: this.get('descriptor'), + borderColor: this.get('borderColor'), + borderScaleFactor: this.get('borderScaleFactor'), + dblclick: this.get('dblclick'), + deletable: this.get('deletable'), + cloneable: this.get('cloneable'), + fromPort: this.get('fromPort'), + toPort: this.get('toPort'), + }); + }, + defaultPortOption() { + const { type }: { type: NodeType } = this.descriptor as any; + return { + nodeId: this.id, + hasBorders: false, + hasControls: false, + hasRotatingPoint: false, + selectable: false, + originX: 'center', + originY: 'center', + lockScalingX: true, + lockScalingY: true, + superType: 'port', + originFill: 'rgba(0, 0, 0, 0.1)', + hoverFill: 'rgba(0, 0, 0, 0.1)', + selectFill: 'rgba(0, 0, 0, 0.1)', + fill: 'rgba(0, 0, 0, 0.1)', + hoverCursor: 'pointer', + strokeWidth: 2, + stroke: this.descriptor ? NODE_COLORS[type].border : 'rgba(0, 0, 0, 1)', + width: 10, + height: 10, + links: [] as LinkObject[], + enabled: true, + }; + }, + toPortOption() { + return { + ...this.defaultPortOption(), + }; + }, + fromPortOption() { + return { + ...this.defaultPortOption(), + angle: 45, + }; + }, + createToPort(left: number, top: number) { + if (this.descriptor.inEnabled) { + this.toPort = new Port({ + id: 'defaultInPort', + type: 'toPort', + ...this.toPortOption(), + left, + top, + }); + } + return this.toPort; + }, + createFromPort(left: number, top: number) { + if (this.descriptor.outPortType === OUT_PORT_TYPE.BROADCAST) { + this.fromPort = this.broadcastPort({ ...this.fromPortOption(), left, top }); + } else if (this.descriptor.outPortType === OUT_PORT_TYPE.STATIC) { + this.fromPort = this.staticPort({ ...this.fromPortOption(), left, top }); + } else if (this.descriptor.outPortType === OUT_PORT_TYPE.DYNAMIC) { + this.fromPort = this.dynamicPort({ ...this.fromPortOption(), left, top }); + } else if (this.descriptor.outPortType === OUT_PORT_TYPE.NONE) { + this.fromPort = []; + } else { + this.fromPort = this.singlePort({ ...this.fromPortOption(), left, top }); + } + return this.fromPort; + }, + singlePort(portOption: any) { + const fromPort = new Port({ + id: 'defaultFromPort', + type: 'fromPort', + ...portOption, + }); + return [fromPort]; + }, + staticPort(portOption: any) { + return this.descriptor.outPorts.map((outPort: any, i: number) => { + return new Port({ + id: outPort, + type: 'fromPort', + ...portOption, + left: i === 0 ? portOption.left - 20 : portOption.left + 20, + top: portOption.top, + leftDiff: i === 0 ? -20 : 20, + fill: i === 0 ? 'rgba(0, 255, 0, 0.3)' : 'rgba(255, 0, 0, 0.3)', + originFill: i === 0 ? 'rgba(0, 255, 0, 0.3)' : 'rgba(255, 0, 0, 0.3)', + hoverFill: i === 0 ? 'rgba(0, 255, 0, 1)' : 'rgba(255, 0, 0, 1)', + }); + }); + }, + dynamicPort(_portOption: any): any[] { + return []; + }, + broadcastPort(portOption: any) { + return this.singlePort(portOption); + }, + setErrors(errors: any) { + this.set({ + errors, + }); + if (errors) { + this.errorFlag.set({ + visible: true, + }); + } else { + this.errorFlag.set({ + visible: false, + }); + } + }, + duplicate() { + const options = this.toObject(); + options.id = fetchUuid(); + options.name = `${options.name}_clone`; + return new Node(options); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + }, +}); + +Node.fromObject = (options: NodeObject, callback: (obj: NodeObject) => any) => { + return callback(new Node(options)); +}; + +// @ts-ignore +window.fabric.FromPort = Port; + +// @ts-ignore +window.fabric.ToPort = Port; + +// @ts-ignore +window.fabric.Node = Node; + +export default Node; diff --git a/src/pages/Fabric/canvas/objects/OrthogonalLink.ts b/src/pages/Fabric/canvas/objects/OrthogonalLink.ts new file mode 100644 index 0000000..3bfcff5 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/OrthogonalLink.ts @@ -0,0 +1,61 @@ +import { fabric } from 'fabric'; +import Link, { LinkObject } from './Link'; +import { NodeObject } from './Node'; +import { PortObject } from './Port'; + +const OrthogonalLink = fabric.util.createClass(Link, { + type: 'OrthogonalLink', + superType: 'link', + initialize( + fromNode: Partial<NodeObject>, + fromPort: Partial<PortObject>, + toNode: Partial<NodeObject>, + toPort: Partial<PortObject>, + options: Partial<LinkObject>, + ) { + options = options || {}; + this.callSuper('initialize', fromNode, fromPort, toNode, toPort, options); + }, + _render(ctx: CanvasRenderingContext2D) { + // Drawing orthogonal link + const { x1, y1, x2, y2 } = this; + ctx.lineWidth = this.strokeWidth; + ctx.strokeStyle = this.stroke; + const fp = { x: (x1 - x2) / 2, y: (y1 - y2) / 2 }; + const sp = { x: (x2 - x1) / 2, y: (y2 - y1) / 2 }; + ctx.lineJoin = 'round'; + ctx.beginPath(); + ctx.moveTo(fp.x, fp.y); + ctx.lineTo(fp.x, sp.y / 2); + ctx.lineTo(sp.x, sp.y / 2); + ctx.lineTo(sp.x, sp.y); + ctx.stroke(); + ctx.save(); + const xDiff = this.x2 - this.x1; + const yDiff = this.y2 - this.y1; + const angle = Math.atan2(yDiff, xDiff); + ctx.translate((this.x2 - this.x1) / 2, (this.y2 - this.y1) / 2); + ctx.rotate(angle >= 0 ? 1.57 : -1.57); + ctx.beginPath(); + if (this.arrow) { + // Move 5px in front of line to start the arrow so it does not have the square line end showing in front (0,0) + ctx.moveTo(5, 0); + ctx.lineTo(-5, 5); + ctx.lineTo(-5, -5); + } + ctx.closePath(); + ctx.fillStyle = this.stroke; + ctx.fill(); + ctx.restore(); + }, +}); + +OrthogonalLink.fromObject = (options: LinkObject, callback: (obj: LinkObject) => any) => { + const { fromNode, fromPort, toNode, toPort } = options; + return callback(new OrthogonalLink(fromNode, fromPort, toNode, toPort, options)); +}; + +// @ts-ignore +window.fabric.OrthogonalLink = OrthogonalLink; + +export default OrthogonalLink; diff --git a/src/pages/Fabric/canvas/objects/Port.ts b/src/pages/Fabric/canvas/objects/Port.ts new file mode 100644 index 0000000..8dcf1d9 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Port.ts @@ -0,0 +1,41 @@ +import { fabric } from 'fabric'; + +import { FabricObject } from '../utils'; +import { LinkObject } from './Link'; + +export interface PortObject extends FabricObject<fabric.Rect> { + links?: LinkObject[]; + nodeId?: string; + enabled?: boolean; + hoverFill?: string; + selectFill?: string; +} + +const Port = fabric.util.createClass(fabric.Rect, { + type: 'port', + superType: 'port', + initialize(options: any) { + options = options || {}; + this.callSuper('initialize', options); + }, + toObject() { + return fabric.util.object.extend(this.callSuper('toObject'), { + id: this.get('id'), + superType: this.get('superType'), + enabled: this.get('enabled'), + nodeId: this.get('nodeId'), + }); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + }, +}); + +Port.fromObject = (options: PortObject, callback: (obj: PortObject) => any) => { + return callback(new Port(options)); +}; + +// @ts-ignore +window.fabric.Port = Port; + +export default Port; diff --git a/src/pages/Fabric/canvas/objects/Svg.ts b/src/pages/Fabric/canvas/objects/Svg.ts new file mode 100644 index 0000000..0e57434 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Svg.ts @@ -0,0 +1,104 @@ +import { fabric } from 'fabric'; +import { FabricGroup, FabricObject, FabricObjectOption, toObject } from '../utils'; + +export type SvgObject = (FabricGroup | FabricObject) & { + loadSvg(option: SvgOption): Promise<SvgObject>; + setFill(value: string): SvgObject; + setStroke(value: string): SvgObject; +}; + +export interface SvgOption extends FabricObjectOption { + svg?: string; + loadType?: 'file' | 'svg'; +} + +const Svg = fabric.util.createClass(fabric.Group, { + type: 'svg', + initialize(option: SvgOption = {}) { + this.callSuper('initialize', [], option); + this.loadSvg(option); + }, + addSvgElements(objects: FabricObject[], options: any, path: string) { + const createdObj = fabric.util.groupSVGElements(objects, options, path) as SvgObject; + this.set(options); + if (createdObj.getObjects) { + (createdObj as FabricGroup).getObjects().forEach(obj => { + this.add(obj); + if (options.fill) { + obj.set('fill', options.fill); + } + if (options.stroke) { + obj.set('stroke', options.stroke); + } + }); + } else { + createdObj.set({ + originX: 'center', + originY: 'center', + }); + if (options.fill) { + createdObj.set({ + fill: options.fill, + }); + } + if (options.stroke) { + createdObj.set({ + stroke: options.stroke, + }); + } + if (this._objects?.length) { + (this as FabricGroup)._objects.forEach(obj => this.remove(obj)); + } + this.add(createdObj); + } + this.set({ + fill: options.fill || 'rgba(0, 0, 0, 1)', + stroke: options.stroke || 'rgba(255, 255, 255, 0)', + }); + this.setCoords(); + if (this.canvas) { + this.canvas.requestRenderAll(); + } + return this; + }, + loadSvg(option: SvgOption) { + const { svg, loadType, fill, stroke } = option; + return new Promise<SvgObject>(resolve => { + if (loadType === 'svg') { + fabric.loadSVGFromString(svg, (objects, options) => { + resolve(this.addSvgElements(objects, { ...options, fill, stroke }, svg)); + }); + } else { + fabric.loadSVGFromURL(svg, (objects, options) => { + resolve(this.addSvgElements(objects, { ...options, fill, stroke }, svg)); + }); + } + }); + }, + setFill(value: any) { + this.getObjects().forEach((obj: FabricObject) => obj.set('fill', value)); + return this; + }, + setStroke(value: any) { + this.getObjects().forEach((obj: FabricObject) => obj.set('stroke', value)); + return this; + }, + toObject(propertiesToInclude: string[]) { + return toObject(this, propertiesToInclude, { + svg: this.get('svg'), + loadType: this.get('loadType'), + }); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + }, +}); + +Svg.fromObject = (option: SvgOption, callback: (obj: SvgObject) => any) => { + return callback(new Svg(option)); +}; + +// @ts-ignore +window.fabric.Svg = Svg; + +export default Svg; diff --git a/src/pages/Fabric/canvas/objects/Video.ts b/src/pages/Fabric/canvas/objects/Video.ts new file mode 100644 index 0000000..37f608d --- /dev/null +++ b/src/pages/Fabric/canvas/objects/Video.ts @@ -0,0 +1,129 @@ +import { fabric } from 'fabric'; +// import 'mediaelement'; +// import 'mediaelement/build/mediaelementplayer.min.css'; +import { FabricElement, toObject } from '../utils'; + +export interface VideoObject extends FabricElement { + setSource: (source: string | File) => void; + setFile: (file: File) => void; + setSrc: (src: string) => void; + file?: File; + src?: string; + videoElement?: HTMLVideoElement; + player?: any; +} + +const Video = fabric.util.createClass(fabric.Rect, { + type: 'video', + superType: 'element', + hasRotatingPoint: false, + initialize(source: string | File, options: any) { + options = options || {}; + this.callSuper('initialize', options); + if (source instanceof File) { + this.set({ + file: source, + src: null, + }); + } else { + this.set({ + file: null, + src: source, + }); + } + this.set({ + fill: 'rgba(255, 255, 255, 0)', + stroke: 'rgba(255, 255, 255, 0)', + }); + }, + setSource(source: any) { + if (source instanceof File) { + this.setFile(source); + } else { + this.setSrc(source); + } + }, + setFile(file: File) { + this.set({ + file, + src: null, + }); + const reader = new FileReader(); + reader.onload = () => { + this.player.setSrc(reader.result); + }; + reader.readAsDataURL(file); + }, + setSrc(src: string) { + this.set({ + file: null, + src, + }); + this.player.setSrc(src); + }, + toObject(propertiesToInclude: string[]) { + return toObject(this, propertiesToInclude, { + src: this.get('src'), + file: this.get('file'), + container: this.get('container'), + editable: this.get('editable'), + }); + }, + _render(ctx: CanvasRenderingContext2D) { + this.callSuper('_render', ctx); + if (!this.element) { + const { id, scaleX, scaleY, width, height, angle, editable, src, file, autoplay, muted, loop } = this; + const zoom = this.canvas.getZoom(); + const left = this.calcCoords().tl.x; + const top = this.calcCoords().tl.y; + const padLeft = (width * scaleX * zoom - width) / 2; + const padTop = (height * scaleY * zoom - height) / 2; + this.videoElement = fabric.util.makeElement('video', { + id, + autoplay: editable ? false : autoplay, + muted: editable ? false : muted, + loop: editable ? false : loop, + preload: 'none', + controls: false, + }); + this.element = fabric.util.wrapElement(this.videoElement, 'div', { + id: `${id}_container`, + style: `transform: rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom}); + width: ${width}px; + height: ${height}px; + left: ${left + padLeft}px; + top: ${top + padTop}px; + position: absolute; + user-select: ${editable ? 'none' : 'auto'}; + pointer-events: ${editable ? 'none' : 'auto'};`, + }) as HTMLDivElement; + const container = document.getElementById(this.container); + container.appendChild(this.element); + this.player = new MediaElementPlayer(id, { + pauseOtherPlayers: false, + videoWidth: '100%', + videoHeight: '100%', + success: (_mediaeElement: any, _originalNode: any, instance: any) => { + if (editable) { + instance.pause(); + } + }, + }); + this.player.setPlayerSize(width, height); + if (src) { + this.setSrc(src); + } else if (file) { + this.setFile(file); + } + } + }, +}); + +Video.fromObject = (options: VideoObject, callback: (obj: VideoObject) => any) => { + return callback(new Video(options.src || options.file, options)); +}; + +// @ts-ignore +window.fabric.Video = Video; + +export default Video; diff --git a/src/pages/Fabric/canvas/objects/index.ts b/src/pages/Fabric/canvas/objects/index.ts new file mode 100644 index 0000000..0f8beb1 --- /dev/null +++ b/src/pages/Fabric/canvas/objects/index.ts @@ -0,0 +1,22 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-20 13:39:07 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-28 14:55:08 + * @FilePath: \react-design-editor\src\canvas\objects\index.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +export { default as Arrow } from './Arrow'; +export { default as CirclePort } from './CirclePort'; +export { default as Cube } from './Cube'; +export { default as CurvedLink } from './CurvedLink'; +export { default as Element } from './Element'; +export { default as Gif } from './Gif'; +export { default as Iframe } from './Iframe'; +export { default as Line } from './Line'; +export { default as Link } from './Link'; +export { default as Node } from './Node'; +export { default as OrthogonalLink } from './OrthogonalLink'; +export { default as Port } from './Port'; +export { default as Svg } from './Svg'; +export { default as Video } from './Video'; diff --git a/src/pages/Fabric/canvas/styles/canvas.less b/src/pages/Fabric/canvas/styles/canvas.less new file mode 100644 index 0000000..0f4ec23 --- /dev/null +++ b/src/pages/Fabric/canvas/styles/canvas.less @@ -0,0 +1,10 @@ +.rde-canvas { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + iframe { + pointer-events: none; + } +} \ No newline at end of file diff --git a/src/pages/Fabric/canvas/styles/contextmenu.less b/src/pages/Fabric/canvas/styles/contextmenu.less new file mode 100644 index 0000000..2c92b13 --- /dev/null +++ b/src/pages/Fabric/canvas/styles/contextmenu.less @@ -0,0 +1,29 @@ +.rde-contextmenu { + position: fixed; + -moz-animation: visibility .3s linear; + -webkit-animation: visibility .3s linear; + animation: visibility .3s linear; + z-index: 600000; + &-right { + position: relative; + border-radius: 4px; + background: rgba(0, 0, 0, 0.35); + color: #fff; + font-size: 14px; + padding: 8px; + margin-left: 12px; + } + &-left { + position: relative; + border-radius: 4px; + background: rgba(0, 0, 0, 0.35); + color: #fff; + font-size: 14px; + padding: 8px; + } + &.contextmenu-hidden { + display: none; + top: 0; + left: 0; + } +} \ No newline at end of file diff --git a/src/pages/Fabric/canvas/styles/fabricjs.less b/src/pages/Fabric/canvas/styles/fabricjs.less new file mode 100644 index 0000000..18ad3d4 --- /dev/null +++ b/src/pages/Fabric/canvas/styles/fabricjs.less @@ -0,0 +1,3 @@ +.canvas-container { + outline: none; +} diff --git a/src/pages/Fabric/canvas/styles/tooltip.less b/src/pages/Fabric/canvas/styles/tooltip.less new file mode 100644 index 0000000..9c49cd9 --- /dev/null +++ b/src/pages/Fabric/canvas/styles/tooltip.less @@ -0,0 +1,50 @@ +.rde-tooltip { + position: fixed; + -moz-animation: visibility .3s linear; + -webkit-animation: visibility .3s linear; + animation: visibility .3s linear; + z-index: 600000; + &-right { + position: relative; + border-radius: 4px; + background: rgba(0, 0, 0, 0.35); + color: #fff; + font-size: 14px; + padding: 8px; + margin-left: 12px; + &::after { + content: ''; + position: absolute; + top: 50%; + left: 0; /* To the left of the tooltip */ + margin-left: -10px; + margin-top: -5px; + border-width: 5px; + border-style: solid; + border-color: transparent rgba(0, 0, 0, 0.35) transparent transparent; + } + } + &-left { + position: relative; + border-radius: 4px; + background: rgba(0, 0, 0, 0.35); + color: #fff; + font-size: 14px; + padding: 8px; + &::after { + content: ''; + position: absolute; + top: 50%; + left: 100%; /* To the left of the tooltip */ + margin-top: -5px; + border-width: 5px; + border-style: solid; + border-color: transparent transparent transparent rgba(0, 0, 0, 0.35); + } + } + &.tooltip-hidden { + display: none; + top: 0; + left: 0; + } +} \ No newline at end of file diff --git a/src/pages/Fabric/canvas/utils/ObjectUtil.ts b/src/pages/Fabric/canvas/utils/ObjectUtil.ts new file mode 100644 index 0000000..1fa5a8d --- /dev/null +++ b/src/pages/Fabric/canvas/utils/ObjectUtil.ts @@ -0,0 +1,433 @@ + import { fabric } from 'fabric'; +import { IFilter } from '../handlers/ImageHandler'; + +export type AnimationType = 'fade' | 'bounce' | 'shake' | 'scaling' | 'rotation' | 'flash' | 'custom' | 'none'; + +export interface AnimationProperty { + delay?: number; + duration?: number; + autoplay?: boolean; + loop?: boolean | number; + type: AnimationType; + offset?: number; + opacity?: number; + bounce?: 'vertical' | 'horizontal'; + shake?: 'vertical' | 'horizontal'; + scale?: number; + angle?: number; + fill?: string | fabric.Pattern; + stroke?: string; +} + +export interface LinkProperty { + enabled?: boolean; + type?: string; + state?: string; + [key: string]: any; +} + +export interface TooltipProperty { + enabled?: boolean; + type?: string; + template?: string; +} + +export interface TriggerProperty { + enabled?: boolean; + type?: string; + script?: string; + effect?: string; +} + +export interface FabricCanvasOption { + wrapperEl?: HTMLElement; +} + +export type FabricCanvas<T extends any = fabric.Canvas> = T & FabricCanvasOption; + +export type FabricObjectOption<T extends any = fabric.IObjectOptions> = T & { + /** + * Object id + * @type {string} + */ + id?: string; + /** + * Parent object id + * @type {string} + */ + parentId?: string; + /** + * Original opacity + * @type {number} + */ + originOpacity?: number; + /** + * Original top position + * @type {number} + */ + originTop?: number; + /** + * Original left position + * @type {number} + */ + originLeft?: number; + /** + * Original scale X + * @type {number} + */ + originScaleX?: number; + /** + * Original scale Y + * @type {number} + */ + originScaleY?: number; + /** + * Original angle + * @type {number} + */ + originAngle?: number; + /** + * Original fill color + * + * @type {(string | fabric.Pattern | fabric.Gradient)} + */ + originFill?: string | fabric.Pattern | fabric.Gradient; + /** + * Original stroke color + * @type {string} + */ + originStroke?: string; + /** + * Original rotation + * + * @type {number} + */ + originRotation?: number; + /** + * Object editable + * @type {boolean} + */ + editable?: boolean; + /** + * Object Super type + * @type {string} + */ + superType?: string; + /** + * @description + * @type {string} + */ + description?: string; + /** + * Animation property + * @type {AnimationProperty} + */ + animation?: AnimationProperty; + /** + * Anime instance + * @type {anime.AnimeInstance} + */ + anime?: anime.AnimeInstance; + /** + * Tooltip property + * @type {TooltipProperty} + */ + tooltip?: TooltipProperty; + /** + * Link property + * @type {LinkProperty} + */ + link?: LinkProperty; + /** + * Is running animation + * @type {boolean} + */ + animating?: boolean; + /** + * Object class + * @type {string} + */ + class?: string; + /** + * Is possible delete + * @type {boolean} + */ + deletable?: boolean; + /** + * Is enable double click + * @type {boolean} + */ + dblclick?: boolean; + /** + * Is possible clone + * @type {boolean} + */ + cloneable?: boolean; + /** + * Is locked object + * @type {boolean} + */ + locked?: boolean; + /** + * This property replaces "angle" + * + * @type {number} + */ + rotation?: number; + /** + * Whether it can be clicked + * + * @type {boolean} + */ + clickable?: boolean; + [key: string]: any; +}; + +export type FabricObject<T extends any = fabric.Object> = T & FabricObjectOption; + +export type FabricGroup = FabricObject<fabric.Group> & { + /** + * Object that config group + * @type {FabricObject[]} + */ + objects?: FabricObject[]; +}; + +export type FabricImage = FabricObject & + fabric.Image & { + /** + * Image URL + * @type {string} + */ + src?: string; + /** + * Image File or Blob + * @type {File} + */ + file?: File; + /** + * Image Filter + * @type {IFilter[]} + */ + filters?: IFilter[]; + _element?: any; + }; + +export interface FabricElement extends FabricObject<fabric.Rect> { + /** + * Wrapped Element + * @type {HTMLDivElement} + */ + container: HTMLDivElement; + /** + * Target Element + * @type {HTMLDivElement} + */ + element: HTMLDivElement; + /** + * Source of Element Object + */ + setSource: (source: any) => void; +} + +export type WorkareaLayout = 'fixed' | 'responsive' | 'fullscreen'; + +export interface WorkareaOption { + /** + * Image URL + * @type {string} + */ + src?: string; + /** + * Image File or Blbo + * @type {File} + */ + file?: File; + /** + * Workarea Width + * @type {number} + */ + width?: number; + /** + * Workarea Height + * @type {number} + */ + height?: number; + /** + * Workarea Background Color + * @type {string} + */ + backgroundColor?: string; + /** + * Workarea Layout Type + * @type {WorkareaLayout} + */ + layout?: WorkareaLayout; +} + +export type WorkareaObject = FabricImage & { + /** + * Workarea Layout Type + * @type {WorkareaLayout} + */ + layout?: WorkareaLayout; + /** + * Workarea Image Element + * @type {HTMLImageElement} + */ + _element?: HTMLImageElement; + /** + * Whether exist the element + * @type {boolean} + */ + isElement?: boolean; + /** + * Stored width in workarea + * @type {number} + */ + workareaWidth?: number; + /** + * Stored height in workarea + * @type {number} + */ + workareaHeight?: number; +}; + +export interface CanvasOption extends fabric.ICanvasOptions { + /** + * Unique id of Canvas + * @type {string} + */ + id?: string; +} + +export interface GridOption { + /** + * Whether should be enabled + * @type {boolean} + */ + enabled?: boolean; + /** + * Grid interval + * @type {number} + */ + grid?: number; + /** + * When had moved object, whether should adjust position on grid interval + * @type {boolean} + */ + snapToGrid?: boolean; + /** + * Grid line color + * + * @type {string} + */ + lineColor?: string; + /** + * Grid border color + * + * @type {string} + */ + borderColor?: string; +} + +export interface GuidelineOption { + /** + * When have moved object, whether should show guideline + * @type {boolean} + */ + enabled?: boolean; +} + +export interface KeyEvent { + /** + * Arrow key + * @type {boolean} + */ + move?: boolean; + /** + * Ctrl + A + * @type {boolean} + */ + all?: boolean; + /** + * Ctrl + C + * @type {boolean} + */ + copy?: boolean; + /** + * Ctrl + P + * @type {boolean} + */ + paste?: boolean; + /** + * Escape + * @type {boolean} + */ + esc?: boolean; + /** + * Delete or Backspace + * @type {boolean} + */ + del?: boolean; + /** + * When have copied object, whether should copy object option on clipboard + * @type {boolean} + */ + clipboard?: boolean; + /** + * Ctrl + Z, Ctrl + Y + * @type {boolean} + */ + transaction?: boolean; + /** + * Plus, Minus + * + * @type {boolean} + */ + zoom?: boolean; + /** + * Ctrl + X + * + * @type {boolean} + */ + cut?: boolean; + grab?: boolean; +} + +export type InteractionMode = 'selection' | 'grab' | 'polygon' | 'line' | 'arrow' | 'link' | 'crop'; + +export interface FabricEvent<T extends any = Event> extends Omit<fabric.IEvent, 'e'> { + e: T; + target?: FabricObject; + subTargets?: FabricObject[]; + button?: number; + isClick?: boolean; + pointer?: fabric.Point; + absolutePointer?: fabric.Point; + transform?: { corner: string; original: FabricObject; originX: string; originY: string; width: number }; +} + +export type FabricObjects = { + [key: string]: { + create: (...args: any) => FabricObject; + }; +}; + +/** + * toObject util + * @param {*} obj + * @param {string[]} propertiesToInclude + * @param {{ [key: string]: any }} [properties] + */ +export const toObject = (obj: any, propertiesToInclude: string[], properties?: { [key: string]: any }) => + fabric.util.object.extend( + obj.callSuper('toObject'), + propertiesToInclude.reduce( + (prev, property) => + Object.assign(prev, { + [property]: obj.get(property), + }), + Object.assign({}, properties), + ), + ); diff --git a/src/pages/Fabric/canvas/utils/index.ts b/src/pages/Fabric/canvas/utils/index.ts new file mode 100644 index 0000000..e178192 --- /dev/null +++ b/src/pages/Fabric/canvas/utils/index.ts @@ -0,0 +1 @@ +export * from './ObjectUtil'; diff --git a/src/pages/Fabric/components/ace/AceEditor.js b/src/pages/Fabric/components/ace/AceEditor.js new file mode 100644 index 0000000..781c7bb --- /dev/null +++ b/src/pages/Fabric/components/ace/AceEditor.js @@ -0,0 +1,199 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Form, Row, Col } from 'antd'; +import {debounce } from 'lodash'; +import ReactAce from 'react-ace'; + +import 'ace-builds/src-noconflict/mode-html'; +import 'ace-builds/src-noconflict/mode-css'; +import 'ace-builds/src-noconflict/mode-javascript'; +import 'ace-builds/src-noconflict/theme-github'; + +import AcePreview from './AcePreview'; + +const defaultStyle = { + padding: 12, +}; + +class AceEditor extends Component { + handlers = { + onChangeHTML: debounce((value) => { + this.setState({ + html: value, + htmlAnnotations: this.htmlRef.editor.getSession().getAnnotations(), + }, () => { + if (this.props.onChangeHTML) { + this.props.onChangeHTML(value); + } + }); + }, 500), + onChangeCSS: debounce((value) => { + this.setState({ + css: value, + cssAnnotations: this.cssRef.editor.getSession().getAnnotations(), + }, () => { + if (this.props.onChangeCSS) { + this.props.onChangeCSS(value); + } + }); + }, 500), + onChangeJS: debounce((value) => { + this.setState({ + js: value, + jsAnnotations: this.jsRef.editor.getSession().getAnnotations(), + }, () => { + if (this.props.onChangeJS) { + this.props.onChangeJS(value); + } + }); + }, 500), + onValidateHTML: (annotations) => { + let i = annotations.length; + const len = annotations.length; + while (i--) { + if (/doctype first\. Expected/.test(annotations[i].text)) { + annotations.splice(i, 1); + } else if (/Unexpected End of file\. Expected/.test(annotations[i].text)) { + annotations.splice(i, 1); + } + } + if (len > annotations.length) { + this.htmlRef.editor.getSession().setAnnotations(annotations); + } + }, + getAnnotations: () => { + const { htmlAnnotations, cssAnnotations, jsAnnotations } = this.state; + return { + htmlAnnotations, + cssAnnotations, + jsAnnotations, + }; + }, + getCodes: () => { + const { html, css, js } = this.state; + return { + html, + css, + js, + }; + }, + } + + static propTypes = { + isHTML: PropTypes.bool, + isCSS: PropTypes.bool, + isJS: PropTypes.bool, + isPreview: PropTypes.bool, + html: PropTypes.string, + css: PropTypes.string, + js: PropTypes.string, + } + + static defaultProps = { + isHTML: true, + isCSS: true, + isJS: true, + isPreview: true, + html: '', + css: '', + js: '', + } + + state = { + html: this.props.html, + css: this.props.css, + js: this.props.js, + htmlAnnotations: [], + cssAnnotations: [], + jsAnnotations: [], + } + + componentWillUnmount() { + this.htmlRef.editor.destroy(); + this.cssRef.editor.destroy(); + this.jsRef.editor.destroy(); + } + + render() { + const { isHTML, isCSS, isJS, isPreview } = this.props; + const { html, css, js } = this.state; + return ( + <Row> + { + isHTML ? ( + <Col span={12} style={defaultStyle}> + <Form.Item label="HTML" colon={false}> + <ReactAce + ref={(c) => { this.htmlRef = c; }} + mode="html" + theme="github" + width="100%" + height="200px" + defaultValue={html} + value={html} + editorProps={{ + $blockScrolling: true, + }} + onChange={this.handlers.onChangeHTML} + /> + </Form.Item> + </Col> + ) : null + } + { + isCSS ? ( + <Col span={12} style={defaultStyle}> + <Form.Item label="CSS" colon={false}> + <ReactAce + ref={(c) => { this.cssRef = c; }} + mode="css" + theme="github" + width="100%" + height="200px" + defaultValue={css} + value={css} + editorProps={{ + $blockScrolling: true, + }} + onChange={this.handlers.onChangeCSS} + /> + </Form.Item> + </Col> + ) : null + } + { + isJS ? ( + <Col span={12} style={defaultStyle}> + <Form.Item label="JS" colon={false}> + <ReactAce + ref={(c) => { this.jsRef = c; }} + mode="javascript" + theme="github" + width="100%" + height="200px" + defaultValue={js} + value={js} + editorProps={{ + $blockScrolling: true, + }} + onChange={this.handlers.onChangeJS} + /> + </Form.Item> + </Col> + ) : null + } + { + isPreview ? ( + <Col span={12} style={defaultStyle}> + <Form.Item label="Preview" colon={false}> + <AcePreview html={html} css={css} js={js} /> + </Form.Item> + </Col> + ) : null + } + </Row> + ); + } +} + +export default AceEditor; diff --git a/src/pages/Fabric/components/ace/AceModal.js b/src/pages/Fabric/components/ace/AceModal.js new file mode 100644 index 0000000..582dfe5 --- /dev/null +++ b/src/pages/Fabric/components/ace/AceModal.js @@ -0,0 +1,120 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Form, Modal, Button, notification } from 'antd'; +import Icon from '../icon/Icon'; +import AceEditor from './AceEditor'; + +notification.config({ + top: 80, + duration: 1, +}); + +class AceModal extends Component { + static propTypes = { + value: PropTypes.any, + onChange: PropTypes.func, + form: PropTypes.any, + }; + + handlers = { + onOk: () => { + const { onChange } = this.props; + const code = this.aceRef.handlers.getCodes(); + onChange(code); + this.setState({ + visible: false, + code, + }); + }, + onCancel: () => { + this.modalHandlers.onHide(); + }, + onClick: () => { + this.modalHandlers.onShow(); + }, + }; + + modalHandlers = { + onShow: () => { + this.setState({ + visible: true, + }); + }, + onHide: () => { + this.setState({ + visible: false, + }); + }, + }; + + state = { + code: this.props.value || { html: '', css: '', js: '' }, + visible: false, + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + code: nextProps.value || { html: '', css: '', js: '' }, + }); + } + + render() { + const { onOk, onCancel, onClick } = this.handlers; + const { form } = this.props; + const { getFieldDecorator } = form; + const { + code: { html, css, js }, + visible, + } = this.state; + const label = ( + <React.Fragment> + <span style={{ marginRight: 8 }}>Code Editor</span> + <Button onClick={onClick} shape="circle"> + <Icon name="code" /> + </Button> + </React.Fragment> + ); + return ( + <React.Fragment> + <Form.Item label={label} colon={false}> + {getFieldDecorator('code', { + rules: [ + { + required: true, + message: 'Please input code', + }, + ], + initialValue: '', + })(<span />)} + </Form.Item> + <Form.Item label="HTML" colon={false}> + {getFieldDecorator('html', { + initialValue: html || '', + })(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{html}</pre>)} + </Form.Item> + <Form.Item label="CSS" colon={false}> + {getFieldDecorator('css', { + initialValue: css || '', + })(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{css}</pre>)} + </Form.Item> + <Form.Item label="JS" colon={false}> + {getFieldDecorator('js', { + initialValue: js || '', + })(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{js}</pre>)} + </Form.Item> + <Modal onCancel={onCancel} onOk={onOk} visible={visible} width="80%"> + <AceEditor + ref={(c) => { + this.aceRef = c; + }} + html={html} + css={css} + js={js} + /> + </Modal> + </React.Fragment> + ); + } +} + +export default AceModal; diff --git a/src/pages/Fabric/components/ace/AcePreview.js b/src/pages/Fabric/components/ace/AcePreview.js new file mode 100644 index 0000000..b883b0f --- /dev/null +++ b/src/pages/Fabric/components/ace/AcePreview.js @@ -0,0 +1,63 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +class AcePreview extends Component { + static propTypes = { + html: PropTypes.string, + css: PropTypes.string, + js: PropTypes.string, + }; + + static defaultProps = { + html: '', + css: '', + js: '', + }; + + componentDidMount() { + const { html, css, js } = this.props; + this.iframeRender(html, css, js); + } + + componentDidUpdate(prevProps) { + if (this.container) { + const { html, css, js } = this.props; + if (html !== prevProps.html || css !== prevProps.css || js !== prevProps.js) { + this.iframeRender(html, css, js); + } + } + } + + iframeRender = (html, css, js) => { + while (this.container.hasChildNodes()) { + this.container.removeChild(this.container.firstChild); + } + const iframe = document.createElement('iframe'); + iframe.width = '100%'; + iframe.height = '200px'; + this.container.appendChild(iframe); + const style = document.createElement('style'); + style.type = 'text/css'; + style.innerHTML = css; + iframe.contentDocument.head.appendChild(style); + const script = document.createElement('script'); + script.type = 'text/javascript'; + script.innerHTML = js; + iframe.contentDocument.head.appendChild(script); + iframe.contentDocument.body.innerHTML = html; + }; + + render() { + return ( + <div + ref={(c) => { + this.container = c; + }} + id="code-preview" + style={{ width: '100%', height: 200 }} + /> + ); + } +} + +export default AcePreview; diff --git a/src/pages/Fabric/components/common/ChartModal.js b/src/pages/Fabric/components/common/ChartModal.js new file mode 100644 index 0000000..ecf62f9 --- /dev/null +++ b/src/pages/Fabric/components/common/ChartModal.js @@ -0,0 +1,109 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Modal, Button, Form } from 'antd'; +import ReactAce from 'react-ace'; + +import Icon from '../icon/Icon'; + +import 'ace-builds/src-noconflict/mode-javascript'; +import 'ace-builds/src-noconflict/theme-github'; + + +class CodeModal extends Component { + + static propTypes = { + value: PropTypes.any, + onChange: PropTypes.func, + form: PropTypes.any, + }; + + state = { + chartOption: this.props.value, + visible: false, + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + chartOption: nextProps.value, + }); + } + + handlers = { + onOk: () => { + const { onChange } = this.props; + const { tempChartOption } = this.state; + onChange(tempChartOption); + this.setState({ + visible: false, + chartOption: tempChartOption, + }); + }, + onCancel: () => { + this.modalHandlers.onHide(); + }, + onClick: () => { + this.modalHandlers.onShow(); + }, + }; + + modalHandlers = { + onShow: () => { + this.setState({ + visible: true, + }); + }, + onHide: () => { + this.setState({ + visible: false, + }); + }, + }; + + render() { + const { onOk, onCancel, onClick } = this.handlers; + const { form } = this.props; + const { getFieldDecorator } = form; + const { visible, chartOption, tempChartOption } = this.state; + const label = ( + <React.Fragment> + <span style={{ marginRight: 8 }}> {"intl.formatMessage({ id: 'fabric.common.code', defaultMessage: '$$$' })"}</span> + <Button onClick={onClick} shape="circle" className="rde-action-btn"> + <Icon name="edit" /> + </Button> + </React.Fragment> + ); + const codeLabel = <span>Code (value, styles, animations, userProperty)</span>; + return ( + <React.Fragment> + <Form.Item label={label} colon={false}> + {getFieldDecorator('chartOption', { + initialValue: chartOption, + })(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{chartOption}</pre>)} + </Form.Item> + <Modal onCancel={onCancel} onOk={onOk} visible={visible} style={{ minWidth: 800 }}> + <Form.Item label={codeLabel} colon={false}> + <ReactAce + ref={c => { + this.jsRef = c; + }} + mode="javascript" + theme="github" + width="100%" + height="600px" + defaultValue={chartOption} + value={tempChartOption} + editorProps={{ + $blockScrolling: true, + }} + onChange={text => { + this.setState({ tempChartOption: text }); + }} + /> + </Form.Item> + </Modal> + </React.Fragment> + ); + } +} + +export default CodeModal; diff --git a/src/pages/Fabric/components/common/CodeModal.js b/src/pages/Fabric/components/common/CodeModal.js new file mode 100644 index 0000000..2085edd --- /dev/null +++ b/src/pages/Fabric/components/common/CodeModal.js @@ -0,0 +1,112 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Modal, Button, Form } from 'antd'; +import ReactAce from 'react-ace'; +// import { useIntl } from '@umijs/max'; + +import Icon from '../icon/Icon'; + +import 'ace-builds/src-noconflict/mode-javascript'; +import 'ace-builds/src-noconflict/theme-github'; + +// // eslint-disable-next-line react-hooks/rules-of-hooks +// const intl = useIntl(); + +class CodeModal extends Component { + handlers = { + onOk: () => { + const { onChange } = this.props; + const { tempCode } = this.state; + onChange(tempCode); + this.setState({ + visible: false, + code: tempCode, + }); + }, + onCancel: () => { + this.modalHandlers.onHide(); + }, + onClick: () => { + this.modalHandlers.onShow(); + }, + }; + + modalHandlers = { + onShow: () => { + this.setState({ + visible: true, + }); + }, + onHide: () => { + this.setState({ + visible: false, + }); + }, + }; + + static propTypes = { + value: PropTypes.any, + onChange: PropTypes.func, + form: PropTypes.any, + }; + + state = { + code: this.props.value, + tempCode: this.props.value, + visible: false, + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + code: nextProps.value, + }); + } + + render() { + const { onOk, onCancel, onClick } = this.handlers; + const { form } = this.props; + const { getFieldDecorator } = form; + const { code, visible, tempCode } = this.state; + const label = ( + <React.Fragment> + <span style={{ marginRight: 8 }}>{"intl.formatMessage({ id: 'fabric.common.code', defaultMessage: '$$$' })"}</span> + <Button onClick={onClick} shape="circle" className="rde-action-btn"> + <Icon name="edit" /> + </Button> + </React.Fragment> + ); + const codeLabel = <span>Code (value, styles, animations, userProperty)</span>; + return ( + <React.Fragment> + <Form.Item label={label} colon={false}> + {getFieldDecorator('trigger.code', { + initialValue: code || this.props.value, + })(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{code}</pre>)} + </Form.Item> + <Modal onCancel={onCancel} onOk={onOk} visible={visible}> + <Form.Item label={codeLabel} colon={false}> + <ReactAce + ref={c => { + this.jsRef = c; + }} + mode="javascript" + theme="github" + width="100%" + height="200px" + defaultValue={code} + value={tempCode} + editorProps={{ + $blockScrolling: true, + }} + onChange={value => { + this.setState({ tempCode: value }); + }} + /> + </Form.Item> + </Modal> + </React.Fragment> + ); + } +} + +export default CodeModal; diff --git a/src/pages/Fabric/components/common/ColorPicker.js b/src/pages/Fabric/components/common/ColorPicker.js new file mode 100644 index 0000000..9c08a9d --- /dev/null +++ b/src/pages/Fabric/components/common/ColorPicker.js @@ -0,0 +1,63 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Popover, Button } from 'antd'; +import { SketchPicker } from 'react-color'; + +class ColorPicker extends Component { + static propTypes = { + valueType: PropTypes.oneOf(['string', 'object']), + }; + + static defaultProps = { + valueType: 'string', + }; + + handlers = { + onChange: color => { + const { onChange, valueType } = this.props; + let newColor; + if (valueType === 'string') { + newColor = `rgba(${color.rgb.r},${color.rgb.g},${color.rgb.b},${color.rgb.a})`; + } else { + newColor = color.rgb; + } + this.setState( + { + color: newColor, + }, + () => { + onChange(newColor); + }, + ); + }, + }; + + state = { + color: this.props.value || 'rgba(255, 255, 255, 1)', + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + color: nextProps.value || this.state.color, + }); + } + + getBackgroundColor = color => { + if (typeof color === 'string') { + return color; + } + return `rgba(${color.r},${color.g},${color.b},${color.a})`; + }; + + render() { + const { color } = this.state; + const { onChange } = this.handlers; + return ( + <Popover trigger="click" placement="bottom" content={<SketchPicker color={color} onChange={onChange} />}> + <Button style={{ background: this.getBackgroundColor(color) }} shape="circle" /> + </Popover> + ); + } +} + +export default ColorPicker; diff --git a/src/pages/Fabric/components/common/CommonButton.js b/src/pages/Fabric/components/common/CommonButton.js new file mode 100644 index 0000000..baf14fa --- /dev/null +++ b/src/pages/Fabric/components/common/CommonButton.js @@ -0,0 +1,107 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Tooltip, Button } from 'antd'; +import Icon from '../icon/Icon'; + +class CommonButton extends Component { + static propTypes = { + name: PropTypes.string, + id: PropTypes.string, + style: PropTypes.object, + wrapperStyle: PropTypes.object, + wrapperClassName: PropTypes.string, + tooltipTitle: PropTypes.string, + tooltipPlacement: PropTypes.string, + className: PropTypes.string, + icon: PropTypes.string, + iconStyle: PropTypes.object, + iconClassName: PropTypes.string, + iconAnimation: PropTypes.string, + visible: PropTypes.bool, + shape: PropTypes.string, + disabled: PropTypes.bool, + loading: PropTypes.bool, + type: PropTypes.string, + }; + + static defaultProps = { + type: 'default', + visible: true, + disabled: false, + loading: false, + }; + + render() { + return this.props.visible ? ( + <Tooltip title={this.props.tooltipTitle} placement={this.props.tooltipPlacement}> + {this.props.wrapperClassName || this.props.wrapperStyle ? ( + <span style={this.props.wrapperStyle} className={this.props.wrapperClassName}> + <Button + id={this.props.id} + className={this.props.className} + name={this.props.name} + style={this.props.style} + shape={this.props.shape} + size={this.props.size} + onClick={this.props.onClick} + type={this.props.type} + disabled={this.props.disabled} + loading={this.props.loading} + > + {this.props.icon ? ( + this.props.iconAnimation ? ( + <Icon + name={this.props.icon} + style={this.props.iconStyle} + className={this.props.iconClassName} + animation={this.props.iconAnimation} + /> + ) : ( + <Icon + name={this.props.icon} + style={this.props.iconStyle} + className={this.props.iconClassName} + /> + ) + ) : null} + {this.props.children} + </Button> + </span> + ) : ( + <Button + id={this.props.id} + className={this.props.className} + name={this.props.name} + style={this.props.style} + shape={this.props.shape} + size={this.props.size} + onClick={this.props.onClick} + type={this.props.type} + disabled={this.props.disabled} + loading={this.props.loading} + > + {this.props.icon ? ( + this.props.iconAnimation ? ( + <Icon + name={this.props.icon} + style={this.props.iconStyle} + className={this.props.iconClassName} + animation={this.props.iconAnimation} + /> + ) : ( + <Icon + name={this.props.icon} + style={this.props.iconStyle} + className={this.props.iconClassName} + /> + ) + ) : null} + {this.props.children} + </Button> + )} + </Tooltip> + ) : null; + } +} + +export default CommonButton; diff --git a/src/pages/Fabric/components/common/EditTable.js b/src/pages/Fabric/components/common/EditTable.js new file mode 100644 index 0000000..abfc426 --- /dev/null +++ b/src/pages/Fabric/components/common/EditTable.js @@ -0,0 +1,231 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Button, Table, Modal, Input, Form } from 'antd'; +import { useIntl } from '@umijs/max'; + +import Icon from '../icon/Icon'; +import { Flex } from '../flex'; + +// eslint-disable-next-line react-hooks/rules-of-hooks +const intl = useIntl(); + +class EditTable extends Component { + static propTypes = { + userProperty: PropTypes.object, + form: PropTypes.any, + onChange: PropTypes.func, + }; + + static defaultProps = { + userProperty: {}, + }; + + state = { + userProperty: this.props.userProperty, + tempKey: '', + originKey: '', + tempValue: '', + visible: false, + current: 'add', + validateStatus: '', + help: '', + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + userProperty: nextProps.userProperty || {}, + }); + } + + getDataSource = userProperty => { + return Object.keys(userProperty).map(key => { + return { + key, + value: userProperty[key], + }; + }); + }; + + handlers = { + onOk: () => { + const { onChange } = this.props; + const { tempKey, originKey, tempValue, current, validateStatus } = this.state; + if (validateStatus === 'error') { + return; + } + if (current === 'modify') { + delete this.state.userProperty[originKey]; + } + const userProperty = Object.assign({}, this.state.userProperty, { [tempKey]: tempValue }); + if (onChange) { + onChange(userProperty); + } + this.setState({ + visible: false, + userProperty, + }); + }, + onCancel: () => { + this.modalHandlers.onHide(); + }, + onChangeKey: value => { + let validateStatus = 'success'; + let help = ''; + if ( + (this.state.current === 'add' && Object.keys(this.state.userProperty).some(p => p === value)) || + (this.state.current === 'modify' && this.state.originKey !== value && this.state.userProperty[value]) + ) { + validateStatus = 'error'; + help = intl.formatMessage({ id: 'fabric.validation.already-property', defaultMessage: '$$$' }); + } else if (!value.length) { + validateStatus = 'error'; + help = intl.formatMessage({ id: 'fabric.validation.enter-property', defaultMessage: '$$$' }); + } else { + validateStatus = 'success'; + help = ''; + } + this.setState({ + tempKey: value, + validateStatus, + help, + }); + }, + }; + + modalHandlers = { + onShow: () => { + this.setState({ + visible: true, + }); + }, + onHide: () => { + this.setState({ + visible: false, + }); + }, + }; + + handleAdd = () => { + this.setState({ + visible: true, + tempKey: '', + tempValue: '', + current: 'add', + validateStatus: '', + help: '', + }); + }; + + handleEdit = key => { + this.setState({ + visible: true, + tempKey: key, + originKey: key, + tempValue: this.state.userProperty[key], + current: 'modify', + validateStatus: '', + help: '', + }); + }; + + handleDelete = key => { + delete this.state.userProperty[key]; + this.setState({ userProperty: this.state.userProperty }); + }; + + handleClear = () => { + this.setState({ userProperty: {} }); + }; + + render() { + const { userProperty, tempKey, tempValue, visible, validateStatus, help } = this.state; + const { onOk, onCancel, onChangeKey } = this.handlers; + const columns = [ + { + title: i18n.t('common.key'), + dataIndex: 'key', + }, + { + title: i18n.t('common.value'), + dataIndex: 'value', + }, + { + title: '', + dataIndex: 'action', + render: (text, record) => { + return ( + <div> + <Button + className="rde-action-btn" + shape="circle" + onClick={() => { + this.handleEdit(record.key); + }} + > + <Icon name="edit" /> + </Button> + <Button + className="rde-action-btn" + shape="circle" + onClick={() => { + this.handleDelete(record.key); + }} + > + <Icon name="times" /> + </Button> + </div> + ); + }, + }, + ]; + return ( + <Flex flexDirection="column"> + <Flex justifyContent="flex-end"> + <Button className="rde-action-btn" shape="circle" onClick={this.handleAdd}> + <Icon name="plus" /> + </Button> + <Button className="rde-action-btn" shape="circle" onClick={this.handleClear}> + <Icon name="times" /> + </Button> + </Flex> + <Table + size="small" + pagination={{ + pageSize: 5, + }} + columns={columns} + dataSource={this.getDataSource(userProperty)} + /> + <Modal onCancel={onCancel} onOk={onOk} visible={visible}> + <Form.Item + required + label={i18n.t('common.key')} + colon={false} + hasFeedback + validateStatus={validateStatus} + help={help} + > + <Input + defaultValue={tempKey} + value={tempKey} + onChange={e => { + onChangeKey(e.target.value); + }} + /> + </Form.Item> + <Form.Item label={i18n.t('common.value')} colon={false}> + <Input + defaultValue={tempValue} + value={tempValue} + onChange={e => { + this.setState({ tempValue: e.target.value }); + }} + /> + </Form.Item> + </Modal> + </Flex> + ); + } +} + +export default EditTable; diff --git a/src/pages/Fabric/components/common/FileUpload.js b/src/pages/Fabric/components/common/FileUpload.js new file mode 100644 index 0000000..8dd57a7 --- /dev/null +++ b/src/pages/Fabric/components/common/FileUpload.js @@ -0,0 +1,84 @@ +import { Icon, Upload, message } from 'antd'; +import PropTypes from 'prop-types'; +import React, { Component } from 'react'; + +const { Dragger } = Upload; + +class FileUpload extends Component { + static propTypes = { + onChange: PropTypes.func, + limit: PropTypes.number, + accept: PropTypes.string, + }; + + static defaultProps = { + limit: 5, + }; + + state = { + fileList: this.props.value ? [this.props.value] : [], + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + fileList: nextProps.value ? [nextProps.value] : [], + }); + } + + render() { + const { accept, limit } = this.props; + const { fileList } = this.state; + const props = { + accept, + name: 'file', + multiple: false, + onChange: info => { + const isLimit = info.file.size / 1024 / 1024 < limit; + if (!isLimit) { + message.error(`Limited to ${limit}MB or less`); + return false; + } + const { onChange } = this.props; + onChange(info.file); + }, + onRemove: file => { + this.setState( + ({ fileList }) => { + const index = fileList.indexOf(file); + const newFileList = fileList.slice(); + newFileList.splice(index, 1); + return { + fileList: newFileList, + }; + }, + () => { + const { onChange } = this.props; + onChange(null); + }, + ); + }, + beforeUpload: file => { + const isLimit = file.size / 1024 / 1024 < limit; + if (!isLimit) { + return false; + } + this.setState({ + fileList: [file], + }); + return false; + }, + fileList, + }; + return ( + <Dragger {...props}> + <p className="ant-upload-drag-icon"> + <Icon type="inbox" /> + </p> + <p className="ant-upload-text">Click or drag file to this area to upload</p> + <p className="ant-upload-hint">{`Support for a single upload. Limited to ${limit}MB or less`}</p> + </Dragger> + ); + } +} + +export default FileUpload; diff --git a/src/pages/Fabric/components/common/InputHtml.js b/src/pages/Fabric/components/common/InputHtml.js new file mode 100644 index 0000000..74881fc --- /dev/null +++ b/src/pages/Fabric/components/common/InputHtml.js @@ -0,0 +1,96 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import ReactAce from 'react-ace'; +import {debounce } from 'lodash'; + +import 'ace-builds/src-noconflict/mode-html'; +import 'ace-builds/src-noconflict/theme-github'; + +class InputJson extends Component { + static propTypes = { + defaultValue: PropTypes.string, + value: PropTypes.string, + width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + onChange: PropTypes.func, + onValidate: PropTypes.func, + disabled: PropTypes.bool, + }; + + static defaultProps = { + width: '100%', + height: '200px', + disabled: false, + }; + + state = { + text: this.props.value || '', + }; + + componentDidMount() { + this.debouncedValidate = debounce(errors => { + const { onValidate } = this.props; + if (onValidate) { + onValidate(errors); + } + const { onChange } = this.props; + if (onChange) { + onChange(this.state.text); + } + }, 200); + } + + UNSAFE_componentWillReceiveProps(nextProps) { + if (nextProps.value !== this.props.value) { + this.setState({ + text: nextProps.value, + }); + } + } + + onChange = (value, e) => { + if (this.debouncedValidate) { + this.debouncedValidate(); + } + this.setState({ + text: value, + }); + }; + + onValidate = annotations => { + if (annotations.length) { + const errors = annotations + .filter(annotation => annotation.type === 'error') + .map(annotation => { + return new Error(`${annotation.row}:${annotation.column} ${annotation.text} error`); + }); + this.debouncedValidate(errors); + } + }; + + render() { + const { defaultValue, width, height, disabled } = this.props; + const { text } = this.state; + return ( + <ReactAce + ref={c => { + this.aceRef = c; + }} + mode="html" + theme="github" + width={width} + height={height} + defaultValue={defaultValue || text} + value={text} + editorProps={{ + $blockScrolling: true, + }} + onChange={this.onChange} + onValidate={this.onValidate} + readOnly={disabled} + /> + ); + } +} + +export default InputJson; diff --git a/src/pages/Fabric/components/common/InputJson.js b/src/pages/Fabric/components/common/InputJson.js new file mode 100644 index 0000000..5761ce2 --- /dev/null +++ b/src/pages/Fabric/components/common/InputJson.js @@ -0,0 +1,96 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import ReactAce from 'react-ace'; +import {debounce} from 'lodash'; + +import 'ace-builds/src-noconflict/mode-json'; +import 'ace-builds/src-noconflict/theme-github'; + +class InputJson extends Component { + static propTypes = { + defaultValue: PropTypes.string, + value: PropTypes.string, + width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + onChange: PropTypes.func, + onValidate: PropTypes.func, + disabled: PropTypes.bool, + }; + + static defaultProps = { + width: '100%', + height: '200px', + disabled: false, + }; + + state = { + text: this.props.value || '', + }; + + componentDidMount() { + this.debouncedValidate = debounce(errors => { + const { onValidate } = this.props; + if (onValidate) { + onValidate(errors); + } + const { onChange } = this.props; + if (onChange) { + onChange(this.state.text); + } + }, 200); + } + + UNSAFE_componentWillReceiveProps(nextProps) { + if (nextProps.value !== this.props.value) { + this.setState({ + text: nextProps.value, + }); + } + } + + onChange = (value, e) => { + if (this.debouncedValidate) { + this.debouncedValidate(); + } + this.setState({ + text: value, + }); + }; + + onValidate = annotations => { + if (annotations.length) { + const errors = annotations + .filter(annotation => annotation.type === 'error') + .map(annotation => { + return new Error(`${annotation.row}:${annotation.column} ${annotation.text} error`); + }); + this.debouncedValidate(errors); + } + }; + + render() { + const { defaultValue, width, height, disabled } = this.props; + const { text } = this.state; + return ( + <ReactAce + ref={c => { + this.aceRef = c; + }} + mode="json" + theme="github" + width={width} + height={height} + defaultValue={defaultValue || text} + value={text} + editorProps={{ + $blockScrolling: true, + }} + onChange={this.onChange} + onValidate={this.onValidate} + readOnly={disabled} + /> + ); + } +} + +export default InputJson; diff --git a/src/pages/Fabric/components/common/InputScript.js b/src/pages/Fabric/components/common/InputScript.js new file mode 100644 index 0000000..ab662f0 --- /dev/null +++ b/src/pages/Fabric/components/common/InputScript.js @@ -0,0 +1,96 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import ReactAce from 'react-ace'; +import {debounce } from 'lodash'; + +import 'ace-builds/src-noconflict/mode-javascript'; +import 'ace-builds/src-noconflict/theme-github'; + +class InputScript extends Component { + static propTypes = { + defaultValue: PropTypes.string, + value: PropTypes.string, + width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + onChange: PropTypes.func, + onValidate: PropTypes.func, + disabled: PropTypes.bool, + }; + + static defaultProps = { + width: '100%', + height: '200px', + disabled: false, + }; + + state = { + text: this.props.value || '', + }; + + componentDidMount() { + this.debouncedValidate = debounce(errors => { + const { onValidate } = this.props; + if (onValidate) { + onValidate(errors); + } + const { onChange } = this.props; + if (onChange) { + onChange(this.state.text); + } + }, 200); + } + + UNSAFE_componentWillReceiveProps(nextProps) { + if (nextProps.value !== this.props.value) { + this.setState({ + text: nextProps.value, + }); + } + } + + onChange = (value, e) => { + if (this.debouncedValidate) { + this.debouncedValidate(); + } + this.setState({ + text: value, + }); + }; + + onValidate = annotations => { + if (annotations.length) { + const errors = annotations + .filter(annotation => annotation.type === 'error') + .map(annotation => { + return new Error(`${annotation.row}:${annotation.column} ${annotation.text} error`); + }); + this.debouncedValidate(errors); + } + }; + + render() { + const { defaultValue, width, height, dsiabled } = this.props; + const { text } = this.state; + return ( + <ReactAce + ref={c => { + this.aceRef = c; + }} + mode="javascript" + theme="github" + width={width} + height={height} + defaultValue={defaultValue || text} + value={text} + editorProps={{ + $blockScrolling: true, + }} + onChange={this.onChange} + onValidate={this.onValidate} + readOnly={dsiabled} + /> + ); + } +} + +export default InputScript; diff --git a/src/pages/Fabric/components/common/InputTemplate.js b/src/pages/Fabric/components/common/InputTemplate.js new file mode 100644 index 0000000..f31d7a7 --- /dev/null +++ b/src/pages/Fabric/components/common/InputTemplate.js @@ -0,0 +1,87 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import ReactAce from 'react-ace'; + +import 'ace-builds/src-noconflict/mode-handlebars'; +import 'ace-builds/src-noconflict/theme-github'; + +class InputTemplate extends Component { + static propTypes = { + defaultValue: PropTypes.string, + value: PropTypes.string, + width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + showLineNumbers: PropTypes.bool, + newLineMode: PropTypes.bool, + disabled: PropTypes.bool, + }; + + static defaultProps = { + width: '100%', + height: '200px', + showLineNumbers: true, + newLineMode: true, + disabled: false, + }; + + state = { + text: this.props.value || '', + }; + + componentDidMount() { + if (!this.props.newLineMode) { + this.aceRef.editor.keyBinding.addKeyboardHandler((data, hashId, keyString, keyCode, e) => { + if (keyCode === 13) { + return { command: 'null' }; // do nothing + } + }); + } + } + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + text: nextProps.value, + }); + } + + onChange = value => { + const { onChange } = this.props; + if (onChange) { + onChange(value); + } + this.setState({ + text: value, + }); + }; + + render() { + const { defaultValue, width, height, showLineNumbers, newLineMode, disabled } = this.props; + const { text } = this.state; + return ( + <ReactAce + ref={c => { + this.aceRef = c; + }} + mode="handlebars" + theme="github" + width={width} + height={height} + defaultValue={defaultValue || text} + value={text} + editorProps={{ + $blockScrolling: true, + }} + onChange={this.onChange} + onValidate={this.onValidate} + maxLines={!newLineMode ? 1 : null} + setOptions={{ + showLineNumbers, + newLineMode, + readOnly: disabled, + }} + /> + ); + } +} + +export default InputTemplate; diff --git a/src/pages/Fabric/components/common/SVGModal.js b/src/pages/Fabric/components/common/SVGModal.js new file mode 100644 index 0000000..4b5aeae --- /dev/null +++ b/src/pages/Fabric/components/common/SVGModal.js @@ -0,0 +1,103 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Modal, Form, Radio } from 'antd'; +// import { useIntl } from '@umijs/max'; + +import { InputHtml } from '.'; +import FileUpload from './FileUpload'; + +class SVGModal extends Component { + static propTypes = { + onOk: PropTypes.func.isRequired, + onCancel: PropTypes.func, + visible: PropTypes.bool.isRequired, + }; + + state = { + loadType: 'file', + visible: false, + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + if (nextProps.visible !== this.props.visible) { + this.setState({ + visible: nextProps.visible, + }); + } + } + + handleChangeSvgType = e => { + this.props.form.resetFields(); + this.setState({ + loadType: e.target.value, + }); + }; + + handleOk = () => { + const { form, onOk } = this.props; + form.validateFields((err, values) => { + if (err) { + return; + } + if (values.svg instanceof Blob) { + const reader = new FileReader(); + reader.readAsDataURL(values.svg); + reader.onload = () => { + onOk({ ...values, svg: reader.result }); + }; + } else { + onOk(values); + } + }); + }; + + handleCancel = () => { + const { onCancel } = this.props; + if (onCancel) { + onCancel(); + return; + } + this.setState({ + visible: false, + }); + }; + + render() { + const { form } = this.props; + const { loadType, visible } = this.state; + return ( + <Modal + title={"intl.formatMessage({ id: 'fabric.imagemap.svg.add-svg', defaultMessage: '$$$' })" } + closable + onCancel={this.handleCancel} + onOk={this.handleOk} + visible={visible} + > + <Form colon={false}> + <Form.Item label={ "intl.formatMessage({ id: 'fabric.common.type', defaultMessage: '$$$' })"}> + {form.getFieldDecorator('loadType', { + initialValue: loadType, + })( + <Radio.Group onChange={this.handleChangeSvgType}> + <Radio.Button value="file">{ "intl.formatMessage({ id: 'fabric.common.file', defaultMessage: '$$$' })"}</Radio.Button> + <Radio.Button value="svg">{ "intl.formatMessage({ id: 'fabric.common.svg', defaultMessage: '$$$' })"}</Radio.Button> + </Radio.Group>, + )} + </Form.Item> + <Form.Item label={"intl.formatMessage({ id: loadType === 'svg' ? 'fabric.common.svg' : 'fabric.common.file', defaultMessage: '$$$' })"}> + {form.getFieldDecorator('svg', { + rules: [ + { + required: true, + message: "intl.formatMessage({ id: 'fabric.validation.enter-property', defaultMessage: '$$$' })", + }, + ], + })(loadType === 'svg' ? <InputHtml /> : <FileUpload accept=".svg" />)} + </Form.Item> + </Form> + </Modal> + ); + } +} + +export default Form.create()(SVGModal); diff --git a/src/pages/Fabric/components/common/Scrollbar.js b/src/pages/Fabric/components/common/Scrollbar.js new file mode 100644 index 0000000..c91833e --- /dev/null +++ b/src/pages/Fabric/components/common/Scrollbar.js @@ -0,0 +1,12 @@ +import React, { Component } from 'react'; +import { Scrollbars } from 'react-custom-scrollbars'; + +class Scrollbar extends Component { + renderTrack = props => <div {...props} className="rde-track-vertical" />; + + render() { + return <Scrollbars renderTrackVertical={this.renderTrack}>{this.props.children}</Scrollbars>; + } +} + +export default Scrollbar; diff --git a/src/pages/Fabric/components/common/UrlModal.js b/src/pages/Fabric/components/common/UrlModal.js new file mode 100644 index 0000000..6601b0e --- /dev/null +++ b/src/pages/Fabric/components/common/UrlModal.js @@ -0,0 +1,104 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Form, Modal, Button, Input } from 'antd'; +import { useIntl } from '@umijs/max'; + + +import Icon from '../icon/Icon'; + +// eslint-disable-next-line react-hooks/rules-of-hooks +const intl = useIntl(); + + +class UrlModal extends Component { + handlers = { + onOk: () => { + const { onChange } = this.props; + const { tempUrl } = this.state; + onChange(tempUrl); + this.setState({ + visible: false, + url: tempUrl, + }); + }, + onCancel: () => { + this.modalHandlers.onHide(); + }, + onClick: () => { + this.modalHandlers.onShow(); + }, + }; + + modalHandlers = { + onShow: () => { + this.setState({ + visible: true, + }); + }, + onHide: () => { + this.setState({ + visible: false, + }); + }, + }; + + static propTypes = { + value: PropTypes.any, + onChange: PropTypes.func, + form: PropTypes.any, + }; + + state = { + url: this.props.value || '', + tempUrl: '', + visible: false, + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + url: nextProps.value || '', + }); + } + + render() { + const { onOk, onCancel, onClick } = this.handlers; + const { form } = this.props; + const { getFieldDecorator } = form; + const { url, visible } = this.state; + const label = ( + <React.Fragment> + <span style={{ marginRight: 8 }}>{intl.formatMessage({ id: 'fabric.common.url', defaultMessage: '$$$' })}</span> + <Button onClick={onClick} shape="circle" className="rde-action-btn"> + <Icon name="edit" /> + </Button> + </React.Fragment> + ); + return ( + <React.Fragment> + <Form.Item label={label} colon={false}> + {getFieldDecorator('url', { + rules: [ + { + required: true, + message: '请输入url', + }, + ], + initialValue: url || '', + })(<span style={{ wordBreak: 'break-all' }}>{url}</span>)} + </Form.Item> + <Modal onCancel={onCancel} onOk={onOk} visible={visible}> + <Form.Item label={intl.formatMessage({ id: 'fabric.common.url', defaultMessage: '$$$' })} colon={false}> + <Input + defaultValue={url} + onChange={e => { + this.setState({ tempUrl: e.target.value }); + }} + /> + </Form.Item> + </Modal> + </React.Fragment> + ); + } +} + +export default UrlModal; diff --git a/src/pages/Fabric/components/common/index.js b/src/pages/Fabric/components/common/index.js new file mode 100644 index 0000000..0847517 --- /dev/null +++ b/src/pages/Fabric/components/common/index.js @@ -0,0 +1,21 @@ +export { default as CodeModal } from './CodeModal'; + +export { default as ColorPicker } from './ColorPicker'; + +export { default as CommonButton } from './CommonButton'; + +export { default as FileUpload } from './FileUpload'; + +export { default as InputJson } from './InputJson'; + +export { default as InputScript } from './InputScript'; + +export { default as InputTemplate } from './InputTemplate'; + +export { default as InputHtml } from './InputHtml'; + +export { default as Scrollbar } from './Scrollbar'; + +export { default as UrlModal } from './UrlModal'; + +export { default as SVGModal } from './SVGModal'; diff --git a/src/pages/Fabric/components/exception/NoExistWordException.js b/src/pages/Fabric/components/exception/NoExistWordException.js new file mode 100644 index 0000000..da70277 --- /dev/null +++ b/src/pages/Fabric/components/exception/NoExistWordException.js @@ -0,0 +1,10 @@ +export default class NoExistWordException { + constructor() { + this.message = 'Does not exist word.'; + this.name = 'NoExistWordException'; + } + + toString() { + return `${this.name}: ${this.message}`; + } +} diff --git a/src/pages/Fabric/components/exception/UnsafetyWordException.js b/src/pages/Fabric/components/exception/UnsafetyWordException.js new file mode 100644 index 0000000..f648bf6 --- /dev/null +++ b/src/pages/Fabric/components/exception/UnsafetyWordException.js @@ -0,0 +1,10 @@ +export default class UnsafetyWordException { + constructor() { + this.message = 'Includes unsafety word.'; + this.name = 'UnsafetyWordException'; + } + + toString() { + return `${this.name}: ${this.message}`; + } +} diff --git a/src/pages/Fabric/components/flex/Flex.tsx b/src/pages/Fabric/components/flex/Flex.tsx new file mode 100644 index 0000000..951d052 --- /dev/null +++ b/src/pages/Fabric/components/flex/Flex.tsx @@ -0,0 +1,78 @@ +import React, { Component } from 'react'; +import Item from './Item'; + +export interface BoxProps extends React.HTMLAttributes<any> { + display?: 'flex' | 'inline-flex'; + flexDirection?: 'column-reverse' | 'column' | 'row-reverse' | 'row'; + flexWrap?: 'nowrap' | 'wrap-reverse' | 'wrap'; + flexFlow?: string; + justifyContent?: 'center' | 'flex-end' | 'flex-start' | 'space-around' | 'space-between' | 'space-evenly'; + alignItems?: 'baseline' | 'center' | 'flex-end' | 'flex-start' | 'stretch'; + alignContent?: 'center' | 'flex-end' | 'flex-start' | 'space-around' | 'space-between' | 'stretch'; + alignSelf?: 'baseline' | 'center' | 'flex-end' | 'flex-start' | 'stretch'; + order?: number; + flexGrow?: number | string; + flexShrink?: number | string; + flexBasis?: number | string; + flex?: number | string; +} + +class Flex extends Component<BoxProps> { + static Item: typeof Item; + + render() { + const { + flexDirection, + flexWrap, + flexFlow, + justifyContent, + alignItems, + alignContent, + alignSelf, + order, + flexGrow, + flexShrink, + flexBasis, + flex, + style, + children, + ...other + } = this.props; + const newStyle = Object.assign( + {}, + { + display: 'flex', + flexDirection, + flexWrap, + flexFlow, + justifyContent, + alignItems, + alignContent, + alignSelf, + order, + flexGrow, + flexShrink, + flexBasis, + flex, + }, + style, + ) as any; + return ( + <div + style={Object.keys(newStyle).reduce((prev, key) => { + if (newStyle[key]) { + return Object.assign(prev, { [key]: newStyle[key] }); + } + return prev; + }, {})} + {...other} + > + {children} + </div> + ); + } +} + +Flex.Item = Item; + +export default Flex; diff --git a/src/pages/Fabric/components/flex/Item.tsx b/src/pages/Fabric/components/flex/Item.tsx new file mode 100644 index 0000000..248d17d --- /dev/null +++ b/src/pages/Fabric/components/flex/Item.tsx @@ -0,0 +1,41 @@ +import React from 'react'; + +export interface ItemProps extends React.HTMLAttributes<any> { + alignSelf?: 'baseline' | 'center' | 'flex-end' | 'flex-start' | 'stretch'; + order?: number; + flexGrow?: number | string; + flexShrink?: number | string; + flexBasis?: number | string; + flex?: number | string; +} + +const Item: React.SFC<ItemProps> = props => { + const { alignSelf, order, flexGrow, flexShrink, flexBasis, flex, style, children, ...other } = props; + const newStyle = Object.assign( + {}, + { + alignSelf, + order, + flexGrow, + flexShrink, + flexBasis, + flex, + }, + style, + ) as any; + return ( + <div + style={Object.keys(newStyle).reduce((prev, key) => { + if (newStyle[key]) { + return Object.assign(prev, { [key]: newStyle[key] }); + } + return prev; + }, {})} + {...other} + > + {children} + </div> + ); +}; + +export default Item; diff --git a/src/pages/Fabric/components/flex/index.tsx b/src/pages/Fabric/components/flex/index.tsx new file mode 100644 index 0000000..509a045 --- /dev/null +++ b/src/pages/Fabric/components/flex/index.tsx @@ -0,0 +1 @@ +export { default as Flex } from './Flex'; diff --git a/src/pages/Fabric/components/font/fonts.js b/src/pages/Fabric/components/font/fonts.js new file mode 100644 index 0000000..198e05e --- /dev/null +++ b/src/pages/Fabric/components/font/fonts.js @@ -0,0 +1,54 @@ +const fonts = { + default: [ + { name: 'Arial', type: 'sans-serif', ref: 'default' }, + { name: 'Arial Black', type: 'sans-serif', ref: 'default' }, + { name: 'Helvetica', type: 'sans-serif', ref: 'default' }, + { name: 'Verdana', type: 'sans-serif', ref: 'default' }, + { name: 'Trebuchet MS', type: 'sans-serif', ref: 'default' }, + { name: 'Tahoma', type: 'sans-serif', ref: 'default' }, + { name: 'MS Sans Serif', type: 'sans-serif', ref: 'default' }, + { name: 'Symbol', type: 'sans-serif', ref: 'default' }, + { name: 'Times', type: 'serif', ref: 'default' }, + { name: 'Times New Roman', type: 'serif', ref: 'default' }, + { name: 'MS Serif', type: 'serif', ref: 'default' }, + { name: 'New York', type: 'serif', ref: 'default' }, + { name: 'Palatino Linotype', type: 'serif', ref: 'default' }, + { name: 'Book Antiqua', type: 'serif', ref: 'default' }, + { name: 'Georgia', type: 'serif', ref: 'default' }, + { name: 'Courier New', type: 'monospace', ref: 'default' }, + { name: 'Courier', type: 'monospace' }, + { name: 'Comic Sans MS', type: 'cursive', ref: 'default' }, + { name: 'Lucida Console', type: 'cursive', ref: 'default' }, + { name: 'Impact', type: 'fantasy', ref: 'default' }, + ], + google: [ + { name: 'Abril Fatface', type: 'display', ref: 'google' }, + { name: 'Alegreya Sans', type: 'sans-serif', ref: 'google' }, + { name: 'Alegreya', type: 'serif', ref: 'google' }, + { name: 'Amatic SC', type: 'handwriting', ref: 'google' }, + { name: 'EB Garamond', type: 'serif', ref: 'google' }, + { name: 'Fjalla One', type: 'serif', ref: 'google' }, + { name: 'Josefin Sans', type: 'sans-serif', ref: 'google' }, + { name: 'Lato', type: 'sans-serif', ref: 'google' }, + { name: 'Merriweather', type: 'serif', ref: 'google' }, + { name: 'Montserrat', type: 'sans-serif', ref: 'google' }, + { name: 'Noto Sans', type: 'sans-serif', ref: 'google' }, + { name: 'Open Sans Condensed', type: 'sans-serif', ref: 'google' }, + { name: 'Open Sans', type: 'sans-serif', ref: 'google' }, + { name: 'Oswald', type: 'sans-serif', ref: 'google' }, + { name: 'Playfair Display', type: 'serif', ref: 'google' }, + { name: 'PT Sans Narrow', type: 'sans-serif', ref: 'google' }, + { name: 'PT Sans', type: 'sans-serif', ref: 'google' }, + { name: 'Raleway', type: 'sans-serif', ref: 'google' }, + { name: 'Roboto Mono', type: 'monospace', ref: 'google' }, + { name: 'Roboto Slab', type: 'serif', ref: 'google' }, + { name: 'Roboto', type: 'sans-serif', ref: 'google' }, + { name: 'Source Sans Pro', type: 'serif', ref: 'google' }, + ], +}; + +export default { + getFonts() { + return fonts; + }, +}; diff --git a/src/pages/Fabric/components/font/main.js b/src/pages/Fabric/components/font/main.js new file mode 100644 index 0000000..4c5756b --- /dev/null +++ b/src/pages/Fabric/components/font/main.js @@ -0,0 +1,260 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _fs = require('fs'); + +var _fs2 = _interopRequireDefault(_fs); + +var _path = require('path'); + +var _path2 = _interopRequireDefault(_path); + +var _ttfinfo = require('ttfinfo'); + +var _ttfinfo2 = _interopRequireDefault(_ttfinfo); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var getPlatform = function getPlatform() { + return process.platform === 'darwin' ? 'osx' : /win/.test(process.platform) ? 'windows' : 'linux'; +}; + +var recGetFile = function recGetFile(target) { + var stats = void 0; + try { + stats = _fs2.default.statSync(target); + } catch (e) { + // console.error(e); + return []; + } + if (stats.isDirectory()) { + var files = void 0; + try { + files = _fs2.default.readdirSync(target); + } catch (e) { + console.error(e); + } + return files.reduce(function (arr, f) { + return arr.concat(recGetFile(_path2.default.join(target, f))); + }, []); + } else { + var ext = _path2.default.extname(target).toLowerCase(); + if (ext === '.ttf' || ext === '.otf' || ext === '.ttc' || ext === '.dfont') { + return [target]; + } else { + return []; + } + } +}; + +var filterReadableFonts = function filterReadableFonts(arr) { + return arr.filter(function (f) { + var extension = _path2.default.extname(f).toLowerCase(); + return extension === '.ttf' || extension === '.otf'; + }); +}; + +var tableToObj = function tableToObj(obj, file, systemFont) { + return { + family: obj['1'], + subFamily: obj['2'], + postscript: obj['6'], + file: file, + systemFont: systemFont + }; +}; + +var extendedReducer = function extendedReducer(m, _ref) { + var family = _ref.family, + subFamily = _ref.subFamily, + file = _ref.file, + postscript = _ref.postscript, + systemFont = _ref.systemFont; + + if (m.has(family)) { + var origFont = m.get(family); + return m.set(family, _extends({}, origFont, { + systemFont: origFont.systemFont === false ? false : systemFont, + subFamilies: [].concat(_toConsumableArray(origFont.subFamilies), [subFamily]), + files: _extends({}, origFont.files, _defineProperty({}, subFamily, file)), + postscriptNames: _extends({}, origFont.postscriptNames, _defineProperty({}, subFamily, postscript)) + })); + } else { + return m.set(family, { + family: family, + systemFont: systemFont, + subFamilies: [subFamily], + files: _defineProperty({}, subFamily, file), + postscriptNames: _defineProperty({}, subFamily, postscript) + }); + } +}; + +var SystemFonts = function SystemFonts() { + var _this = this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var _options$ignoreSystem = options.ignoreSystemFonts, + ignoreSystemFonts = _options$ignoreSystem === undefined ? false : _options$ignoreSystem, + _options$customDirs = options.customDirs, + customDirs = _options$customDirs === undefined ? [] : _options$customDirs; + + + if (!Array.isArray(customDirs)) { + throw new Error('customDirs must be an array of folder path strings'); + } + + var customDirSet = new Set(customDirs); + var customFontFiles = new Set(); + + var getFontFiles = function getFontFiles() { + + var directories = []; + + if (customDirs.length > 0) { + directories = [].concat(_toConsumableArray(customDirs)); + } + + var platform = getPlatform(); + if (platform === 'osx') { + var home = process.env.HOME; + directories = [].concat(_toConsumableArray(directories), [_path2.default.join(home, 'Library', 'Fonts'), _path2.default.join('/', 'Library', 'Fonts'), _path2.default.join('/', 'System', 'Library', 'Fonts')]); + } else if (platform === 'windows') { + var winDir = process.env.windir || process.env.WINDIR; + directories = [].concat(_toConsumableArray(directories), [_path2.default.join(winDir, 'Fonts')]); + } else { + // some flavor of Linux, most likely + var _home = process.env.HOME; + directories = [].concat(_toConsumableArray(directories), [_path2.default.join(_home, '.fonts'), _path2.default.join(_home, '.local', 'share', 'fonts'), _path2.default.join('/', 'usr', 'share', 'fonts'), _path2.default.join('/', 'usr', 'local', 'share', 'fonts')]); + } + + return directories.reduce(function (arr, d) { + var files = recGetFile(d); + if (customDirSet.has(d)) { + files.forEach(function (f) { + return customFontFiles.add(f); + }); + } + return arr.concat(files); + }, []); + }; + + var allFontFiles = getFontFiles(); + + // this list includes all TTF, OTF, OTC, and DFONT files + this.getAllFontFilesSync = function () { + return [].concat(_toConsumableArray(allFontFiles)); + }; + + var fontFiles = filterReadableFonts(allFontFiles); + + // this list includes all TTF and OTF files (these are the ones we parse in this lib) + this.getFontFilesSync = function () { + return [].concat(_toConsumableArray(fontFiles)); + }; + + this.getFontsExtended = function () { + return new Promise(function (resolve, reject) { + + var promiseList = []; + + var filteredFontFiles = !ignoreSystemFonts ? [].concat(_toConsumableArray(fontFiles)) : fontFiles.filter(function (f) { + return customFontFiles.has(f); + }); + + filteredFontFiles.forEach(function (file, i) { + promiseList.push(new Promise(function (resolve1) { + _ttfinfo2.default.get(file, function (err, fontMeta) { + if (!fontMeta) { + resolve1(null); + } else { + resolve1(tableToObj(fontMeta.tables.name, file, !customFontFiles.has(file))); + } + }); + })); + }); + Promise.all(promiseList).then(function (res) { + + var names = res.filter(function (data) { + return data ? true : false; + }).reduce(extendedReducer, new Map()); + + var namesArr = [].concat(_toConsumableArray(names.values())).sort(function (a, b) { + return a.family.localeCompare(b.family); + }); + + resolve(namesArr); + }, function (err) { + return reject(err); + }); + }); + }; + + this.getFontsExtendedSync = function () { + + var filteredFontFiles = !ignoreSystemFonts ? [].concat(_toConsumableArray(fontFiles)) : fontFiles.filter(function (f) { + return customFontFiles.has(f); + }); + + var names = filteredFontFiles.reduce(function (arr, file) { + var data = void 0; + try { + data = _ttfinfo2.default.getSync(file); + } catch (e) { + return arr; + } + return arr.concat([tableToObj(data.tables.name, file, !customFontFiles.has(file))]); + }, []).filter(function (data) { + return data ? true : false; + }).reduce(extendedReducer, new Map()); + + var namesArr = [].concat(_toConsumableArray(names.values())).sort(function (a, b) { + return a.family.localeCompare(b.family); + }); + + return namesArr; + }; + + this.getFonts = function () { + return new Promise(function (resolve, reject) { + _this.getFontsExtended().then(function (fontList) { + var names = fontList.map(function (_ref2) { + var family = _ref2.family; + return family; + }).reduce(function (obj, name) { + obj[name] = 1; + return obj; + }, {}); + resolve(Object.keys(names).sort(function (a, b) { + return a.localeCompare(b); + })); + }).catch(function (err) { + return reject(err); + }); + }); + }; + + this.getFontsSync = function () { + var names = _this.getFontsExtendedSync().map(function (_ref3) { + var family = _ref3.family; + return family; + }).reduce(function (obj, name) { + obj[name] = 1; + return obj; + }, {}); + return Object.keys(names).sort(function (a, b) { + return a.localeCompare(b); + }); + }; +}; + +exports.default = SystemFonts; \ No newline at end of file diff --git a/src/pages/Fabric/components/help/ShortcutHelp.tsx b/src/pages/Fabric/components/help/ShortcutHelp.tsx new file mode 100644 index 0000000..65e0a03 --- /dev/null +++ b/src/pages/Fabric/components/help/ShortcutHelp.tsx @@ -0,0 +1,118 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-12-05 11:41:37 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-12-05 16:20:46 + * @FilePath: \react-adpro-fabric\src\pages\Fabric\components\help\ShortcutHelp.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import React from 'react'; + +// eslint-disable-next-line react-hooks/rules-of-hooks + +const shortcuts = [ + [ + { key: ['esc'], description: 'fabric.shortcut.escape' }, + { key: ['h'], description: 'fabric.shortcut.h' }, + { key: ['q'], description: 'fabric.shortcut.q' }, + { key: ['w'], description: 'fabric.shortcut.w' }, + { key: ['o'], description: 'fabric.shortcut.o' }, + { key: ['p'], description: 'fabric.shortcut.p' }, + { key: ['+'], description: 'fabric.shortcut.plus' }, + { + key: ['-'], + description: 'fabric.shortcut.minus', + }, + { + key: ['↑'], + description: 'fabric.shortcut.arrow-up', + }, + { + key: ['↓'], + description: 'fabric.shortcut.arrow-down', + }, + { + key: ['←'], + description: 'fabric.shortcut.arrow-left', + }, + { + key: ['→'], + description: 'fabric.shortcut.arrow-right', + }, + ], + [ + { + key: ['delete | backspace'], + description: 'fabric.shortcut.delete', + }, + { + key: ['ctrl | cmd', 'a'], + description: 'fabric.shortcut.ctrl-a', + }, + { + key: ['ctrl | cmd', 'c'], + description: 'fabric.shortcut.ctrl-c', + }, + { + key: ['ctrl | cmd', 'v'], + description: 'fabric.shortcut.ctrl-v' , + }, + { + key: ['ctrl | cmd', 'x'], + description: 'fabric.shortcut.ctrl-x', + }, + { + key: ['ctrl | cmd', 'z'], + description: 'fabric.shortcut.ctrl-z', + }, + { + key: ['ctrl | cmd', 'y'], + description: 'fabric.shortcut.ctrl-y', + }, + { + key: ['alt', 'mouse left'], + description: 'fabric.shortcut.alt-mouse-left', + }, + { + key: ['shift', 'mouse left'], + description: 'fabric.shortcut.shfit-mouse-left', + }, + { + key: ['mouse left'], + description: 'fabric.shortcut.mouse-left', + }, + { + key: ['mouse right'], + description: 'fabric.shortcut.mouse-right', + }, + ], +]; + +const ShortcutHelp: React.FC = () => { + return ( + <div className="rde-shortcut-help"> + {shortcuts.map((column, idx) => { + return ( + <ul className="rde-shortcut-help-list" key={idx}> + {column.map((shortcut) => { + return ( + <li key={shortcut.key.toString()} className="rde-shortcut-help-key"> + {shortcut.key.map((key) => { + return ( + <kbd key={key} className="rde-shortcut-help-key-unit"> + <span>{key}</span> + </kbd> + ); + })} + <span className="rde-shortcut-help-key-def">{shortcut.description}</span> + </li> + ); + })} + </ul> + ); + })} + </div> + ); +}; + +export default ShortcutHelp; diff --git a/src/pages/Fabric/components/help/index.tsx b/src/pages/Fabric/components/help/index.tsx new file mode 100644 index 0000000..db15f64 --- /dev/null +++ b/src/pages/Fabric/components/help/index.tsx @@ -0,0 +1 @@ +export { default as ShortcutHelp } from './ShortcutHelp'; diff --git a/src/pages/Fabric/components/icon/Icon.js b/src/pages/Fabric/components/icon/Icon.js new file mode 100644 index 0000000..647f0a0 --- /dev/null +++ b/src/pages/Fabric/components/icon/Icon.js @@ -0,0 +1,62 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +class Icon extends Component { + static propTypes = { + name: PropTypes.string, + color: PropTypes.string, + style: PropTypes.object, + className: PropTypes.string, + size: PropTypes.number, + innerIcon: PropTypes.string, + innerColor: PropTypes.string, + innerClassName: PropTypes.string, + innerSize: PropTypes.number, + prefix: PropTypes.string, + onClick: PropTypes.func, + }; + + static defaultProps = { + name: null, + color: '', + className: '', + size: 1, + innerIcon: null, + innerColor: '', + innerClassName: '', + innerSize: 1, + prefix: 'fas', + }; + + getIconHtml = (prefix, name, className, size, color) => { + const iconClassName = `${prefix} fa-${name} ${className}`; + const iconStyle = Object.assign({}, this.props.style, { + fontSize: `${size}em`, + color, + }); + return (<i className={iconClassName} style={iconStyle} onClick={this.props.onClick} />); + } + + render() { + const { color, size, className, innerIcon, innerColor, innerSize, innerClassName, prefix } = this.props; + let { name } = this.props; + if (name.startsWith('icon-')) { + name = name.substr('icon-'.length); + } + const iconHtml = this.getIconHtml(prefix, name, className, size, color); + let innerIconHtml = null; + if (innerIcon) { + innerIconHtml = this.getIconHtml(innerIcon, innerClassName, innerSize, innerColor); + } else { + return iconHtml; + } + return ( + <span className="fa-stack"> + {iconHtml} + {innerIconHtml} + </span> + ); + } +} + +export default Icon; diff --git a/src/pages/Fabric/components/icon/IconChooser.js b/src/pages/Fabric/components/icon/IconChooser.js new file mode 100644 index 0000000..e99b652 --- /dev/null +++ b/src/pages/Fabric/components/icon/IconChooser.js @@ -0,0 +1,161 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import {debounce } from 'lodash'; +import { Button, Modal, Form, Col, Row, Input } from 'antd'; +// import { useIntl } from '@umijs/max'; + +import Icon from './Icon'; +import icons from '../../libs/fontawesome-5.2.0/metadata/icons.json'; +// const intl = useIntl(); + +class IconChooser extends Component { + handlers = { + onOk: () => { + const { icon } = this.state; + const { onChange } = this.props; + if (onChange) { + onChange(icon); + } + this.setState({ + visible: false, + }); + }, + onCancel: () => { + this.modalHandlers.onHide(); + }, + onClick: () => { + this.modalHandlers.onShow(); + }, + onClickIcon: icon => { + this.setState( + { + icon, + }, + () => { + const { onChange } = this.props; + if (onChange) { + onChange(icon); + } + this.modalHandlers.onHide(); + }, + ); + }, + onSearch: debounce(value => { + this.setState({ + textSearch: value, + }); + }, 500), + }; + + modalHandlers = { + onShow: () => { + this.setState({ + visible: true, + }); + }, + onHide: () => { + this.setState({ + visible: false, + }); + }, + }; + + static propTypes = { + onChange: PropTypes.func, + icon: PropTypes.any, + }; + + static defaultProps = { + icon: { 'map-marker-alt': icons['map-marker-alt'] }, + }; + + state = { + icon: this.props.icon, + textSearch: '', + visible: false, + }; + + UNSAFE_componentWillReceiveProps(nextProps) { + this.setState({ + icon: nextProps.icon || this.state.icon, + }); + } + + getPrefix = style => { + let prefix = 'fas'; + if (style === 'brands') { + prefix = 'fab'; + } else if (style === 'regular') { + prefix = 'far'; + } + return prefix; + }; + + getIcons = textSearch => { + const lowerCase = textSearch.toLowerCase(); + return Object.keys(icons) + .filter(icon => icon.includes(lowerCase) || icons[icon].search.terms.some(term => term.includes(lowerCase))) + .map(icon => ({ [icon]: icons[icon] })); + }; + + render() { + const { onOk, onCancel, onClick, onClickIcon, onSearch } = this.handlers; + const { icon, visible, textSearch } = this.state; + const label = ( + <React.Fragment> + <span style={{ marginRight: 8 }}>{"intl.formatMessage({ id: 'fabric.common.icon', defaultMessage: '$$$' })"}</span> + <Icon name={Object.keys(icon)[0]} prefix={this.getPrefix(icon[Object.keys(icon)[0]].styles[0])} /> + </React.Fragment> + ); + const filteredIcons = this.getIcons(textSearch); + const filteredIconsLength = filteredIcons.length; + const title = ( + <div style={{ padding: '0 24px' }}> + <Input + onChange={e => { + onSearch(e.target.value); + }} + placeholder={"intl.formatMessage({ id: 'fabric.imagemap.marker.search-icon', defaultMessage: '$$$' })"} + /> + </div> + ); + return ( + <React.Fragment> + <Form.Item label={label} colon={false}> + <Button onClick={onClick}>{ "intl.formatMessage({ id: 'fabric.imagemap.marker.choose-icon', defaultMessage: '$$$' })"}</Button> + </Form.Item> + <Modal + onOk={onOk} + onCancel={onCancel} + width="80%" + visible={visible} + title={title} + bodyStyle={{ margin: 16, overflowY: 'auto', height: '600px' }} + > + <Row> + {filteredIcons.map(ic => { + const name = Object.keys(ic)[0]; + const metadata = ic[name]; + const prefix = this.getPrefix(metadata.styles[0]); + return ( + <Col + onClick={onClickIcon.bind(this, ic)} + key={name} + span={4} + className="rde-icon-container" + > + <div className="rde-icon-top"> + <Icon name={name} size={3} prefix={prefix} /> + </div> + <div className="rde-icon-bottom">{name}</div> + </Col> + ); + })} + </Row> + </Modal> + </React.Fragment> + ); + } +} + +export default IconChooser; diff --git a/src/pages/Fabric/components/layout/Content.tsx b/src/pages/Fabric/components/layout/Content.tsx new file mode 100644 index 0000000..b1be75e --- /dev/null +++ b/src/pages/Fabric/components/layout/Content.tsx @@ -0,0 +1,54 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Layout, Spin } from 'antd'; + +interface IProps { + title?: React.ReactNode; + leftSider?: React.ReactNode; + content?: React.ReactNode; + rightSider?: React.ReactNode; + className?: string; + loading?: boolean; +} + +class Content extends Component<IProps> { + static propTypes = { + title: PropTypes.any, + leftSider: PropTypes.any, + content: PropTypes.any, + rightSider: PropTypes.any, + className: PropTypes.string, + loading: PropTypes.bool, + }; + + static defaultProps = { + className: 'rde-content-layout-main', + loading: false, + }; + + render() { + const { title, leftSider, content, rightSider, className, loading, children } = this.props; + return ( + <Spin spinning={loading}> + <Layout className="rde-content-layout"> + {title} + <Layout + style={{ + overflowY: 'auto', + overflowX: 'hidden', + minHeight: `calc(100vh - ${title ? 98 : 60}px)`, + height: `calc(100vh - ${title ? 98 : 60}px)`, + }} + className={className} + > + {leftSider} + {content || children} + {rightSider} + </Layout> + </Layout> + </Spin> + ); + } +} + +export default Content; diff --git a/src/pages/Fabric/components/layout/Title.tsx b/src/pages/Fabric/components/layout/Title.tsx new file mode 100644 index 0000000..9d5a5ba --- /dev/null +++ b/src/pages/Fabric/components/layout/Title.tsx @@ -0,0 +1,127 @@ +import { Button, Menu, Modal, Tooltip } from 'antd'; +import { ClickParam } from 'antd/lib/menu'; +import { useIntl } from '@umijs/max'; +import React, { Component } from 'react'; +import { Flex } from '../flex'; +import { ShortcutHelp } from '../help'; +import Icon from '../icon/Icon'; + +// eslint-disable-next-line react-hooks/rules-of-hooks +const intl = useIntl(); +interface IProps { + onChangeEditor: (param: ClickParam) => void; + currentEditor: string; +} + +class Title extends Component<IProps> { + state = { + visible: false, + }; + + componentDidMount() { + if (globalThis) { + (globalThis.adsbygoogle = globalThis.adsbygoogle || []).push({}); + } + } + + handlers = { + goGithub: () => { + window.open('https://github.com/salgum1114/react-design-editor'); + }, + goDocs: () => { + window.open('https://salgum1114.github.io/react-design-editor/docs'); + }, + showHelp: () => { + this.setState({ + visible: true, + }); + }, + }; + + render() { + const { visible } = this.state; + return ( + <Flex + style={{ background: 'linear-gradient(141deg,#23303e,#404040 51%,#23303e 75%)' }} + flexWrap="wrap" + flex="1" + alignItems="center" + > + <Flex style={{ marginLeft: 8 }} flex="0 1 auto"> + <span style={{ color: '#fff', fontSize: 24, fontWeight: 500 }}>React Design Editor</span> + <Tooltip title={intl.formatMessage({ id: 'fabric.action.go-github', defaultMessage: '$$$' })} overlayStyle={{ fontSize: 16 }}> + <Button + className="rde-action-btn" + style={{ + color: 'white', + }} + shape="circle" + size="large" + onClick={this.handlers.goGithub} + > + <Icon name="github" prefix="fab" size={1.5} /> + </Button> + </Tooltip> + <Tooltip title={intl.formatMessage({ id: 'fabric.action.go-docs', defaultMessage: '$$$' })} overlayStyle={{ fontSize: 16 }}> + <Button + className="rde-action-btn" + style={{ + color: 'white', + }} + shape="circle" + size="large" + onClick={this.handlers.goDocs} + > + <Icon name="book" prefix="fas" size={1.5} /> + </Button> + </Tooltip> + <Tooltip title={intl.formatMessage({ id: 'fabric.action.shortcut-help', defaultMessage: '$$$' })} overlayStyle={{ fontSize: 16 }}> + <Button + className="rde-action-btn" + style={{ + color: 'white', + }} + shape="circle" + size="large" + onClick={this.handlers.showHelp} + > + <Icon name="question" prefix="fas" size={1.5} /> + </Button> + </Tooltip> + </Flex> + <Flex style={{ marginLeft: 88 }}> + <Menu + mode="horizontal" + theme="dark" + style={{ background: 'transparent', fontSize: '16px' }} + onClick={this.props.onChangeEditor} + selectedKeys={[this.props.currentEditor]} + > + <Menu.Item key="imagemap" style={{ color: '#fff' }}> + {intl.formatMessage({ id: 'fabric.imagemap.imagemap', defaultMessage: '$$$' })} + </Menu.Item> + </Menu> + </Flex> + <Flex flex="1" justifyContent="flex-end"> + <ins + className="adsbygoogle" + style={{ display: 'inline-block', width: 600, height: 60 }} + data-ad-client="ca-pub-8569372752842198" + data-ad-slot="5790685139" + /> + </Flex> + <Modal + visible={visible} + onCancel={() => this.setState({ visible: false })} + closable={true} + footer={null} + width="50%" + > + <ShortcutHelp /> + </Modal> + </Flex> + ); + } +} + +export default Title; diff --git a/src/pages/Fabric/components/layout/index.tsx b/src/pages/Fabric/components/layout/index.tsx new file mode 100644 index 0000000..6589b74 --- /dev/null +++ b/src/pages/Fabric/components/layout/index.tsx @@ -0,0 +1,3 @@ +export { default as Title } from './Title'; + +export { default as Content } from './Content'; diff --git a/src/pages/Fabric/components/sandbox/SandBox.js b/src/pages/Fabric/components/sandbox/SandBox.js new file mode 100644 index 0000000..4382e37 --- /dev/null +++ b/src/pages/Fabric/components/sandbox/SandBox.js @@ -0,0 +1,59 @@ +import UnsafetyWordException from '../exception/UnsafetyWordException'; +import NoExistWordException from '../exception/NoExistWordException'; + +const excludeWords = [ + 'window', + 'Window', + 'alert', + 'console', + 'this', + 'eval', + 'new', + 'function', + 'Function', + 'document', +]; + +const includeWords = ['return']; + +const parameters = ['value', 'animations', 'styles', 'userProperty']; + +class SandBox { + /** + *Creates an instance of SandBox. + * @param {{ excludeWords: string[], includeWords: string[] }} params + * @memberof SandBox + */ + constructor(params = {}) { + this.excludeWords = params.excludeWords || excludeWords; + this.includeWords = params.includeWords || includeWords; + } + + // eslint-disable-next-line class-methods-use-this + verify(code) { + const newCode = code.toString(); + if (this.excludeWords.some(word => code.includes(word))) { + throw new UnsafetyWordException(); + } + if (!this.includeWords.some(word => code.includes(word))) { + throw new NoExistWordException(); + } + // eslint-disable-next-line no-new-func + return new Function(parameters, `"use strict"; ${newCode}`); + } + + // eslint-disable-next-line consistent-return + compile(code) { + try { + return this.verify(code); + } catch (error) { + if (error.toString) { + console.error(error.toString()); + } else { + console.error(error.message); + } + } + } +} + +export default SandBox; diff --git a/src/pages/Fabric/components/wireframe/Wireframe.js b/src/pages/Fabric/components/wireframe/Wireframe.js new file mode 100644 index 0000000..c09f70c --- /dev/null +++ b/src/pages/Fabric/components/wireframe/Wireframe.js @@ -0,0 +1,27 @@ +import React, { Component } from 'react'; +import { Flex } from '../flex'; + +class Wireframe extends Component { + constructor(props) { + super(props); + this.container = React.createRef(); + } + + render() { + const { + canvasRef: { current }, + } = this.props; + if (current) { + return ( + <Flex flexDirection="column"> + <div ref={this.container} flex="0 1 auto" style={{ margin: 8 }}> + <img width="144" height="150" src={current.handlers.exportPNG()} /> + </div> + </Flex> + ); + } + return null; + } +} + +export default Wireframe; diff --git a/src/pages/Hidden.tsx b/src/pages/Hidden.tsx new file mode 100644 index 0000000..43e64d7 --- /dev/null +++ b/src/pages/Hidden.tsx @@ -0,0 +1,18 @@ +import { history } from '@umijs/max'; +import { Button, Result } from 'antd'; +import React from 'react'; + +const HiddenPage: React.FC = () => ( + <Result + status="403" + title="陆续开放中" + subTitle="功能陆续开放中,敬请期待!" + extra={ + <Button type="primary" onClick={() => history.push('/welcome')}> + 返回主页 + </Button> + } + /> +); + +export default HiddenPage; diff --git a/src/pages/ShowInfo.tsx b/src/pages/ShowInfo.tsx new file mode 100644 index 0000000..26ed250 --- /dev/null +++ b/src/pages/ShowInfo.tsx @@ -0,0 +1,18 @@ +import { history } from '@umijs/max'; +import { Button, Result } from 'antd'; +import React from 'react'; + +const ShowInfo: React.FC = () => ( + <Result + status="404" + title="40411111" + subTitle="Sorry, the page you visited does not exist." + extra={ + <Button type="primary" onClick={() => history.push('/')}> + Back Home1111 + </Button> + } + /> +); + +export default ShowInfo; diff --git a/src/requestErrorConfig.ts b/src/requestErrorConfig.ts new file mode 100644 index 0000000..a9f3e77 --- /dev/null +++ b/src/requestErrorConfig.ts @@ -0,0 +1,116 @@ +import type { RequestOptions } from '@@/plugin-request/request'; +import type { RequestConfig } from '@umijs/max'; +import { message, notification } from 'antd'; + +// 错误处理方案: 错误类型 +enum ErrorShowType { + SILENT = 0, + WARN_MESSAGE = 1, + ERROR_MESSAGE = 2, + NOTIFICATION = 3, + REDIRECT = 9, +} +// 与后端约定的响应数据格式 +interface ResponseStructure { + success: boolean; + data: any; + errorCode?: number; + errorMessage?: string; + msg?: string; + showType?: ErrorShowType; +} + +/** + * @name 错误处理 + * pro 自带的错误处理, 可以在这里做自己的改动 + * @doc https://umijs.org/docs/max/request#配置 + */ +export const errorConfig: RequestConfig = { + // 错误处理: umi@3 的错误处理方案。 + errorConfig: { + // 错误抛出 + errorThrower: (res) => { + let { success, data, errorCode, errorMessage, showType,msg } = + res as unknown as ResponseStructure; + if (msg && !errorMessage) { + errorMessage = msg + } + if (!success) { + const error: any = new Error(errorMessage); + error.name = 'BizError'; + error.info = { errorCode, errorMessage, showType, data }; + throw error; // 抛出自制的错误 + } + }, + // 错误接收及处理 + errorHandler: (error: any, opts: any) => { + if (opts?.skipErrorHandler) throw error; + // 我们的 errorThrower 抛出的错误。 + if (error.name === 'BizError') { + const errorInfo: ResponseStructure | undefined = error.info; + if (errorInfo) { + let { errorMessage, errorCode ,msg} = errorInfo; + if (msg && !errorMessage) { + errorMessage = msg + } + switch (errorInfo.showType) { + case ErrorShowType.SILENT: + // do nothing + break; + case ErrorShowType.WARN_MESSAGE: + message.warning(errorMessage); + break; + case ErrorShowType.ERROR_MESSAGE: + message.error(errorMessage); + break; + case ErrorShowType.NOTIFICATION: + notification.open({ + description: errorMessage, + message: errorCode, + }); + break; + case ErrorShowType.REDIRECT: + // TODO: redirect + break; + default: + message.error(errorMessage); + } + } + } else if (error.response) { + // Axios 的错误 + // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围 + message.error(`Response status:${error.response.status}`); + } else if (error.request) { + // 请求已经成功发起,但没有收到响应 + // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例, + // 而在node.js中是 http.ClientRequest 的实例 + message.error('None response! Please retry.'); + } else { + // 发送请求时出了点问题 + message.error('Request error, please retry.'); + } + }, + }, + + // 请求拦截器 + requestInterceptors: [ + (config: RequestOptions) => { + // 拦截请求配置,进行个性化处理。 + const url = config?.url?.concat('?token = 123'); + return { ...config, url }; + }, + ], + + // 响应拦截器 + responseInterceptors: [ + (response) => { + // 拦截响应数据,进行个性化处理 + const { data } = response as unknown as ResponseStructure; + + if (data?.success === false) { + message.error('请求失败!'); + } + return response; + }, + ], +}; diff --git a/src/service-worker.js b/src/service-worker.js new file mode 100644 index 0000000..b86726c --- /dev/null +++ b/src/service-worker.js @@ -0,0 +1,65 @@ +/* eslint-disable no-restricted-globals */ +/* eslint-disable no-underscore-dangle */ +/* globals workbox */ +workbox.core.setCacheNameDetails({ + prefix: 'antd-pro', + suffix: 'v5', +}); +// Control all opened tabs ASAP +workbox.clientsClaim(); + +/** + * Use precaching list generated by workbox in build process. + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.precaching + */ +workbox.precaching.precacheAndRoute(self.__precacheManifest || []); + +/** + * Register a navigation route. + * https://developers.google.com/web/tools/workbox/modules/workbox-routing#how_to_register_a_navigation_route + */ +workbox.routing.registerNavigationRoute('/index.html'); + +/** + * Use runtime cache: + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.routing#.registerRoute + * + * Workbox provides all common caching strategies including CacheFirst, NetworkFirst etc. + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.strategies + */ + +/** Handle API requests */ +workbox.routing.registerRoute(/\/api\//, workbox.strategies.networkFirst()); + +/** Handle third party requests */ +workbox.routing.registerRoute( + /^https:\/\/gw\.alipayobjects\.com\//, + workbox.strategies.networkFirst(), +); +workbox.routing.registerRoute( + /^https:\/\/cdnjs\.cloudflare\.com\//, + workbox.strategies.networkFirst(), +); +workbox.routing.registerRoute(/\/color.less/, workbox.strategies.networkFirst()); + +/** Response to client after skipping waiting with MessageChannel */ +addEventListener('message', (event) => { + const replyPort = event.ports[0]; + const message = event.data; + if (replyPort && message && message.type === 'skip-waiting') { + event.waitUntil( + self.skipWaiting().then( + () => { + replyPort.postMessage({ + error: null, + }); + }, + (error) => { + replyPort.postMessage({ + error, + }); + }, + ), + ); + } +}); diff --git a/src/services/analysis/ActionDetection.ts b/src/services/analysis/ActionDetection.ts new file mode 100644 index 0000000..8aff5de --- /dev/null +++ b/src/services/analysis/ActionDetection.ts @@ -0,0 +1,21 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 分页获取ActionDetection列表 POST /action_detection/getActionDetectionList */ +export async function postActionDetectionGetActionDetectionList( + body: API.SearchActionDetectionParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/action_detection/getActionDetectionList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} diff --git a/src/services/analysis/index.ts b/src/services/analysis/index.ts new file mode 100644 index 0000000..5e89982 --- /dev/null +++ b/src/services/analysis/index.ts @@ -0,0 +1,8 @@ +// @ts-ignore +/* eslint-disable */ +// API 更新时间: +// API 唯一标识: +import * as ActionDetection from './ActionDetection'; +export default { + ActionDetection, +}; diff --git a/src/services/analysis/typings.d.ts b/src/services/analysis/typings.d.ts new file mode 100644 index 0000000..18fed1b --- /dev/null +++ b/src/services/analysis/typings.d.ts @@ -0,0 +1,45 @@ +declare namespace API { + type ActionDetection = { + id?: string; + source?: string; + configFile?: string; + type?: string; + remark?: string; + time?: number; + imagesPath?: string; + }; + + type PageResult = { + list?: any; + page?: number; + pageSize?: number; + total?: number; + }; + + type Response = { + code?: number; + data?: any; + msg?: string; + success?: boolean; + }; + + type SearchActionDetectionParams = { + configFile?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + /** 关键字 */ + keyword?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + remark?: string; + source?: string; + type?: string; + updateTime?: string; + }; +} diff --git a/src/services/ant-design-pro/api.ts b/src/services/ant-design-pro/api.ts new file mode 100644 index 0000000..5c75e93 --- /dev/null +++ b/src/services/ant-design-pro/api.ts @@ -0,0 +1,124 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 获取当前的用户 GET /api/currentUser */ +export async function currentUser(options?: { [key: string]: any }) { + return request<{ + data: API.CurrentUser; + }>('/api/currentUser', { + method: 'GET', + ...(options || {}), + }); +} + +/** 退出登录接口 POST /api/login/outLogin */ +export async function outLogin(options?: { [key: string]: any }) { + return request<Record<string, any>>('/api/login/outLogin', { + method: 'POST', + ...(options || {}), + }); +} + +/** 登录接口 POST /api/login/account */ +export async function login(body: API.LoginParams, options?: { [key: string]: any }) { + return request<API.LoginResult>('/api/login/account', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 此处后端没有提供注释 GET /api/notices */ +export async function getNotices(options?: { [key: string]: any }) { + return request<API.NoticeIconList>('/api/notices', { + method: 'GET', + ...(options || {}), + }); +} + +/** 获取规则列表 GET /api/rule */ +export async function rule( + params: { + // query + /** 当前的页码 */ + current?: number; + /** 页面的容量 */ + pageSize?: number; + }, + options?: { [key: string]: any }, +) { + return request<API.RuleList>('/api/rule', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} + +/** 新建规则 PUT /api/rule */ +export async function updateRule(options?: { [key: string]: any }) { + return request<API.RuleListItem>('/api/rule', { + method: 'PUT', + ...(options || {}), + }); +} + +/** 新建规则 POST /api/rule */ +export async function addRule(options?: { [key: string]: any }) { + return request<API.RuleListItem>('/api/rule', { + method: 'POST', + ...(options || {}), + }); +} + +/** 删除规则 DELETE /api/rule */ +export async function removeRule(options?: { [key: string]: any }) { + return request<Record<string, any>>('/api/rule', { + method: 'DELETE', + ...(options || {}), + }); +} + +/**fabric模型 /api/v1/mock/fabricModels/1 */ +// export async function fetchFabricModelsById(options?: { [key: string]: any }) { +// return request<Record<string, any>>('/api/v1/mock/fabricModels/1', { +// method: 'GET', +// ...(options || {}), +// }); +// } + + +export async function fetchFabricModelsById( + params: { + id?: number; + }, + options?: { [key: string]: any }, +) { + return request<Record<string, any>>('/api/v1/mock/fabricModels', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} + +export async function fetchFabricModelsById2( + params: { + id?: number; + }, + options?: { [key: string]: any }, +) { + return request<Record<string, any>>('/api/v1/mock/fabricModels2', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} \ No newline at end of file diff --git a/src/services/ant-design-pro/index.ts b/src/services/ant-design-pro/index.ts new file mode 100644 index 0000000..1ac489f --- /dev/null +++ b/src/services/ant-design-pro/index.ts @@ -0,0 +1,10 @@ +// @ts-ignore +/* eslint-disable */ +// API 更新时间: +// API 唯一标识: +import * as api from './api'; +import * as login from './login'; +export default { + api, + login, +}; diff --git a/src/services/ant-design-pro/login.ts b/src/services/ant-design-pro/login.ts new file mode 100644 index 0000000..8871ed8 --- /dev/null +++ b/src/services/ant-design-pro/login.ts @@ -0,0 +1,21 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 发送验证码 POST /api/login/captcha */ +export async function getFakeCaptcha( + params: { + // query + /** 手机号 */ + phone?: string; + }, + options?: { [key: string]: any }, +) { + return request<API.FakeCaptcha>('/api/login/captcha', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} diff --git a/src/services/ant-design-pro/typings.d.ts b/src/services/ant-design-pro/typings.d.ts new file mode 100644 index 0000000..13e5a68 --- /dev/null +++ b/src/services/ant-design-pro/typings.d.ts @@ -0,0 +1,101 @@ +// @ts-ignore +/* eslint-disable */ + +declare namespace API { + type CurrentUser = { + name?: string; + avatar?: string; + userid?: string; + email?: string; + signature?: string; + title?: string; + group?: string; + tags?: { key?: string; label?: string }[]; + notifyCount?: number; + unreadCount?: number; + country?: string; + access?: string; + geographic?: { + province?: { label?: string; key?: string }; + city?: { label?: string; key?: string }; + }; + address?: string; + phone?: string; + }; + + type LoginResult = { + status?: string; + type?: string; + currentAuthority?: string; + }; + + type PageParams = { + current?: number; + pageSize?: number; + }; + + type RuleListItem = { + key?: number; + disabled?: boolean; + href?: string; + avatar?: string; + name?: string; + owner?: string; + desc?: string; + callNo?: number; + status?: number; + updatedAt?: string; + createdAt?: string; + progress?: number; + }; + + type RuleList = { + data?: RuleListItem[]; + /** 列表的内容总数 */ + total?: number; + success?: boolean; + }; + + type FakeCaptcha = { + code?: number; + status?: string; + }; + + type LoginParams = { + username?: string; + password?: string; + autoLogin?: boolean; + type?: string; + }; + + type ErrorResponse = { + /** 业务约定的错误码 */ + errorCode: string; + /** 业务上的错误信息 */ + errorMessage?: string; + /** 业务上的请求是否成功 */ + success?: boolean; + }; + + type NoticeIconList = { + data?: NoticeIconItem[]; + /** 列表的内容总数 */ + total?: number; + success?: boolean; + }; + + type NoticeIconItemType = 'notification' | 'message' | 'event'; + + type NoticeIconItem = { + id?: string; + extra?: string; + key?: string; + read?: boolean; + avatar?: string; + title?: string; + status?: string; + datetime?: string; + description?: string; + type?: NoticeIconItemType; + }; +} diff --git a/src/services/device/Device.ts b/src/services/device/Device.ts new file mode 100644 index 0000000..8258ff5 --- /dev/null +++ b/src/services/device/Device.ts @@ -0,0 +1,171 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础Device POST /device/createDevice */ +export async function postDeviceCreateDevice(body: API.Device, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/device/createDevice`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除Device DELETE /device/deleteDevice */ +export async function deleteDeviceDeleteDevice(body: API.Device, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/device/deleteDevice`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中Device DELETE /device/deleteDeviceByIds */ +export async function deleteDeviceDeleteDeviceByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device/deleteDeviceByIds`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据id获取Device POST /device/getDeviceById */ +export async function postDeviceGetDeviceById(body: API.GetById, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.DeviceDeviceResponse }>( + `/api/v1/device/getDeviceById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取Device外键列表 POST /device/getDeviceFkSelect */ +export async function postDeviceGetDeviceFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/device/getDeviceFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取Device列表 POST /device/getDeviceList */ +export async function postDeviceGetDeviceList( + body: API.SearchDeviceParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/device/getDeviceList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得Device名称列表 POST /device/getDeviceNames */ +export async function postDeviceGetDeviceNames(body: API.IdsReq, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/device/getDeviceNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础Device PUT /device/updateDevice */ +export async function putDeviceUpdateDevice(body: API.Device, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/device/updateDevice`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 关闭rtsp摄像头驱动 POST /device/closeRtspCamera */ +export async function postDeviceCloseRtspCamera( + body: API.KillRtspReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device/closeRtspCamera`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + + +/** 打开rtsp摄像头驱动 POST /device/openRtspCamera */ +export async function postDeviceOpenRtspCamera( + body: API.RtspReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.RtspRes; msg?: string }>( + `/api/v1/device/openRtspCamera`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +export async function postDeviceGetAllDeviceByGroup( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.AllResult; msg?: string }>( + `/api/v1/device/getAllDeviceByGroup`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} diff --git a/src/services/device/DeviceCategory.ts b/src/services/device/DeviceCategory.ts new file mode 100644 index 0000000..5c1d4a9 --- /dev/null +++ b/src/services/device/DeviceCategory.ts @@ -0,0 +1,138 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础DeviceCategory POST /device_category/createDeviceCategory */ +export async function postDeviceCategoryCreateDeviceCategory( + body: API.DeviceCategory, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_category/createDeviceCategory`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除DeviceCategory DELETE /device_category/deleteDeviceCategory */ +export async function deleteDeviceCategoryDeleteDeviceCategory( + body: API.DeviceCategory, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_category/deleteDeviceCategory`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中DeviceCategory DELETE /device_category/deleteDeviceCategoryByIds */ +export async function deleteDeviceCategoryDeleteDeviceCategoryByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/device_category/deleteDeviceCategoryByIds`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 根据id获取DeviceCategory POST /device_category/getDeviceCategoryById */ +export async function postDeviceCategoryGetDeviceCategoryById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.DeviceDeviceCategoryResponse }>( + `/api/v1/device_category/getDeviceCategoryById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取DeviceCategory外键列表 POST /device_category/getDeviceCategoryFkSelect */ +export async function postDeviceCategoryGetDeviceCategoryFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/device_category/getDeviceCategoryFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取DeviceCategory列表 POST /device_category/getDeviceCategoryList */ +export async function postDeviceCategoryGetDeviceCategoryList( + body: API.SearchDeviceCategoryParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/device_category/getDeviceCategoryList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得DeviceCategory名称列表 POST /device_category/getDeviceCategoryNames */ +export async function postDeviceCategoryGetDeviceCategoryNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/device_category/getDeviceCategoryNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础DeviceCategory PUT /device_category/updateDeviceCategory */ +export async function putDeviceCategoryUpdateDeviceCategory( + body: API.DeviceCategory, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_category/updateDeviceCategory`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/device/DeviceGroup.ts b/src/services/device/DeviceGroup.ts new file mode 100644 index 0000000..89f1ebc --- /dev/null +++ b/src/services/device/DeviceGroup.ts @@ -0,0 +1,146 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础DeviceGroup POST /device_group/createDeviceGroup */ +export async function postDeviceGroupCreateDeviceGroup( + body: API.DeviceGroup, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_group/createDeviceGroup`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除DeviceGroup DELETE /device_group/deleteDeviceGroup */ +export async function deleteDeviceGroupDeleteDeviceGroup( + body: API.DeviceGroup, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_group/deleteDeviceGroup`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中DeviceGroup DELETE /device_group/deleteDeviceGroupByIds */ +export async function deleteDeviceGroupDeleteDeviceGroupByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_group/deleteDeviceGroupByIds`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据id获取DeviceGroup POST /device_group/getDeviceGroupById */ +export async function postDeviceGroupGetDeviceGroupById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.DeviceDeviceGroupResponse }>( + `/api/v1/device_group/getDeviceGroupById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取DeviceGroup外键列表 POST /device_group/getDeviceGroupFkSelect */ +export async function postDeviceGroupGetDeviceGroupFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/device_group/getDeviceGroupFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取DeviceGroup列表 POST /device_group/getDeviceGroupList */ +export async function postDeviceGroupGetDeviceGroupList( + body: API.SearchDeviceGroupParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/device_group/getDeviceGroupList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得DeviceGroup名称列表 POST /device_group/getDeviceGroupNames */ +export async function postDeviceGroupGetDeviceGroupNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/device_group/getDeviceGroupNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取设备组树 POST /device_group/getDeviceGroupTree */ +export async function postDeviceGroupGetDeviceGroupTree(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.TreeResponse; msg?: string }>( + `/api/v1/device_group/getDeviceGroupTree`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 修改基础DeviceGroup PUT /device_group/updateDeviceGroup */ +export async function putDeviceGroupUpdateDeviceGroup( + body: API.DeviceGroup, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_group/updateDeviceGroup`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/device/DeviceModelInGroup.ts b/src/services/device/DeviceModelInGroup.ts new file mode 100644 index 0000000..159d3da --- /dev/null +++ b/src/services/device/DeviceModelInGroup.ts @@ -0,0 +1,162 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础DeviceModelInGroup POST /device_model_in_group/createDeviceModelInGroup */ +export async function postDeviceModelInGroupCreateDeviceModelInGroup( + body: API.DeviceModelInGroup, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/device_model_in_group/createDeviceModelInGroup`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 删除DeviceModelInGroup DELETE /device_model_in_group/deleteDeviceModelInGroup */ +export async function deleteDeviceModelInGroupDeleteDeviceModelInGroup( + body: API.DeviceModelInGroup, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/device_model_in_group/deleteDeviceModelInGroup`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 删除选中DeviceModelInGroup DELETE /device_model_in_group/deleteDeviceModelInGroupByIds */ +export async function deleteDeviceModelInGroupDeleteDeviceModelInGroupByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/device_model_in_group/deleteDeviceModelInGroupByIds`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 根据id获取DeviceModelInGroup POST /device_model_in_group/getDeviceModelInGroupById */ +export async function postDeviceModelInGroupGetDeviceModelInGroupById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.DeviceDeviceModelInGroupResponse }>( + `/api/v1/device_model_in_group/getDeviceModelInGroupById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取DeviceModelInGroup外键列表 POST /device_model_in_group/getDeviceModelInGroupFkSelect */ +export async function postDeviceModelInGroupGetDeviceModelInGroupFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/device_model_in_group/getDeviceModelInGroupFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取DeviceModelInGroup列表 POST /device_model_in_group/getDeviceModelInGroupList */ +export async function postDeviceModelInGroupGetDeviceModelInGroupList( + body: API.SearchDeviceModelInGroupParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/device_model_in_group/getDeviceModelInGroupList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得DeviceModelInGroup名称列表 POST /device_model_in_group/getDeviceModelInGroupNames */ +export async function postDeviceModelInGroupGetDeviceModelInGroupNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/device_model_in_group/getDeviceModelInGroupNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础DeviceModelInGroup PUT /device_model_in_group/updateDeviceModelInGroup */ +export async function putDeviceModelInGroupUpdateDeviceModelInGroup( + body: API.DeviceModelInGroup, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/device_model_in_group/updateDeviceModelInGroup`, + { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 更新网点中的设备 PUT /device_model_in_group/updateDevicesInGroupModel */ +export async function putRoleUpdateDevicesInGroupModel( + body: API.UpdateDevicesInGroupModelParams, + options?: { [key: string]: any }, +) { + return request<any>(`/api/v1/device_model_in_group/updateDevicesInGroupModel`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/device/DeviceRelation.ts b/src/services/device/DeviceRelation.ts new file mode 100644 index 0000000..f90242f --- /dev/null +++ b/src/services/device/DeviceRelation.ts @@ -0,0 +1,138 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础DeviceRelation POST /device_relation/createDeviceRelation */ +export async function postDeviceRelationCreateDeviceRelation( + body: API.DeviceRelation, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_relation/createDeviceRelation`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除DeviceRelation DELETE /device_relation/deleteDeviceRelation */ +export async function deleteDeviceRelationDeleteDeviceRelation( + body: API.DeviceRelation, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_relation/deleteDeviceRelation`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中DeviceRelation DELETE /device_relation/deleteDeviceRelationByIds */ +export async function deleteDeviceRelationDeleteDeviceRelationByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/device_relation/deleteDeviceRelationByIds`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 根据id获取DeviceRelation POST /device_relation/getDeviceRelationById */ +export async function postDeviceRelationGetDeviceRelationById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.DeviceDeviceRelationResponse }>( + `/api/v1/device_relation/getDeviceRelationById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取DeviceRelation外键列表 POST /device_relation/getDeviceRelationFkSelect */ +export async function postDeviceRelationGetDeviceRelationFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/device_relation/getDeviceRelationFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取DeviceRelation列表 POST /device_relation/getDeviceRelationList */ +export async function postDeviceRelationGetDeviceRelationList( + body: API.SearchDeviceRelationParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/device_relation/getDeviceRelationList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得DeviceRelation名称列表 POST /device_relation/getDeviceRelationNames */ +export async function postDeviceRelationGetDeviceRelationNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/device_relation/getDeviceRelationNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础DeviceRelation PUT /device_relation/updateDeviceRelation */ +export async function putDeviceRelationUpdateDeviceRelation( + body: API.DeviceRelation, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/device_relation/updateDeviceRelation`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/device/index.ts b/src/services/device/index.ts new file mode 100644 index 0000000..8ac824c --- /dev/null +++ b/src/services/device/index.ts @@ -0,0 +1,14 @@ +// @ts-ignore +/* eslint-disable */ +// API 更新时间: +// API 唯一标识: +import * as Device from './Device'; +import * as DeviceCategory from './DeviceCategory'; +import * as DeviceGroup from './DeviceGroup'; +import * as DeviceRelation from './DeviceRelation'; +export default { + Device, + DeviceCategory, + DeviceGroup, + DeviceRelation, +}; diff --git a/src/services/device/typings.d.ts b/src/services/device/typings.d.ts new file mode 100644 index 0000000..941743f --- /dev/null +++ b/src/services/device/typings.d.ts @@ -0,0 +1,222 @@ +declare namespace API { + type AllResult = { + list?: any; + }; + type Device = { + categoryFkId?: number; + code?: string; + createTime?: string; + groupFkId?: number; + id?: number; + isEnable?: boolean; + name?: string; + param?: string; + position?: string; + remark?: string; + spec?: string; + updateTime?: string; + }; + + type DeviceCategory = { + code?: string; + createTime?: string; + id?: number; + name?: string; + remark?: string; + updateTime?: string; + }; + + type RtspReq = { + /** rtsp地址 */ + url?: string; + }; + type KillRtspReq = { + /** rtsp地址 */ + pid?: number; + }; + + type RtspRes = { + host?: string; + pid?: number; + }; + + type DeviceDeviceCategoryResponse = { + deviceCategory?: DeviceCategory; + }; + + type DeviceDeviceGroupResponse = { + deviceGroup?: DeviceGroup; + }; + + type DeviceDeviceRelationResponse = { + deviceRelation?: DeviceRelation; + }; + + type DeviceDeviceResponse = { + device?: Device; + }; + + type DeviceGroup = { + address?: string; + children?: DeviceGroup[]; + code?: string; + createTime?: string; + id?: number; + isEnable?: boolean; + key?: string; + lat?: string; + lon?: string; + managerName?: string; + managerPhone?: string; + name?: string; + parentFkId?: number; + remark?: string; + telephone?: string; + updateTime?: string; + }; + + type DeviceRelation = { + createTime?: string; + deviceParentFkId?: number; + deviceSonFkId?: number; + id?: number; + updateTime?: string; + }; + + type FkResult = { + list?: any; + }; + + type GetById = { + /** 主键ID */ + id?: number; + }; + + type GetFkSelect = { + /** 关键字 */ + keyword?: string; + }; + + type IdsReq = { + ids?: number[]; + }; + + type NamesResult = { + list?: any; + }; + + type PageResult = { + list?: any; + page?: number; + pageSize?: number; + total?: number; + }; + + type Response = { + code?: number; + data?: any; + msg?: string; + success?: boolean; + }; + + type SearchDeviceCategoryParams = { + code?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + /** 关键字 */ + keyword?: string; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + remark?: string; + updateTime?: string; + }; + + type SearchDeviceGroupParams = { + address?: string; + children?: DeviceGroup[]; + code?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + isEnable?: boolean; + key?: string; + /** 关键字 */ + keyword?: string; + lat?: string; + lon?: string; + managerName?: string; + managerPhone?: string; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + parentFkId?: number; + remark?: string; + telephone?: string; + updateTime?: string; + }; + + type SearchDeviceParams = { + categoryFkId?: number; + code?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + groupFkId?: number; + id?: number; + isEnable?: boolean; + /** 关键字 */ + keyword?: string; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + param?: string; + position?: string; + remark?: string; + spec?: string; + updateTime?: string; + }; + + type SearchDeviceRelationParams = { + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + deviceParentFkId?: number; + deviceSonFkId?: number; + id?: number; + /** 关键字 */ + keyword?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + updateTime?: string; + }; + + type Tree = { + children?: Tree[]; + key?: number; + title?: string; + }; + + type TreeResponse = { + tree?: Tree[]; + }; +} diff --git a/src/services/project/Project.ts b/src/services/project/Project.ts new file mode 100644 index 0000000..4a9fc7e --- /dev/null +++ b/src/services/project/Project.ts @@ -0,0 +1,162 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础Project POST /project/createProject */ +export async function postProjectCreateProject( + body: API.Project, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/project/createProject`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除Project DELETE /project/deleteProject */ +export async function deleteProjectDeleteProject( + body: API.Project, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/project/deleteProject`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中Project DELETE /project/deleteProjectByIds */ +export async function deleteProjectDeleteProjectByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/project/deleteProjectByIds`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据组id获得项目id和name POST /project/getProjectByGroupId */ +export async function postProjectGetProjectByGroupId( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<any>(`/api/v1/project/getProjectByGroupId`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据id获取Project POST /project/getProjectById */ +export async function postProjectGetProjectById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ProjectProjectResponse }>( + `/api/v1/project/getProjectById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取Project外键列表 POST /project/getProjectFkSelect */ +export async function postProjectGetProjectFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/project/getProjectFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取Project列表 POST /project/getProjectList */ +export async function postProjectGetProjectList( + body: API.SearchProjectParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/project/getProjectList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得Project名称列表 POST /project/getProjectNames */ +export async function postProjectGetProjectNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/project/getProjectNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础Project PUT /project/updateProject */ +export async function putProjectUpdateProject(body: API.Project, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/project/updateProject`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 更新项目的关联组 PUT /project/updateProjectGroup */ +export async function putProjectUpdateProjectGroup( + body: API.UpdateProjectGroupParams, + options?: { [key: string]: any }, +) { + return request<any>(`/api/v1/project/updateProjectGroup`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/project/ProjectModelConfig.ts b/src/services/project/ProjectModelConfig.ts new file mode 100644 index 0000000..ffa5852 --- /dev/null +++ b/src/services/project/ProjectModelConfig.ts @@ -0,0 +1,111 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础ProjectModelConfig POST /project_model_config/createProjectModelConfig */ +export async function postProjectModelConfigCreateProjectModelConfig( + body: API.ProjectModelConfig, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/project_model_config/createProjectModelConfig`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 删除ProjectModelConfig DELETE /project_model_config/deleteProjectModelConfig */ +export async function deleteProjectModelConfigDeleteProjectModelConfig( + body: API.ProjectModelConfig, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/project_model_config/deleteProjectModelConfig`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 删除选中ProjectModelConfig DELETE /project_model_config/deleteProjectModelConfigByIds */ +export async function deleteProjectModelConfigDeleteProjectModelConfigByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/project_model_config/deleteProjectModelConfigByIds`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 根据id获取ProjectModelConfig POST /project_model_config/getProjectModelConfigById */ +export async function postProjectModelConfigGetProjectModelConfigById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ProjectProjectModelConfigResponse }>( + `/api/v1/project_model_config/getProjectModelConfigById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取ProjectModelConfig列表 POST /project_model_config/getProjectModelConfigList */ +export async function postProjectModelConfigGetProjectModelConfigList( + body: API.SearchProjectModelConfigParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/project_model_config/getProjectModelConfigList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础ProjectModelConfig PUT /project_model_config/updateProjectModelConfig */ +export async function putProjectModelConfigUpdateProjectModelConfig( + body: API.ProjectModelConfig, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/project_model_config/updateProjectModelConfig`, + { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} diff --git a/src/services/project/index.ts b/src/services/project/index.ts new file mode 100644 index 0000000..46874f5 --- /dev/null +++ b/src/services/project/index.ts @@ -0,0 +1,11 @@ +// @ts-ignore +/* eslint-disable */ +// API 更新时间: +// API 唯一标识: +import * as Project from './Project'; +import * as ProjectModelConfig from './ProjectModelConfig'; + +export default { + Project, + ProjectModelConfig, +}; diff --git a/src/services/project/typings.d.ts b/src/services/project/typings.d.ts new file mode 100644 index 0000000..acf0ff7 --- /dev/null +++ b/src/services/project/typings.d.ts @@ -0,0 +1,126 @@ +declare namespace API { + type FkResult = { + list?: any; + }; + + type GetById = { + /** 主键ID */ + id?: number; + }; + + type GetFkSelect = { + /** 关键字 */ + keyword?: string; + }; + + type IdsReq = { + ids?: number[]; + }; + + type NamesResult = { + list?: any; + }; + + type PageResult = { + list?: any; + page?: number; + pageSize?: number; + total?: number; + }; + + type Project = { + code?: string; + createTime?: string; + groupIds?: number[]; + id?: number; + inferConfig?: Record<string, any>; + info?: string; + isEnable?: boolean; + name?: string; + projectFilePath?: string; + remark?: string; + updateTime?: string; + }; + + type ProjectModelConfig = { + createTime?: string; + /** 设备是一个 以,隔开的存储device id的字符例如 1,2 */ + devices?: string; + id?: number; + modelConfig?: Record<string, any>; + modelFkId?: number; + modelVersionFkId?: number; + projectConfig?: Record<string, any>; + projectGroupFkId?: number; + remark?: string; + updateTime?: string; + }; + + type ProjectProjectModelConfigResponse = { + ProjectModelConfig?: ProjectModelConfig; + }; + + type ProjectProjectResponse = { + project?: Project; + }; + + type Response = { + code?: number; + data?: any; + msg?: string; + success?: boolean; + }; + + type SearchProjectModelConfigParams = { + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + /** 设备是一个 以,隔开的存储device id的字符例如 1,2 */ + devices?: string; + id?: number; + /** 关键字 */ + keyword?: string; + modelConfig?: Record<string, any>; + modelFkId?: number; + modelVersionFkId?: number; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + projectConfig?: Record<string, any>; + projectGroupFkId?: number; + remark?: string; + updateTime?: string; + }; + + type SearchProjectParams = { + code?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + groupIds?: number[]; + id?: number; + inferConfig?: Record<string, any>; + info?: string; + isEnable?: boolean; + /** 关键字 */ + keyword?: string; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + projectFilePath?: string; + remark?: string; + updateTime?: string; + }; + + type UpdateProjectGroupParams = { + groupIds?: number[]; + projectId?: number; + }; +} diff --git a/src/services/resource/AlgorithmModel.ts b/src/services/resource/AlgorithmModel.ts new file mode 100644 index 0000000..c7bce76 --- /dev/null +++ b/src/services/resource/AlgorithmModel.ts @@ -0,0 +1,156 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础AlgorithmModel POST /algorithm_model/createAlgorithmModel */ +export async function postAlgorithmModelCreateAlgorithmModel( + body: API.AlgorithmModel, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/algorithm_model/createAlgorithmModel`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除AlgorithmModel DELETE /algorithm_model/deleteAlgorithmModel */ +export async function deleteAlgorithmModelDeleteAlgorithmModel( + body: API.AlgorithmModel, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/algorithm_model/deleteAlgorithmModel`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中AlgorithmModel DELETE /algorithm_model/deleteAlgorithmModelByIds */ +export async function deleteAlgorithmModelDeleteAlgorithmModelByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/algorithm_model/deleteAlgorithmModelByIds`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 根据id获取AlgorithmModel POST /algorithm_model/getAlgorithmModelById */ +export async function postAlgorithmModelGetAlgorithmModelById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ResourceAlgorithmModelResponse }>( + `/api/v1/algorithm_model/getAlgorithmModelById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取AlgorithmModel外键列表 POST /algorithm_model/getAlgorithmModelFkSelect */ +export async function postAlgorithmModelGetAlgorithmModelFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/algorithm_model/getAlgorithmModelFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取AlgorithmModel列表 POST /algorithm_model/getAlgorithmModelList */ +export async function postAlgorithmModelGetAlgorithmModelList( + body: API.SearchAlgorithmModelParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/algorithm_model/getAlgorithmModelList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得AlgorithmModel名称列表 POST /algorithm_model/getAlgorithmModelNames */ +export async function postAlgorithmModelGetAlgorithmModelNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/algorithm_model/getAlgorithmModelNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础AlgorithmModel PUT /algorithm_model/updateAlgorithmModel */ +export async function putAlgorithmModelUpdateAlgorithmModel( + body: API.AlgorithmModel, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/algorithm_model/updateAlgorithmModel`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据id获取所有的版本 POST /algorithm_model/getAllVersionsById */ +export async function postAlgorithmModelGetAllVersionsById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ResourceModelVersionFkSelectResponse }>( + `/api/v1/algorithm_model/getAllVersionsById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} diff --git a/src/services/resource/BusinessImage.ts b/src/services/resource/BusinessImage.ts new file mode 100644 index 0000000..d59635f --- /dev/null +++ b/src/services/resource/BusinessImage.ts @@ -0,0 +1,138 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础BusinessImage POST /business_image/createBusinessImage */ +export async function postBusinessImageCreateBusinessImage( + body: API.BusinessImage, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/business_image/createBusinessImage`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除BusinessImage DELETE /business_image/deleteBusinessImage */ +export async function deleteBusinessImageDeleteBusinessImage( + body: API.BusinessImage, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/business_image/deleteBusinessImage`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中BusinessImage DELETE /business_image/deleteBusinessImageByIds */ +export async function deleteBusinessImageDeleteBusinessImageByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/business_image/deleteBusinessImageByIds`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 根据id获取BusinessImage POST /business_image/getBusinessImageById */ +export async function postBusinessImageGetBusinessImageById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ResourceBusinessImageResponse }>( + `/api/v1/business_image/getBusinessImageById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取BusinessImage外键列表 POST /business_image/getBusinessImageFkSelect */ +export async function postBusinessImageGetBusinessImageFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/business_image/getBusinessImageFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取BusinessImage列表 POST /business_image/getBusinessImageList */ +export async function postBusinessImageGetBusinessImageList( + body: API.SearchBusinessImageParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/business_image/getBusinessImageList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得BusinessImage名称列表 POST /business_image/getBusinessImageNames */ +export async function postBusinessImageGetBusinessImageNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/business_image/getBusinessImageNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础BusinessImage PUT /business_image/updateBusinessImage */ +export async function putBusinessImageUpdateBusinessImage( + body: API.BusinessImage, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/business_image/updateBusinessImage`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/resource/ModelCategory.ts b/src/services/resource/ModelCategory.ts new file mode 100644 index 0000000..ef047bd --- /dev/null +++ b/src/services/resource/ModelCategory.ts @@ -0,0 +1,138 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础ModelCategory POST /model_category/createModelCategory */ +export async function postModelCategoryCreateModelCategory( + body: API.ModelCategory, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_category/createModelCategory`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除ModelCategory DELETE /model_category/deleteModelCategory */ +export async function deleteModelCategoryDeleteModelCategory( + body: API.ModelCategory, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_category/deleteModelCategory`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中ModelCategory DELETE /model_category/deleteModelCategoryByIds */ +export async function deleteModelCategoryDeleteModelCategoryByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/model_category/deleteModelCategoryByIds`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 根据id获取ModelCategory POST /model_category/getModelCategoryById */ +export async function postModelCategoryGetModelCategoryById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ResourceModelCategoryResponse }>( + `/api/v1/model_category/getModelCategoryById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取ModelCategory外键列表 POST /model_category/getModelCategoryFkSelect */ +export async function postModelCategoryGetModelCategoryFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/model_category/getModelCategoryFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取ModelCategory列表 POST /model_category/getModelCategoryList */ +export async function postModelCategoryGetModelCategoryList( + body: API.SearchModelCategoryParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/model_category/getModelCategoryList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得ModelCategory名称列表 POST /model_category/getModelCategoryNames */ +export async function postModelCategoryGetModelCategoryNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/model_category/getModelCategoryNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础ModelCategory PUT /model_category/updateModelCategory */ +export async function putModelCategoryUpdateModelCategory( + body: API.ModelCategory, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_category/updateModelCategory`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/resource/ModelImage.ts b/src/services/resource/ModelImage.ts new file mode 100644 index 0000000..6f3031b --- /dev/null +++ b/src/services/resource/ModelImage.ts @@ -0,0 +1,135 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础ModelImage POST /model_image/createModelImage */ +export async function postModelImageCreateModelImage( + body: API.ModelImage, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_image/createModelImage`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除ModelImage DELETE /model_image/deleteModelImage */ +export async function deleteModelImageDeleteModelImage( + body: API.ModelImage, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_image/deleteModelImage`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中ModelImage DELETE /model_image/deleteModelImageByIds */ +export async function deleteModelImageDeleteModelImageByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_image/deleteModelImageByIds`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据id获取ModelImage POST /model_image/getModelImageById */ +export async function postModelImageGetModelImageById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ResourceModelImageResponse }>( + `/api/v1/model_image/getModelImageById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取ModelImage外键列表 POST /model_image/getModelImageFkSelect */ +export async function postModelImageGetModelImageFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/model_image/getModelImageFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取ModelImage列表 POST /model_image/getModelImageList */ +export async function postModelImageGetModelImageList( + body: API.SearchModelImageParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/model_image/getModelImageList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得ModelImage名称列表 POST /model_image/getModelImageNames */ +export async function postModelImageGetModelImageNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/model_image/getModelImageNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础ModelImage PUT /model_image/updateModelImage */ +export async function putModelImageUpdateModelImage( + body: API.ModelImage, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_image/updateModelImage`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/resource/ModelVersion.ts b/src/services/resource/ModelVersion.ts new file mode 100644 index 0000000..dfa2c04 --- /dev/null +++ b/src/services/resource/ModelVersion.ts @@ -0,0 +1,153 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础ModelVersion POST /model_version/createModelVersion */ +export async function postModelVersionCreateModelVersion( + body: API.ModelVersion, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_version/createModelVersion`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除ModelVersion DELETE /model_version/deleteModelVersion */ +export async function deleteModelVersionDeleteModelVersion( + body: API.ModelVersion, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_version/deleteModelVersion`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中ModelVersion DELETE /model_version/deleteModelVersionByIds */ +export async function deleteModelVersionDeleteModelVersionByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_version/deleteModelVersionByIds`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据id获取ModelVersion POST /model_version/getModelVersionById */ +export async function postModelVersionGetModelVersionById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ResourceModelVersionResponse }>( + `/api/v1/model_version/getModelVersionById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取ModelVersion外键列表 POST /model_version/getModelVersionFkSelect */ +export async function postModelVersionGetModelVersionFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/model_version/getModelVersionFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取ModelVersion列表 POST /model_version/getModelVersionList */ +export async function postModelVersionGetModelVersionList( + body: API.SearchModelVersionParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/model_version/getModelVersionList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得ModelVersion名称列表 POST /model_version/getModelVersionNames */ +export async function postModelVersionGetModelVersionNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/model_version/getModelVersionNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础ModelVersion PUT /model_version/updateModelVersion */ +export async function putModelVersionUpdateModelVersion( + body: API.ModelVersion, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/model_version/updateModelVersion`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据ids获取ModelVersion列表 POST /model_version/getModelVersionListByIds */ +export async function postModelVersionGetModelVersionListByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.ResourceModelVersionListResponse }>( + `/api/v1/model_version/getModelVersionListByIds`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} diff --git a/src/services/resource/index.ts b/src/services/resource/index.ts new file mode 100644 index 0000000..37b6132 --- /dev/null +++ b/src/services/resource/index.ts @@ -0,0 +1,16 @@ +// @ts-ignore +/* eslint-disable */ +// API 更新时间: +// API 唯一标识: +import * as AlgorithmModel from './AlgorithmModel'; +import * as BusinessImage from './BusinessImage'; +import * as ModelCategory from './ModelCategory'; +import * as ModelImage from './ModelImage'; +import * as ModelVersion from './ModelVersion'; +export default { + AlgorithmModel, + BusinessImage, + ModelCategory, + ModelImage, + ModelVersion, +}; diff --git a/src/services/resource/typings.d.ts b/src/services/resource/typings.d.ts new file mode 100644 index 0000000..c3b795b --- /dev/null +++ b/src/services/resource/typings.d.ts @@ -0,0 +1,226 @@ +declare namespace API { + type ResourceModelVersionListResponse = { + modelVersions?: ModelVersion[]; + }; + type AlgorithmModel = { + categoryFkId?: number; + createTime?: string; + id?: number; + name?: string; + defaultVersionFkId?: number; + remark?: string; + updateTime?: string; + }; + + type ResourceModelVersionFkSelectResponse = { + id?: number; + name?: string; + }; + + type BusinessImage = { + configHash?: string; + createTime?: string; + id?: number; + name?: string; + path?: string; + projectFkId?: number; + remark?: string; + startCode?: string; + updateTime?: string; + version?: string; + }; + + type FkResult = { + list?: any; + }; + + type GetById = { + /** 主键ID */ + id?: number; + }; + + type GetFkSelect = { + /** 关键字 */ + keyword?: string; + }; + + type IdsReq = { + ids?: number[]; + }; + + type ModelCategory = { + code?: string; + createTime?: string; + id?: number; + name?: string; + remark?: string; + updateTime?: string; + }; + + type ModelImage = { + createTime?: string; + id?: number; + modelVersionFkId?: number; + name?: string; + path?: string; + remark?: string; + startCode?: string; + updateTime?: string; + }; + + type ModelVersion = { + createTime?: string; + id?: number; + isEnable?: boolean; + modelFkId?: number; + modelConfig?: Record<string, any>; + path?: string; + status?: number; + remark?: string; + startCode?: string; + updateTime?: string; + version?: string; + }; + + type NamesResult = { + list?: any; + }; + + type PageResult = { + list?: any; + page?: number; + pageSize?: number; + total?: number; + }; + + type ResourceAlgorithmModelResponse = { + algorithmModel?: AlgorithmModel; + }; + + type ResourceBusinessImageResponse = { + businessImage?: BusinessImage; + }; + + type ResourceModelCategoryResponse = { + modelCategory?: ModelCategory; + }; + + type ResourceModelImageResponse = { + modelImage?: ModelImage; + }; + + type ResourceModelVersionResponse = { + modelVersion?: ModelVersion; + }; + + type Response = { + code?: number; + data?: any; + msg?: string; + success?: boolean; + }; + + type SearchAlgorithmModelParams = { + categoryFkId?: number; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + /** 关键字 */ + keyword?: string; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + remark?: string; + updateTime?: string; + }; + + type SearchBusinessImageParams = { + configHash?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + /** 关键字 */ + keyword?: string; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + path?: string; + projectFkId?: number; + remark?: string; + startCode?: string; + updateTime?: string; + version?: string; + }; + + type SearchModelCategoryParams = { + code?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + /** 关键字 */ + keyword?: string; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + remark?: string; + updateTime?: string; + }; + + type SearchModelImageParams = { + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + /** 关键字 */ + keyword?: string; + modelVersionFkId?: number; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + path?: string; + remark?: string; + startCode?: string; + updateTime?: string; + }; + + type SearchModelVersionParams = { + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + isEnable?: boolean; + /** 关键字 */ + keyword?: string; + modelFkId?: number; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + path?: string; + remark?: string; + startCode?: string; + updateTime?: string; + version?: string; + }; +} diff --git a/src/services/swagger/index.ts b/src/services/swagger/index.ts new file mode 100644 index 0000000..83cf97c --- /dev/null +++ b/src/services/swagger/index.ts @@ -0,0 +1,12 @@ +// @ts-ignore +/* eslint-disable */ +// API 更新时间: +// API 唯一标识: +import * as pet from './pet'; +import * as store from './store'; +import * as user from './user'; +export default { + pet, + store, + user, +}; diff --git a/src/services/swagger/pet.ts b/src/services/swagger/pet.ts new file mode 100644 index 0000000..b887475 --- /dev/null +++ b/src/services/swagger/pet.ts @@ -0,0 +1,153 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** Update an existing pet PUT /pet */ +export async function updatePet(body: API.Pet, options?: { [key: string]: any }) { + return request<any>('/pet', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Add a new pet to the store POST /pet */ +export async function addPet(body: API.Pet, options?: { [key: string]: any }) { + return request<any>('/pet', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Find pet by ID Returns a single pet GET /pet/${param0} */ +export async function getPetById( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getPetByIdParams, + options?: { [key: string]: any }, +) { + const { petId: param0, ...queryParams } = params; + return request<API.Pet>(`/pet/${param0}`, { + method: 'GET', + params: { ...queryParams }, + ...(options || {}), + }); +} + +/** Updates a pet in the store with form data POST /pet/${param0} */ +export async function updatePetWithForm( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.updatePetWithFormParams, + body: { name?: string; status?: string }, + options?: { [key: string]: any }, +) { + const { petId: param0, ...queryParams } = params; + const formData = new FormData(); + + Object.keys(body).forEach((ele) => { + const item = (body as any)[ele]; + + if (item !== undefined && item !== null) { + formData.append( + ele, + typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item, + ); + } + }); + + return request<any>(`/pet/${param0}`, { + method: 'POST', + params: { ...queryParams }, + data: formData, + ...(options || {}), + }); +} + +/** Deletes a pet DELETE /pet/${param0} */ +export async function deletePet( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.deletePetParams & { + // header + api_key?: string; + }, + options?: { [key: string]: any }, +) { + const { petId: param0, ...queryParams } = params; + return request<any>(`/pet/${param0}`, { + method: 'DELETE', + headers: {}, + params: { ...queryParams }, + ...(options || {}), + }); +} + +/** uploads an image POST /pet/${param0}/uploadImage */ +export async function uploadFile( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.uploadFileParams, + body: { additionalMetadata?: string; file?: string }, + file?: File, + options?: { [key: string]: any }, +) { + const { petId: param0, ...queryParams } = params; + const formData = new FormData(); + + if (file) { + formData.append('file', file); + } + + Object.keys(body).forEach((ele) => { + const item = (body as any)[ele]; + + if (item !== undefined && item !== null) { + formData.append( + ele, + typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item, + ); + } + }); + + return request<API.ApiResponse>(`/pet/${param0}/uploadImage`, { + method: 'POST', + params: { ...queryParams }, + data: formData, + requestType: 'form', + ...(options || {}), + }); +} + +/** Finds Pets by status Multiple status values can be provided with comma separated strings GET /pet/findByStatus */ +export async function findPetsByStatus( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.findPetsByStatusParams, + options?: { [key: string]: any }, +) { + return request<API.Pet[]>('/pet/findByStatus', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} + +/** Finds Pets by tags Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. GET /pet/findByTags */ +export async function findPetsByTags( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.findPetsByTagsParams, + options?: { [key: string]: any }, +) { + return request<API.Pet[]>('/pet/findByTags', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} diff --git a/src/services/swagger/store.ts b/src/services/swagger/store.ts new file mode 100644 index 0000000..b9c689a --- /dev/null +++ b/src/services/swagger/store.ts @@ -0,0 +1,48 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** Returns pet inventories by status Returns a map of status codes to quantities GET /store/inventory */ +export async function getInventory(options?: { [key: string]: any }) { + return request<Record<string, any>>('/store/inventory', { + method: 'GET', + ...(options || {}), + }); +} + +/** Place an order for a pet POST /store/order */ +export async function placeOrder(body: API.Order, options?: { [key: string]: any }) { + return request<API.Order>('/store/order', { + method: 'POST', + data: body, + ...(options || {}), + }); +} + +/** Find purchase order by ID For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions GET /store/order/${param0} */ +export async function getOrderById( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getOrderByIdParams, + options?: { [key: string]: any }, +) { + const { orderId: param0, ...queryParams } = params; + return request<API.Order>(`/store/order/${param0}`, { + method: 'GET', + params: { ...queryParams }, + ...(options || {}), + }); +} + +/** Delete purchase order by ID For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors DELETE /store/order/${param0} */ +export async function deleteOrder( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.deleteOrderParams, + options?: { [key: string]: any }, +) { + const { orderId: param0, ...queryParams } = params; + return request<any>(`/store/order/${param0}`, { + method: 'DELETE', + params: { ...queryParams }, + ...(options || {}), + }); +} diff --git a/src/services/swagger/typings.d.ts b/src/services/swagger/typings.d.ts new file mode 100644 index 0000000..d06bcfc --- /dev/null +++ b/src/services/swagger/typings.d.ts @@ -0,0 +1,112 @@ +declare namespace API { + type ApiResponse = { + code?: number; + type?: string; + message?: string; + }; + + type Category = { + id?: number; + name?: string; + }; + + type deleteOrderParams = { + /** ID of the order that needs to be deleted */ + orderId: number; + }; + + type deletePetParams = { + api_key?: string; + /** Pet id to delete */ + petId: number; + }; + + type deleteUserParams = { + /** The name that needs to be deleted */ + username: string; + }; + + type findPetsByStatusParams = { + /** Status values that need to be considered for filter */ + status: ('available' | 'pending' | 'sold')[]; + }; + + type findPetsByTagsParams = { + /** Tags to filter by */ + tags: string[]; + }; + + type getOrderByIdParams = { + /** ID of pet that needs to be fetched */ + orderId: number; + }; + + type getPetByIdParams = { + /** ID of pet to return */ + petId: number; + }; + + type getUserByNameParams = { + /** The name that needs to be fetched. Use user1 for testing. */ + username: string; + }; + + type loginUserParams = { + /** The user name for login */ + username: string; + /** The password for login in clear text */ + password: string; + }; + + type Order = { + id?: number; + petId?: number; + quantity?: number; + shipDate?: string; + /** Order Status */ + status?: 'placed' | 'approved' | 'delivered'; + complete?: boolean; + }; + + type Pet = { + id?: number; + category?: Category; + name: string; + photoUrls: string[]; + tags?: Tag[]; + /** pet status in the store */ + status?: 'available' | 'pending' | 'sold'; + }; + + type Tag = { + id?: number; + name?: string; + }; + + type updatePetWithFormParams = { + /** ID of pet that needs to be updated */ + petId: number; + }; + + type updateUserParams = { + /** name that need to be updated */ + username: string; + }; + + type uploadFileParams = { + /** ID of pet to update */ + petId: number; + }; + + type User = { + id?: number; + username?: string; + firstName?: string; + lastName?: string; + email?: string; + password?: string; + phone?: string; + /** User Status */ + userStatus?: number; + }; +} diff --git a/src/services/swagger/user.ts b/src/services/swagger/user.ts new file mode 100644 index 0000000..4dd6f42 --- /dev/null +++ b/src/services/swagger/user.ts @@ -0,0 +1,100 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** Create user This can only be done by the logged in user. POST /user */ +export async function createUser(body: API.User, options?: { [key: string]: any }) { + return request<any>('/user', { + method: 'POST', + data: body, + ...(options || {}), + }); +} + +/** Get user by user name GET /user/${param0} */ +export async function getUserByName( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getUserByNameParams, + options?: { [key: string]: any }, +) { + const { username: param0, ...queryParams } = params; + return request<API.User>(`/user/${param0}`, { + method: 'GET', + params: { ...queryParams }, + ...(options || {}), + }); +} + +/** Updated user This can only be done by the logged in user. PUT /user/${param0} */ +export async function updateUser( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.updateUserParams, + body: API.User, + options?: { [key: string]: any }, +) { + const { username: param0, ...queryParams } = params; + return request<any>(`/user/${param0}`, { + method: 'PUT', + params: { ...queryParams }, + data: body, + ...(options || {}), + }); +} + +/** Delete user This can only be done by the logged in user. DELETE /user/${param0} */ +export async function deleteUser( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.deleteUserParams, + options?: { [key: string]: any }, +) { + const { username: param0, ...queryParams } = params; + return request<any>(`/user/${param0}`, { + method: 'DELETE', + params: { ...queryParams }, + ...(options || {}), + }); +} + +/** Creates list of users with given input array POST /user/createWithArray */ +export async function createUsersWithArrayInput( + body: API.User[], + options?: { [key: string]: any }, +) { + return request<any>('/user/createWithArray', { + method: 'POST', + data: body, + ...(options || {}), + }); +} + +/** Creates list of users with given input array POST /user/createWithList */ +export async function createUsersWithListInput(body: API.User[], options?: { [key: string]: any }) { + return request<any>('/user/createWithList', { + method: 'POST', + data: body, + ...(options || {}), + }); +} + +/** Logs user into the system GET /user/login */ +export async function loginUser( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.loginUserParams, + options?: { [key: string]: any }, +) { + return request<string>('/user/login', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} + +/** Logs out current logged in user session GET /user/logout */ +export async function logoutUser(options?: { [key: string]: any }) { + return request<any>('/user/logout', { + method: 'GET', + ...(options || {}), + }); +} diff --git a/src/services/system/Api.ts b/src/services/system/Api.ts new file mode 100644 index 0000000..d1e2e04 --- /dev/null +++ b/src/services/system/Api.ts @@ -0,0 +1,108 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础api POST /api/createApi */ +export async function postApiCreateApi(body: API.Api, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/api/createApi`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除api DELETE /api/deleteApi */ +export async function deleteApiDeleteApi(body: API.Api, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/api/deleteApi`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中Api DELETE /api/deleteApisByIds */ +export async function deleteApiDeleteApisByIds(body: API.IdsReq, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/api/deleteApisByIds`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 刷新casbin缓存 GET /api/freshCasbin */ +export async function getApiFreshCasbin(options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/api/freshCasbin`, { + method: 'GET', + ...(options || {}), + }); +} + +/** 获取所有的Api 不分页 POST /api/getAllApis */ +export async function postApiGetAllApis(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.SysAPIListResponse; msg?: string }>( + `/api/v1/api/getAllApis`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 获取所有的Api 不分页 POST /api/getAllApisByGroup */ +export async function postApiGetAllApisByGroup(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.SysAPIByGroupResponse; msg?: string }>( + `/api/v1/api/getAllApisByGroup`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 根据id获取api POST /api/getApiById */ +export async function postApiGetApiById(body: API.GetById, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.SysAPIResponse }>(`/api/v1/api/getApiById`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 分页获取API列表 POST /api/getApiList */ +export async function postApiGetApiList( + body: API.SearchApiParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/v1/api/getApiList`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 修改基础api PUT /api/updateApi */ +export async function putApiUpdateApi(body: API.Api, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/api/updateApi`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/Base.ts b/src/services/system/Base.ts new file mode 100644 index 0000000..c9cef6c --- /dev/null +++ b/src/services/system/Base.ts @@ -0,0 +1,26 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 生成验证码 POST /base/captcha */ +export async function postBaseCaptcha(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.SysCaptchaResponse; msg?: string }>( + `/api/v1/base/captcha`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 用户登录 POST /base/login */ +export async function postBaseLogin(body: API.Login, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.LoginResponse; msg?: string }>(`/api/v1/base/login`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/Casbin.ts b/src/services/system/Casbin.ts new file mode 100644 index 0000000..3583653 --- /dev/null +++ b/src/services/system/Casbin.ts @@ -0,0 +1,36 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 获取权限列表 POST /casbin/getPolicyPathByRoleId */ +export async function postCasbinGetPolicyPathByRoleId( + body: API.CasbinInReceive, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PolicyPathResponse; msg?: string }>( + `/api/v1/casbin/getPolicyPathByRoleId`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 更新角色api权限 POST /casbin/UpdateCasbin */ +export async function postCasbinUpdateCasbin( + body: API.CasbinInReceive, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/casbin/UpdateCasbin`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/CheckDB.ts b/src/services/system/CheckDB.ts new file mode 100644 index 0000000..5b81e97 --- /dev/null +++ b/src/services/system/CheckDB.ts @@ -0,0 +1,14 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 初始化用户数据库 POST /init/checkdb */ +export async function postInitCheckdb(options?: { [key: string]: any }) { + return request<API.Response & { data?: Record<string, any>; msg?: string }>( + `/api/v1/init/checkdb`, + { + method: 'POST', + ...(options || {}), + }, + ); +} diff --git a/src/services/system/Department.ts b/src/services/system/Department.ts new file mode 100644 index 0000000..22aa036 --- /dev/null +++ b/src/services/system/Department.ts @@ -0,0 +1,139 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础department POST /department/createDepartment */ +export async function postDepartmentCreateDepartment( + body: API.Department, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/department/createDepartment`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除department DELETE /department/deleteDepartment */ +export async function deleteDepartmentDeleteDepartment( + body: API.Department, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/department/deleteDepartment`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中Department DELETE /department/deleteDepartmentsByIds */ +export async function deleteDepartmentDeleteDepartmentsByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/department/deleteDepartmentsByIds`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据id获取department POST /department/getDepartmentById */ +export async function postDepartmentGetDepartmentById( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.DepartmentResponse }>( + `/api/v1/department/getDepartmentById`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取角色列表 POST /department/getDepartmentFkSelect */ +export async function postDepartmentGetDepartmentFkSelect(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/department/getDepartmentFkSelect`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 分页获取Department列表 POST /department/getDepartmentList */ +export async function postDepartmentGetDepartmentList( + body: API.PageInfo, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/department/getDepartmentList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得名称列表 POST /department/getDepartmentNames */ +export async function postDepartmentGetDepartmentNames( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/department/getDepartmentNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取部门树 POST /department/getDepartmentTree */ +export async function postDepartmentGetDepartmentTree(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.TreeResponse; msg?: string }>( + `/api/v1/department/getDepartmentTree`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 修改基础department PUT /department/updateDepartment */ +export async function putDepartmentUpdateDepartment( + body: API.Department, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/department/updateDepartment`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/Dictionary.ts b/src/services/system/Dictionary.ts new file mode 100644 index 0000000..cae1e8d --- /dev/null +++ b/src/services/system/Dictionary.ts @@ -0,0 +1,84 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建Dictionary POST /sysDictionary/createDictionary */ +export async function postSysDictionaryCreateDictionary( + body: API.Dictionary, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/sysDictionary/createDictionary`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除Dictionary DELETE /sysDictionary/deleteDictionary */ +export async function deleteSysDictionaryDeleteDictionary( + body: API.Dictionary, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/sysDictionary/deleteDictionary`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 用id查询Dictionary GET /sysDictionary/findDictionary */ +export async function getSysDictionaryFindDictionary( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getSysDictionaryFindDictionaryParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: Record<string, any>; msg?: string }>( + `/api/v1/sysDictionary/findDictionary`, + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** 分页获取Dictionary列表 GET /sysDictionary/getDictionaryList */ +export async function getSysDictionaryGetDictionaryList( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getSysDictionaryGetDictionaryListParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/sysDictionary/getDictionaryList`, + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** 更新Dictionary PUT /sysDictionary/updateDictionary */ +export async function putSysDictionaryUpdateDictionary( + body: API.Dictionary, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/sysDictionary/updateDictionary`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/DictionaryDetail.ts b/src/services/system/DictionaryDetail.ts new file mode 100644 index 0000000..0c3b13e --- /dev/null +++ b/src/services/system/DictionaryDetail.ts @@ -0,0 +1,93 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建DictionaryDetail POST /sysDictionaryDetail/createDictionaryDetail */ +export async function postSysDictionaryDetailCreateDictionaryDetail( + body: API.DictionaryDetail, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/sysDictionaryDetail/createDictionaryDetail`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 删除DictionaryDetail DELETE /sysDictionaryDetail/deleteDictionaryDetail */ +export async function deleteSysDictionaryDetailDeleteDictionaryDetail( + body: API.DictionaryDetail, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/sysDictionaryDetail/deleteDictionaryDetail`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 用id查询DictionaryDetail GET /sysDictionaryDetail/findDictionaryDetail */ +export async function getSysDictionaryDetailFindDictionaryDetail( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getSysDictionaryDetailFindDictionaryDetailParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: Record<string, any>; msg?: string }>( + `/api/v1/sysDictionaryDetail/findDictionaryDetail`, + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** 分页获取DictionaryDetail列表 GET /sysDictionaryDetail/getDictionaryDetailList */ +export async function getSysDictionaryDetailGetDictionaryDetailList( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getSysDictionaryDetailGetDictionaryDetailListParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/sysDictionaryDetail/getDictionaryDetailList`, + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** 更新DictionaryDetail PUT /sysDictionaryDetail/updateDictionaryDetail */ +export async function putSysDictionaryDetailUpdateDictionaryDetail( + body: API.DictionaryDetail, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/sysDictionaryDetail/updateDictionaryDetail`, + { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} diff --git a/src/services/system/File.ts b/src/services/system/File.ts new file mode 100644 index 0000000..bd5c60e --- /dev/null +++ b/src/services/system/File.ts @@ -0,0 +1,68 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 获取文件路径 POST /file/getFileById */ +export async function postFileGetFileById(body: API.GetById, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.FileResponse }>(`/api/v1/file/getFileById`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 上传照片 POST /file/uploadImage */ +export async function postFileUploadImage(body: {}, file?: File, options?: { [key: string]: any }) { + const formData = new FormData(); + + if (file) { + formData.append('file', file); + } + + Object.keys(body).forEach((ele) => { + const item = (body as any)[ele]; + + if (item !== undefined && item !== null) { + formData.append( + ele, + typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item, + ); + } + }); + + return request<API.Response & { data?: API.File; msg?: string }>(`/api/v1/file/uploadImage`, { + method: 'POST', + data: formData, + requestType: 'form', + ...(options || {}), + }); +} + +export async function postFileUploadFile(body: {}, file?: File, options?: { [key: string]: any }) { + const formData = new FormData(); + + if (file) { + formData.append('file', file); + } + + Object.keys(body).forEach((ele) => { + const item = (body as any)[ele]; + + if (item !== undefined && item !== null) { + formData.append( + ele, + typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item, + ); + } + }); + + return request<API.Response & { data?: API.File; msg?: string }>(`/api/v1/file/uploadFile`, { + method: 'POST', + data: formData, + requestType: 'form', + ...(options || {}), + }); +} diff --git a/src/services/system/InitDB.ts b/src/services/system/InitDB.ts new file mode 100644 index 0000000..bb8a1e0 --- /dev/null +++ b/src/services/system/InitDB.ts @@ -0,0 +1,15 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 初始化用户数据库 POST /init/initdb */ +export async function postInitInitdb(body: API.InitDB, options?: { [key: string]: any }) { + return request<API.Response & { data?: string }>(`/api/v1/init/initdb`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/Jwt.ts b/src/services/system/Jwt.ts new file mode 100644 index 0000000..fb6d804 --- /dev/null +++ b/src/services/system/Jwt.ts @@ -0,0 +1,11 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** jwt加入黑名单 POST /jwt/jsonInBlacklist */ +export async function postJwtJsonInBlacklist(options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/jwt/jsonInBlacklist`, { + method: 'POST', + ...(options || {}), + }); +} diff --git a/src/services/system/Menu.ts b/src/services/system/Menu.ts new file mode 100644 index 0000000..3f92a06 --- /dev/null +++ b/src/services/system/Menu.ts @@ -0,0 +1,76 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 新增菜单 POST /menu/createMenu */ +export async function postMenuCreateMenu(body: API.Menu, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/menu/createMenu`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除菜单 DELETE /menu/deleteMenu */ +export async function deleteMenuDeleteMenu(body: API.GetById, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/menu/deleteMenu`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取用户动态路由 POST /menu/getMenu */ +export async function postMenuGetMenu(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.RoutesResponse; msg?: string }>( + `/api/v1/menu/getMenu`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 分页获取基础menu列表 POST /menu/getMenuList */ +export async function postMenuGetMenuList(body: API.PageInfo, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/menu/getMenuList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取用户菜单树 POST /menu/getMenuTree */ +export async function postMenuGetMenuTree(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.TreeResponse; msg?: string }>( + `/api/v1/menu/getMenuTree`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 更新菜单 PUT /menu/updateMenu */ +export async function putMenuUpdateMenu(body: API.Menu, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/menu/updateMenu`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/OperationRecord.ts b/src/services/system/OperationRecord.ts new file mode 100644 index 0000000..60cab5a --- /dev/null +++ b/src/services/system/OperationRecord.ts @@ -0,0 +1,93 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建OperationRecord POST /sysOperationRecord/createOperationRecord */ +export async function postSysOperationRecordCreateOperationRecord( + body: API.OperationRecord, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/sysOperationRecord/createOperationRecord`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 删除OperationRecord DELETE /sysOperationRecord/deleteOperationRecord */ +export async function deleteSysOperationRecordDeleteOperationRecord( + body: API.OperationRecord, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/sysOperationRecord/deleteOperationRecord`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 批量删除OperationRecord DELETE /sysOperationRecord/deleteOperationRecordByIds */ +export async function deleteSysOperationRecordDeleteOperationRecordByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>( + `/api/v1/sysOperationRecord/deleteOperationRecordByIds`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 用id查询OperationRecord GET /sysOperationRecord/findOperationRecord */ +export async function getSysOperationRecordFindOperationRecord( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getSysOperationRecordFindOperationRecordParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: Record<string, any>; msg?: string }>( + `/api/v1/sysOperationRecord/findOperationRecord`, + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** 分页获取OperationRecord列表 GET /sysOperationRecord/getOperationRecordList */ +export async function getSysOperationRecordGetOperationRecordList( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.getSysOperationRecordGetOperationRecordListParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/sysOperationRecord/getOperationRecordList`, + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} diff --git a/src/services/system/Post.ts b/src/services/system/Post.ts new file mode 100644 index 0000000..7fc5e52 --- /dev/null +++ b/src/services/system/Post.ts @@ -0,0 +1,117 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建基础post POST /post/createPost */ +export async function postPostCreatePost(body: API.Post, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/post/createPost`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除post DELETE /post/deletePost */ +export async function deletePostDeletePost(body: API.Post, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/post/deletePost`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除选中Post DELETE /post/deletePostsByIds */ +export async function deletePostDeletePostsByIds( + body: API.IdsReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/post/deletePostsByIds`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 根据id获取post POST /post/getPostById */ +export async function postPostGetPostById(body: API.GetById, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.PostResponse }>(`/api/v1/post/getPostById`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 分页获取角色列表 POST /post/getPostFkSelect */ +export async function postPostGetPostFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/post/getPostFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取Post列表 POST /post/getPostList */ +export async function postPostGetPostList( + body: API.SearchPostParams, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/post/getPostList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获得名称列表 POST /post/getPostNames */ +export async function postPostGetPostNames(body: API.IdsReq, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.NamesResult; msg?: string }>( + `/api/v1/post/getPostNames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 修改基础post PUT /post/updatePost */ +export async function putPostUpdatePost(body: API.Post, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/post/updatePost`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/Role.ts b/src/services/system/Role.ts new file mode 100644 index 0000000..5d97cab --- /dev/null +++ b/src/services/system/Role.ts @@ -0,0 +1,99 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 创建角色 POST /role/createRole */ +export async function postRoleCreateRole(body: API.Role, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.RoleResponse; msg?: string }>( + `/api/v1/role/createRole`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取角色列表 POST /role/getRoleFkSelect */ +export async function postRoleGetRoleFkSelect( + body: API.GetFkSelect, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.FkResult; msg?: string }>( + `/api/v1/role/getRoleFkSelect`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 分页获取角色列表 POST /role/getRoleList */ +export async function postRoleGetRoleList(body: API.PageInfo, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/role/getRoleList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 获取角色权限 POST /role/getRolePermission */ +export async function postRoleGetRolePermission( + body: API.GetById, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: API.RolePermissionResponse }>( + `/api/v1/role/getRolePermission`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 更新角色信息 PUT /role/updateRole */ +export async function putRoleUpdateRole(body: API.Role, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.RoleResponse; msg?: string }>( + `/api/v1/role/updateRole`, + { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 更新角色权限 PUT /role/updateRolePermission */ +export async function putRoleUpdateRolePermission( + body: API.UpdateRolePermissionParams, + options?: { [key: string]: any }, +) { + return request<any>(`/api/v1/role/updateRolePermission`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/System.ts b/src/services/system/System.ts new file mode 100644 index 0000000..314b898 --- /dev/null +++ b/src/services/system/System.ts @@ -0,0 +1,48 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 获取服务器信息 POST /system/getServerInfo */ +export async function postSystemGetServerInfo(options?: { [key: string]: any }) { + return request<API.Response & { data?: Record<string, any>; msg?: string }>( + `/api/v1/system/getServerInfo`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 获取配置文件内容 POST /system/getSystemConfig */ +export async function postSystemGetSystemConfig(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.SysConfigResponse; msg?: string }>( + `/api/v1/system/getSystemConfig`, + { + method: 'POST', + ...(options || {}), + }, + ); +} + +/** 重启系统 POST /system/reloadSystem */ +export async function postSystemReloadSystem(options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/system/reloadSystem`, { + method: 'POST', + ...(options || {}), + }); +} + +/** 设置配置文件内容 POST /system/setSystemConfig */ +export async function postSystemSetSystemConfig( + body: API.System, + options?: { [key: string]: any }, +) { + return request<API.Response & { data?: string }>(`/api/v1/system/setSystemConfig`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/User.ts b/src/services/system/User.ts new file mode 100644 index 0000000..12c79b6 --- /dev/null +++ b/src/services/system/User.ts @@ -0,0 +1,137 @@ +// @ts-ignore +/* eslint-disable */ +import { request } from '@umijs/max'; + +/** 用户注册账号 POST /user/admin_register */ +export async function postUserAdminRegister(body: API.Register, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.UserResponse; msg?: string }>( + `/api/v1/user/admin_register`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 用户修改密码 POST /user/changePassword */ +export async function postUserChangePassword( + body: API.ChangePasswordReq, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/user/changePassword`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 删除用户 DELETE /user/deleteUser */ +export async function deleteUserDeleteUser(body: API.GetById, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/user/deleteUser`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取用户信息 GET /user/getUserInfo */ +export async function getUserGetUserInfo(options?: { [key: string]: any }) { + return request<API.Response & { data?: API.UserView; msg?: string }>(`/api/v1/user/getUserInfo`, { + method: 'GET', + ...(options || {}), + }); +} + +/** 分页获取用户列表 POST /user/getUserList */ +export async function postUserGetUserList(body: API.PageInfo, options?: { [key: string]: any }) { + return request<API.Response & { data?: API.PageResult; msg?: string }>( + `/api/v1/user/getUserList`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 重置用户密码 POST /user/resetPassword */ +export async function postUserResetPassword(body: API.User, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/user/resetPassword`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 设置用户信息 PUT /user/SetSelfInfo */ +export async function putUserSetSelfInfo(body: API.User, options?: { [key: string]: any }) { + return request<API.Response & { data?: Record<string, any>; msg?: string }>( + `/api/v1/user/SetSelfInfo`, + { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 设置用户信息 PUT /user/setUserInfo */ +export async function putUserSetUserInfo(body: API.User, options?: { [key: string]: any }) { + return request<API.Response & { data?: Record<string, any>; msg?: string }>( + `/api/v1/user/setUserInfo`, + { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }, + ); +} + +/** 更改用户权限 POST /user/setUserRole */ +export async function postUserSetUserRole(body: API.SetUserRole, options?: { [key: string]: any }) { + return request<API.Response & { msg?: string }>(`/api/v1/user/setUserRole`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 设置用户权限 POST /user/setUserRoles */ +export async function postUserSetUserRoles( + body: API.SetUserRoles, + options?: { [key: string]: any }, +) { + return request<API.Response & { msg?: string }>(`/api/v1/user/setUserRoles`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/services/system/index.ts b/src/services/system/index.ts new file mode 100644 index 0000000..fce1532 --- /dev/null +++ b/src/services/system/index.ts @@ -0,0 +1,38 @@ +// @ts-ignore +/* eslint-disable */ +// API 更新时间: +// API 唯一标识: +import * as Api from './Api'; +import * as Base from './Base'; +import * as Casbin from './Casbin'; +import * as CheckDB from './CheckDB'; +import * as Department from './Department'; +import * as Dictionary from './Dictionary'; +import * as DictionaryDetail from './DictionaryDetail'; +import * as File from './File'; +import * as InitDB from './InitDB'; +import * as Jwt from './Jwt'; +import * as Menu from './Menu'; +import * as OperationRecord from './OperationRecord'; +import * as Post from './Post'; +import * as Role from './Role'; +import * as System from './System'; +import * as User from './User'; +export default { + Api, + Base, + Casbin, + Department, + File, + CheckDB, + InitDB, + Jwt, + Menu, + Post, + Role, + Dictionary, + DictionaryDetail, + OperationRecord, + System, + User, +}; diff --git a/src/services/system/typings.d.ts b/src/services/system/typings.d.ts new file mode 100644 index 0000000..37ecef7 --- /dev/null +++ b/src/services/system/typings.d.ts @@ -0,0 +1,1028 @@ +declare namespace API { + type AliyunOSS = { + 'access-key-id'?: string; + 'access-key-secret'?: string; + 'base-path'?: string; + 'bucket-name'?: string; + 'bucket-url'?: string; + endpoint?: string; + }; + + type Api = { + /** api组 */ + apiGroup?: string; + createTime?: string; + /** api中文描述 */ + description?: string; + id?: number; + /** 方法:创建POST(默认)|查看GET|更新PUT|删除DELETE */ + method?: string; + /** api路径 */ + path?: string; + updateTime?: string; + }; + + type ApiGroup = { + checkable?: boolean; + children?: ApiGroupSon[]; + key?: string; + title?: string; + }; + + type ApiGroupSon = { + key?: number; + title?: string; + }; + + type Autocode = { + root?: string; + server?: string; + 'server-api'?: string; + 'server-initialize'?: string; + 'server-model'?: string; + 'server-plug'?: string; + 'server-request'?: string; + 'server-router'?: string; + 'server-service'?: string; + 'transfer-restart'?: boolean; + web?: string; + 'web-api'?: string; + 'web-form'?: string; + 'web-table'?: string; + }; + + type AwsS3 = { + 'base-url'?: string; + bucket?: string; + 'disable-ssl'?: boolean; + endpoint?: string; + 'path-prefix'?: string; + region?: string; + 's3-force-path-style'?: boolean; + 'secret-id'?: string; + 'secret-key'?: string; + }; + + type Captcha = { + /** 验证码高度 */ + 'img-height'?: number; + /** 验证码宽度 */ + 'img-width'?: number; + /** 验证码长度 */ + 'key-long'?: number; + /** 防爆破验证码开启此数,0代表每次登录都需要验证码,其他数字代表错误密码此数,如3代表错误三次后出现验证码 */ + 'open-captcha'?: number; + /** 防爆破验证码超时时间,单位:s(秒) */ + 'open-captcha-timeout'?: number; + }; + + type CasbinInfo = { + /** 方法 */ + method?: string; + /** 路径 */ + path?: string; + }; + + type CasbinInReceive = { + casbinInfos?: CasbinInfo[]; + /** 权限id */ + roleId?: number; + }; + + type ChangePasswordReq = { + /** 新密码 */ + newPassword?: string; + /** 密码 */ + password?: string; + }; + + type CORS = { + mode?: string; + whitelist?: CORSWhitelist[]; + }; + + type CORSWhitelist = { + 'allow-credentials'?: boolean; + 'allow-headers'?: string; + 'allow-methods'?: string; + 'allow-origin'?: string; + 'expose-headers'?: string; + }; + + type Department = { + children?: Department[]; + code?: string; + createTime?: string; + email?: string; + id?: number; + /** userId */ + leader?: string; + name?: string; + parentId?: number; + path?: string; + phone?: string; + remark?: string; + sort?: number; + /** 状态 */ + status?: boolean; + updateTime?: string; + }; + + type DepartmentResponse = { + department?: Department; + }; + + type Detail = { + /** 需要比较时间的字段 */ + compareField?: string; + /** 时间间隔 */ + interval?: string; + /** 需要清理的表名 */ + tableName?: string; + }; + + type Dictionary = { + createTime?: string; + /** 描述 */ + desc?: string; + id?: number; + /** 字典名(中) */ + name?: string; + /** 状态 */ + status?: boolean; + sysDictionaryDetails?: DictionaryDetail[]; + /** 字典名(英) */ + type?: string; + updateTime?: string; + }; + + type DictionaryDetail = { + createTime?: string; + id?: number; + /** 展示值 */ + label?: string; + /** 排序标记 */ + sort?: number; + /** 启用状态 */ + status?: boolean; + /** 关联标记 */ + sysDictionaryID?: number; + updateTime?: string; + /** 字典值 */ + value?: number; + }; + + type Email = { + /** 收件人 */ + from?: string; + /** 服务器地址 */ + host?: string; + /** 是否SSL */ + 'is-ssl'?: boolean; + /** 昵称 */ + nickname?: string; + /** 端口 */ + port?: number; + /** 密钥 */ + secret?: string; + /** 收件人:多个以英文逗号分隔 */ + to?: string; + }; + + type Excel = { + dir?: string; + }; + + type File = { + createTime?: string; + id?: number; + /** 文件名 */ + name?: string; + path?: string; + /** 文件标签 */ + tag?: string; + updateTime?: string; + }; + + type FileResponse = { + file?: File; + }; + + type FkResult = { + list?: any; + }; + + type GetById = { + /** 主键ID */ + id?: number; + }; + + type GetFkSelect = { + /** 关键字 */ + keyword?: string; + }; + + type getSysDictionaryDetailFindDictionaryDetailParams = { + createTime?: string; + id?: number; + /** 展示值 */ + label?: string; + /** 排序标记 */ + sort?: number; + /** 启用状态 */ + status?: boolean; + /** 关联标记 */ + sysDictionaryID?: number; + updateTime?: string; + /** 字典值 */ + value?: number; + }; + + type getSysDictionaryDetailGetDictionaryDetailListParams = { + createTime?: string; + id?: number; + /** 关键字 */ + keyword?: string; + /** 展示值 */ + label?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + /** 排序标记 */ + sort?: number; + /** 启用状态 */ + status?: boolean; + /** 关联标记 */ + sysDictionaryID?: number; + updateTime?: string; + /** 字典值 */ + value?: number; + }; + + type getSysDictionaryFindDictionaryParams = { + createTime?: string; + /** 描述 */ + desc?: string; + id?: number; + /** 字典名(中) */ + name?: string; + /** 状态 */ + status?: boolean; + /** 字典名(英) */ + type?: string; + updateTime?: string; + }; + + type getSysDictionaryGetDictionaryListParams = { + createTime?: string; + /** 描述 */ + desc?: string; + id?: number; + /** 关键字 */ + keyword?: string; + /** 字典名(中) */ + name?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + /** 状态 */ + status?: boolean; + /** 字典名(英) */ + type?: string; + updateTime?: string; + }; + + type getSysOperationRecordFindOperationRecordParams = { + /** 代理 */ + agent?: string; + /** 请求Body */ + body?: string; + createTime?: string; + /** 错误信息 */ + error_message?: string; + id?: number; + /** 请求ip */ + ip?: string; + /** 延迟 */ + latency?: string; + /** 请求方法 */ + method?: string; + /** 请求路径 */ + path?: string; + /** 响应Body */ + resp?: string; + /** 请求状态 */ + status?: number; + updateTime?: string; + /** 用户id */ + user_id?: number; + }; + + type getSysOperationRecordGetOperationRecordListParams = { + /** 代理 */ + agent?: string; + /** 请求Body */ + body?: string; + createTime?: string; + /** 错误信息 */ + error_message?: string; + id?: number; + /** 请求ip */ + ip?: string; + /** 关键字 */ + keyword?: string; + /** 延迟 */ + latency?: string; + /** 请求方法 */ + method?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + /** 请求路径 */ + path?: string; + /** 响应Body */ + resp?: string; + /** 请求状态 */ + status?: number; + updateTime?: string; + /** 用户id */ + user_id?: number; + }; + + type HuaWeiObs = { + 'access-key'?: string; + bucket?: string; + endpoint?: string; + path?: string; + 'secret-key'?: string; + }; + + type IdsReq = { + ids?: number[]; + }; + + type InitDB = { + /** 数据库名 */ + dbName: string; + /** 数据库类型 */ + dbType?: string; + /** 服务器地址 */ + host?: string; + /** DB initial langauge // added by mohamed hassan to support multilanguage */ + language?: string; + /** 数据库密码 */ + password?: string; + /** 数据库连接端口 */ + port?: string; + /** 数据库用户名 */ + userName: string; + }; + + type JWT = { + /** 缓冲时间 */ + 'buffer-time'?: string; + /** 过期时间 */ + 'expires-time'?: string; + /** 签发者 */ + issuer?: string; + /** jwt签名 */ + 'signing-key'?: string; + }; + + type Language = { + dir?: string; + language?: string; + }; + + type Local = { + /** 本地文件访问路径 */ + path?: string; + /** 本地文件存储路径 */ + 'store-path'?: string; + }; + + type Login = { + captcha?: string; + captchaId?: string; + password?: string; + username?: string; + }; + + type LoginResponse = { + expiresAt?: number; + token?: string; + user?: User; + }; + + type Menu = { + children?: Menu[]; + component?: string; + createTime?: string; + externalLink?: string; + hidden?: boolean; + icon?: string; + id?: number; + key?: string; + /** 路由name */ + name?: string; + parentId?: number; + path?: string; + permission?: string; + /** 备注 */ + remark?: string; + sort?: number; + title?: string; + /** 菜单类型(M目录 C菜单 F按钮) */ + type?: string; + updateTime?: string; + }; + + type Mssql = { + /** 高级配置 */ + config?: string; + /** 数据库名 */ + 'db-name'?: string; + /** 数据库引擎,默认InnoDB */ + engine?: string; + /** 是否开启Gorm全局日志 */ + 'log-mode'?: string; + /** 是否通过zap写入日志文件 */ + 'log-zap'?: boolean; + /** 空闲中的最大连接数 */ + 'max-idle-conns'?: number; + /** 打开到数据库的最大连接数 */ + 'max-open-conns'?: number; + /** 数据库密码 */ + password?: string; + /** 服务器地址:端口 */ + path?: string; + /** :端口 */ + port?: string; + /** 全局表前缀,单独定义TableName则不生效 */ + prefix?: string; + /** 是否开启全局禁用复数,true表示开启 */ + singular?: boolean; + /** 数据库用户名 */ + username?: string; + }; + + type Mysql = { + /** 高级配置 */ + config?: string; + /** 数据库名 */ + 'db-name'?: string; + /** 数据库引擎,默认InnoDB */ + engine?: string; + /** 是否开启Gorm全局日志 */ + 'log-mode'?: string; + /** 是否通过zap写入日志文件 */ + 'log-zap'?: boolean; + /** 空闲中的最大连接数 */ + 'max-idle-conns'?: number; + /** 打开到数据库的最大连接数 */ + 'max-open-conns'?: number; + /** 数据库密码 */ + password?: string; + /** 服务器地址:端口 */ + path?: string; + /** :端口 */ + port?: string; + /** 全局表前缀,单独定义TableName则不生效 */ + prefix?: string; + /** 是否开启全局禁用复数,true表示开启 */ + singular?: boolean; + /** 数据库用户名 */ + username?: string; + }; + + type NamesResult = { + list?: any; + }; + + type OperationRecord = { + /** 代理 */ + agent?: string; + /** 请求Body */ + body?: string; + createTime?: string; + /** 错误信息 */ + error_message?: string; + id?: number; + /** 请求ip */ + ip?: string; + /** 延迟 */ + latency?: string; + /** 请求方法 */ + method?: string; + /** 请求路径 */ + path?: string; + /** 响应Body */ + resp?: string; + /** 请求状态 */ + status?: number; + updateTime?: string; + /** 用户id */ + user_id?: number; + }; + + type Oracle = { + /** 高级配置 */ + config?: string; + /** 数据库名 */ + 'db-name'?: string; + /** 数据库引擎,默认InnoDB */ + engine?: string; + /** 是否开启Gorm全局日志 */ + 'log-mode'?: string; + /** 是否通过zap写入日志文件 */ + 'log-zap'?: boolean; + /** 空闲中的最大连接数 */ + 'max-idle-conns'?: number; + /** 打开到数据库的最大连接数 */ + 'max-open-conns'?: number; + /** 数据库密码 */ + password?: string; + /** 服务器地址:端口 */ + path?: string; + /** :端口 */ + port?: string; + /** 全局表前缀,单独定义TableName则不生效 */ + prefix?: string; + /** 是否开启全局禁用复数,true表示开启 */ + singular?: boolean; + /** 数据库用户名 */ + username?: string; + }; + + type PageInfo = { + /** 关键字 */ + keyword?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + }; + + type PageResult = { + list?: any; + page?: number; + pageSize?: number; + total?: number; + }; + + type Pgsql = { + /** 高级配置 */ + config?: string; + /** 数据库名 */ + 'db-name'?: string; + /** 数据库引擎,默认InnoDB */ + engine?: string; + /** 是否开启Gorm全局日志 */ + 'log-mode'?: string; + /** 是否通过zap写入日志文件 */ + 'log-zap'?: boolean; + /** 空闲中的最大连接数 */ + 'max-idle-conns'?: number; + /** 打开到数据库的最大连接数 */ + 'max-open-conns'?: number; + /** 数据库密码 */ + password?: string; + /** 服务器地址:端口 */ + path?: string; + /** :端口 */ + port?: string; + /** 全局表前缀,单独定义TableName则不生效 */ + prefix?: string; + /** 是否开启全局禁用复数,true表示开启 */ + singular?: boolean; + /** 数据库用户名 */ + username?: string; + }; + + type PolicyPathResponse = { + paths?: CasbinInfo[]; + }; + + type Post = { + code?: string; + createTime?: string; + id?: number; + name?: string; + remark?: string; + sort?: number; + /** 状态 */ + status?: boolean; + updateTime?: string; + }; + + type PostResponse = { + post?: Post; + }; + + type Qiniu = { + /** 秘钥AK */ + 'access-key'?: string; + /** 空间名称 */ + bucket?: string; + /** CDN加速域名 */ + 'img-path'?: string; + /** 秘钥SK */ + 'secret-key'?: string; + /** 上传是否使用CDN上传加速 */ + 'use-cdn-domains'?: boolean; + /** 是否使用https */ + 'use-https'?: boolean; + /** 存储区域 */ + zone?: string; + }; + + type Redis = { + /** 服务器地址:端口 */ + addr?: string; + /** redis的哪个数据库 */ + db?: number; + /** 密码 */ + password?: string; + }; + + type Register = { + avatarId?: number; + deptId?: number; + email?: string; + enable?: boolean; + nickName?: string; + passWord?: string; + phone?: string; + postId?: number; + /** 多岗位 */ + postIds?: string; + roleId?: number; + /** 多角色 */ + roleIds?: string; + userName?: string; + }; + + type Response = { + code?: number; + data?: any; + msg?: string; + success?: boolean; + }; + + type Role = { + apiIds?: string; + code?: string; + createTime?: string; + dataScope?: string; + deptIds?: string; + id?: number; + menuIds?: string; + name?: string; + remark?: string; + sort?: number; + /** 状态 */ + status?: boolean; + updateTime?: string; + }; + + type RolePermissionResponse = { + apiIds?: number[]; + dataScope?: string; + deptIds?: number[]; + menuIds?: number[]; + roleId?: number; + }; + + type RoleResponse = { + role?: Role; + }; + + type RoleSelectResponse = { + label?: string; + value?: number; + }; + + type Route = { + access?: string; + component?: string; + icon?: string; + key?: string; + name?: string; + path?: string; + routes?: Route[]; + }; + + type RoutesResponse = { + routes?: Route[]; + }; + + type SearchApiParams = { + /** api组 */ + apiGroup?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + /** api中文描述 */ + description?: string; + id?: number; + /** 关键字 */ + keyword?: string; + /** 方法:创建POST(默认)|查看GET|更新PUT|删除DELETE */ + method?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + /** api路径 */ + path?: string; + updateTime?: string; + }; + + type SearchPostParams = { + code?: string; + createTime?: string; + /** 排序方式:升序false(默认)|降序true */ + desc?: boolean; + id?: number; + /** 关键字 */ + keyword?: string; + name?: string; + /** 排序 */ + orderKey?: string; + /** 页码 */ + page?: number; + /** 每页大小 */ + pageSize?: number; + remark?: string; + sort?: number; + /** 状态 */ + status?: boolean; + updateTime?: string; + }; + + type Server = { + 'aliyun-oss'?: AliyunOSS; + /** auto */ + autocode?: Autocode; + 'aws-s3'?: AwsS3; + captcha?: Captcha; + /** 跨域配置 */ + cors?: CORS; + 'db-list'?: SpecializedDB[]; + email?: Email; + excel?: Excel; + 'hua-wei-obs'?: HuaWeiObs; + jwt?: JWT; + language?: Language; + /** oss */ + local?: Local; + mssql?: Mssql; + /** gorm */ + mysql?: Mysql; + oracle?: Oracle; + pgsql?: Pgsql; + qiniu?: Qiniu; + redis?: Redis; + sqlite?: Sqlite; + system?: System; + 'tencent-cos'?: TencentCOS; + timer?: Timer; + zap?: Zap; + }; + + type SetUserRole = { + /** 角色ID */ + roleId?: number; + }; + + type SetUserRoles = { + id?: number; + /** 角色ID */ + roleIds?: number[]; + }; + + type SpecializedDB = { + 'alias-name'?: string; + /** 高级配置 */ + config?: string; + /** 数据库名 */ + 'db-name'?: string; + disable?: boolean; + /** 数据库引擎,默认InnoDB */ + engine?: string; + /** 是否开启Gorm全局日志 */ + 'log-mode'?: string; + /** 是否通过zap写入日志文件 */ + 'log-zap'?: boolean; + /** 空闲中的最大连接数 */ + 'max-idle-conns'?: number; + /** 打开到数据库的最大连接数 */ + 'max-open-conns'?: number; + /** 数据库密码 */ + password?: string; + /** 服务器地址:端口 */ + path?: string; + /** :端口 */ + port?: string; + /** 全局表前缀,单独定义TableName则不生效 */ + prefix?: string; + /** 是否开启全局禁用复数,true表示开启 */ + singular?: boolean; + type?: string; + /** 数据库用户名 */ + username?: string; + }; + + type Sqlite = { + /** 高级配置 */ + config?: string; + /** 数据库名 */ + 'db-name'?: string; + /** 数据库引擎,默认InnoDB */ + engine?: string; + /** 是否开启Gorm全局日志 */ + 'log-mode'?: string; + /** 是否通过zap写入日志文件 */ + 'log-zap'?: boolean; + /** 空闲中的最大连接数 */ + 'max-idle-conns'?: number; + /** 打开到数据库的最大连接数 */ + 'max-open-conns'?: number; + /** 数据库密码 */ + password?: string; + /** 服务器地址:端口 */ + path?: string; + /** :端口 */ + port?: string; + /** 全局表前缀,单独定义TableName则不生效 */ + prefix?: string; + /** 是否开启全局禁用复数,true表示开启 */ + singular?: boolean; + /** 数据库用户名 */ + username?: string; + }; + + type SysAPIByGroupResponse = { + apis?: ApiGroup[]; + }; + + type SysAPIListResponse = { + apis?: Api[]; + }; + + type SysAPIResponse = { + api?: Api; + }; + + type SysCaptchaResponse = { + captchaId?: string; + captchaLength?: number; + openCaptcha?: boolean; + picPath?: string; + }; + + type SysConfigResponse = { + config?: Server; + }; + + type System = { + /** 端口值 */ + addr?: number; + /** 数据库类型:mysql(默认)|sqlite|sqlserver|postgresql */ + 'db-type'?: string; + /** 环境值 */ + env?: string; + 'iplimit-count'?: number; + 'iplimit-time'?: number; + /** Oss类型 */ + 'oss-type'?: string; + 'router-prefix'?: string; + /** 多点登录拦截 */ + 'use-multipoint'?: boolean; + /** 使用redis */ + 'use-redis'?: boolean; + }; + + type System = { + config?: Server; + }; + + type TencentCOS = { + 'base-url'?: string; + bucket?: string; + 'path-prefix'?: string; + region?: string; + 'secret-id'?: string; + 'secret-key'?: string; + }; + + type Timer = { + detail?: Detail[]; + /** CRON表达式 */ + spec?: string; + /** 是否启用 */ + start?: boolean; + /** 是否精确到秒 */ + with_seconds?: boolean; + }; + + type Tree = { + children?: Tree[]; + key?: number; + title?: string; + }; + + type TreeResponse = { + tree?: Tree[]; + }; + + type UpdateRolePermissionParams = { + apiIds?: number[]; + dataScope?: string; + deptIds?: number[]; + menuIds?: number[]; + roleId?: number; + }; + + type User = { + avatarId?: number; + createTime?: string; + deptId?: number; + /** 用户邮箱 */ + email?: string; + /** 状态 */ + enable?: boolean; + id?: number; + lastLoginTime?: string; + nickName?: string; + /** 用户手机号 */ + phone?: string; + postId?: number; + /** 多岗位 */ + postIds?: string; + remark?: string; + roleId?: number; + /** 多角色 */ + roleIds?: string; + updateTime?: string; + /** 用户登录名 */ + userName?: string; + }; + + type UserResponse = { + user?: User; + }; + + type UserView = { + avatarId?: number; + avatarUrl?: string; + createTime?: string; + deptId?: number; + /** 用户邮箱 */ + email?: string; + /** 状态 */ + enable?: boolean; + id?: number; + lastLoginTime?: string; + nickName?: string; + /** 用户手机号 */ + phone?: string; + postId?: number; + /** 多岗位 */ + postIds?: string; + remark?: string; + roleId?: number; + /** 多角色 */ + roleIds?: string; + roles?: RoleSelectResponse[]; + updateTime?: string; + /** 用户登录名 */ + userName?: string; + }; + + type Zap = { + /** 日志文件夹 */ + director?: string; + /** 编码级 */ + 'encode-level'?: string; + /** 输出 */ + format?: string; + /** 级别 */ + level?: string; + /** 输出控制台 */ + 'log-in-console'?: boolean; + /** 日志留存时间 */ + 'max-age'?: number; + /** 日志前缀 */ + prefix?: string; + /** 显示行 */ + 'show-line'?: boolean; + /** 栈名 */ + 'stacktrace-key'?: string; + }; +} diff --git a/src/styles/color/bezierEasing.less b/src/styles/color/bezierEasing.less new file mode 100644 index 0000000..f53ffb3 --- /dev/null +++ b/src/styles/color/bezierEasing.less @@ -0,0 +1,110 @@ +/* stylelint-disable */ +.bezierEasingMixin() { +@functions: ~`(function() { + var NEWTON_ITERATIONS = 4; + var NEWTON_MIN_SLOPE = 0.001; + var SUBDIVISION_PRECISION = 0.0000001; + var SUBDIVISION_MAX_ITERATIONS = 10; + + var kSplineTableSize = 11; + var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); + + var float32ArraySupported = typeof Float32Array === 'function'; + + function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } + function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; } + function C (aA1) { return 3.0 * aA1; } + + // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. + function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; } + + // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. + function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); } + + function binarySubdivide (aX, aA, aB, mX1, mX2) { + var currentX, currentT, i = 0; + do { + currentT = aA + (aB - aA) / 2.0; + currentX = calcBezier(currentT, mX1, mX2) - aX; + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); + return currentT; + } + + function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) { + for (var i = 0; i < NEWTON_ITERATIONS; ++i) { + var currentSlope = getSlope(aGuessT, mX1, mX2); + if (currentSlope === 0.0) { + return aGuessT; + } + var currentX = calcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; + } + + var BezierEasing = function (mX1, mY1, mX2, mY2) { + if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) { + throw new Error('bezier x values must be in [0, 1] range'); + } + + // Precompute samples table + var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); + if (mX1 !== mY1 || mX2 !== mY2) { + for (var i = 0; i < kSplineTableSize; ++i) { + sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2); + } + } + + function getTForX (aX) { + var intervalStart = 0.0; + var currentSample = 1; + var lastSample = kSplineTableSize - 1; + + for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) { + intervalStart += kSampleStepSize; + } + --currentSample; + + // Interpolate to provide an initial guess for t + var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]); + var guessForT = intervalStart + dist * kSampleStepSize; + + var initialSlope = getSlope(guessForT, mX1, mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) { + return newtonRaphsonIterate(aX, guessForT, mX1, mX2); + } else if (initialSlope === 0.0) { + return guessForT; + } else { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2); + } + } + + return function BezierEasing (x) { + if (mX1 === mY1 && mX2 === mY2) { + return x; // linear + } + // Because JavaScript number are imprecise, we should guarantee the extremes are right. + if (x === 0) { + return 0; + } + if (x === 1) { + return 1; + } + return calcBezier(getTForX(x), mY1, mY2); + }; + }; + + this.colorEasing = BezierEasing(0.26, 0.09, 0.37, 0.18); + // less 3 requires a return + return ''; +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.bezierEasingMixin(); diff --git a/src/styles/color/colorPalette.less b/src/styles/color/colorPalette.less new file mode 100644 index 0000000..e662c07 --- /dev/null +++ b/src/styles/color/colorPalette.less @@ -0,0 +1,85 @@ +/* stylelint-disable no-duplicate-selectors */ +@import "bezierEasing"; +@import "tinyColor"; + +// We create a very complex algorithm which take the place of original tint/shade color system +// to make sure no one can understand it 👻 +// and create an entire color palette magicly by inputing just a single primary color. +// We are using bezier-curve easing function and some color manipulations like tint/shade/darken/spin +.colorPaletteMixin() { +@functions: ~`(function() { + var hueStep = 2; + var saturationStep = 0.16; + var saturationStep2 = 0.05; + var brightnessStep1 = 0.05; + var brightnessStep2 = 0.15; + var lightColorCount = 5; + var darkColorCount = 4; + + var getHue = function(hsv, i, isLight) { + var hue; + if (hsv.h >= 60 && hsv.h <= 240) { + hue = isLight ? hsv.h - hueStep * i : hsv.h + hueStep * i; + } else { + hue = isLight ? hsv.h + hueStep * i : hsv.h - hueStep * i; + } + if (hue < 0) { + hue += 360; + } else if (hue >= 360) { + hue -= 360; + } + return Math.round(hue); + }; + var getSaturation = function(hsv, i, isLight) { + // grey color don't change saturation + if (hsv.h === 0 && hsv.s === 0) { + return hsv.s; + } + var saturation; + if (isLight) { + saturation = hsv.s - saturationStep * i; + } else if (i === darkColorCount) { + saturation = hsv.s + saturationStep; + } else { + saturation = hsv.s + saturationStep2 * i; + } + if (saturation > 1) { + saturation = 1; + } + if (isLight && i === lightColorCount && saturation > 0.1) { + saturation = 0.1; + } + if (saturation < 0.06) { + saturation = 0.06; + } + return Number(saturation.toFixed(2)); + }; + var getValue = function(hsv, i, isLight) { + var value; + if (isLight) { + value = hsv.v + brightnessStep1 * i; + }else{ + value = hsv.v - brightnessStep2 * i + } + if (value > 1) { + value = 1; + } + return Number(value.toFixed(2)) + }; + + this.colorPalette = function(color, index) { + var isLight = index <= 6; + var hsv = tinycolor(color).toHsv(); + var i = isLight ? lightColorCount + 1 - index : index - lightColorCount - 1; + return tinycolor({ + h: getHue(hsv, i, isLight), + s: getSaturation(hsv, i, isLight), + v: getValue(hsv, i, isLight), + }).toHexString(); + }; +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.colorPaletteMixin(); diff --git a/src/styles/color/colors.less b/src/styles/color/colors.less new file mode 100644 index 0000000..51540bf --- /dev/null +++ b/src/styles/color/colors.less @@ -0,0 +1,162 @@ +@import 'colorPalette'; + +// color palettes +@blue-base: #1890ff; +@blue-1: color(~`colorPalette('@{blue-6}', 1) `); +@blue-2: color(~`colorPalette('@{blue-6}', 2) `); +@blue-3: color(~`colorPalette('@{blue-6}', 3) `); +@blue-4: color(~`colorPalette('@{blue-6}', 4) `); +@blue-5: color(~`colorPalette('@{blue-6}', 5) `); +@blue-6: @blue-base; +@blue-7: color(~`colorPalette('@{blue-6}', 7) `); +@blue-8: color(~`colorPalette('@{blue-6}', 8) `); +@blue-9: color(~`colorPalette('@{blue-6}', 9) `); +@blue-10: color(~`colorPalette('@{blue-6}', 10) `); + +@purple-base: #722ed1; +@purple-1: color(~`colorPalette('@{purple-6}', 1) `); +@purple-2: color(~`colorPalette('@{purple-6}', 2) `); +@purple-3: color(~`colorPalette('@{purple-6}', 3) `); +@purple-4: color(~`colorPalette('@{purple-6}', 4) `); +@purple-5: color(~`colorPalette('@{purple-6}', 5) `); +@purple-6: @purple-base; +@purple-7: color(~`colorPalette('@{purple-6}', 7) `); +@purple-8: color(~`colorPalette('@{purple-6}', 8) `); +@purple-9: color(~`colorPalette('@{purple-6}', 9) `); +@purple-10: color(~`colorPalette('@{purple-6}', 10) `); + +@cyan-base: #13c2c2; +@cyan-1: color(~`colorPalette('@{cyan-6}', 1) `); +@cyan-2: color(~`colorPalette('@{cyan-6}', 2) `); +@cyan-3: color(~`colorPalette('@{cyan-6}', 3) `); +@cyan-4: color(~`colorPalette('@{cyan-6}', 4) `); +@cyan-5: color(~`colorPalette('@{cyan-6}', 5) `); +@cyan-6: @cyan-base; +@cyan-7: color(~`colorPalette('@{cyan-6}', 7) `); +@cyan-8: color(~`colorPalette('@{cyan-6}', 8) `); +@cyan-9: color(~`colorPalette('@{cyan-6}', 9) `); +@cyan-10: color(~`colorPalette('@{cyan-6}', 10) `); + +@green-base: #52c41a; +@green-1: color(~`colorPalette('@{green-6}', 1) `); +@green-2: color(~`colorPalette('@{green-6}', 2) `); +@green-3: color(~`colorPalette('@{green-6}', 3) `); +@green-4: color(~`colorPalette('@{green-6}', 4) `); +@green-5: color(~`colorPalette('@{green-6}', 5) `); +@green-6: @green-base; +@green-7: color(~`colorPalette('@{green-6}', 7) `); +@green-8: color(~`colorPalette('@{green-6}', 8) `); +@green-9: color(~`colorPalette('@{green-6}', 9) `); +@green-10: color(~`colorPalette('@{green-6}', 10) `); + +@magenta-base: #eb2f96; +@magenta-1: color(~`colorPalette('@{magenta-6}', 1) `); +@magenta-2: color(~`colorPalette('@{magenta-6}', 2) `); +@magenta-3: color(~`colorPalette('@{magenta-6}', 3) `); +@magenta-4: color(~`colorPalette('@{magenta-6}', 4) `); +@magenta-5: color(~`colorPalette('@{magenta-6}', 5) `); +@magenta-6: @magenta-base; +@magenta-7: color(~`colorPalette('@{magenta-6}', 7) `); +@magenta-8: color(~`colorPalette('@{magenta-6}', 8) `); +@magenta-9: color(~`colorPalette('@{magenta-6}', 9) `); +@magenta-10: color(~`colorPalette('@{magenta-6}', 10) `); + +// alias of magenta +@pink-base: #eb2f96; +@pink-1: color(~`colorPalette('@{pink-6}', 1) `); +@pink-2: color(~`colorPalette('@{pink-6}', 2) `); +@pink-3: color(~`colorPalette('@{pink-6}', 3) `); +@pink-4: color(~`colorPalette('@{pink-6}', 4) `); +@pink-5: color(~`colorPalette('@{pink-6}', 5) `); +@pink-6: @pink-base; +@pink-7: color(~`colorPalette('@{pink-6}', 7) `); +@pink-8: color(~`colorPalette('@{pink-6}', 8) `); +@pink-9: color(~`colorPalette('@{pink-6}', 9) `); +@pink-10: color(~`colorPalette('@{pink-6}', 10) `); + +@red-base: #f5222d; +@red-1: color(~`colorPalette('@{red-6}', 1) `); +@red-2: color(~`colorPalette('@{red-6}', 2) `); +@red-3: color(~`colorPalette('@{red-6}', 3) `); +@red-4: color(~`colorPalette('@{red-6}', 4) `); +@red-5: color(~`colorPalette('@{red-6}', 5) `); +@red-6: @red-base; +@red-7: color(~`colorPalette('@{red-6}', 7) `); +@red-8: color(~`colorPalette('@{red-6}', 8) `); +@red-9: color(~`colorPalette('@{red-6}', 9) `); +@red-10: color(~`colorPalette('@{red-6}', 10) `); + +@orange-base: #fa8c16; +@orange-1: color(~`colorPalette('@{orange-6}', 1) `); +@orange-2: color(~`colorPalette('@{orange-6}', 2) `); +@orange-3: color(~`colorPalette('@{orange-6}', 3) `); +@orange-4: color(~`colorPalette('@{orange-6}', 4) `); +@orange-5: color(~`colorPalette('@{orange-6}', 5) `); +@orange-6: @orange-base; +@orange-7: color(~`colorPalette('@{orange-6}', 7) `); +@orange-8: color(~`colorPalette('@{orange-6}', 8) `); +@orange-9: color(~`colorPalette('@{orange-6}', 9) `); +@orange-10: color(~`colorPalette('@{orange-6}', 10) `); + +@yellow-base: #fadb14; +@yellow-1: color(~`colorPalette('@{yellow-6}', 1) `); +@yellow-2: color(~`colorPalette('@{yellow-6}', 2) `); +@yellow-3: color(~`colorPalette('@{yellow-6}', 3) `); +@yellow-4: color(~`colorPalette('@{yellow-6}', 4) `); +@yellow-5: color(~`colorPalette('@{yellow-6}', 5) `); +@yellow-6: @yellow-base; +@yellow-7: color(~`colorPalette('@{yellow-6}', 7) `); +@yellow-8: color(~`colorPalette('@{yellow-6}', 8) `); +@yellow-9: color(~`colorPalette('@{yellow-6}', 9) `); +@yellow-10: color(~`colorPalette('@{yellow-6}', 10) `); + +@volcano-base: #fa541c; +@volcano-1: color(~`colorPalette('@{volcano-6}', 1) `); +@volcano-2: color(~`colorPalette('@{volcano-6}', 2) `); +@volcano-3: color(~`colorPalette('@{volcano-6}', 3) `); +@volcano-4: color(~`colorPalette('@{volcano-6}', 4) `); +@volcano-5: color(~`colorPalette('@{volcano-6}', 5) `); +@volcano-6: @volcano-base; +@volcano-7: color(~`colorPalette('@{volcano-6}', 7) `); +@volcano-8: color(~`colorPalette('@{volcano-6}', 8) `); +@volcano-9: color(~`colorPalette('@{volcano-6}', 9) `); +@volcano-10: color(~`colorPalette('@{volcano-6}', 10) `); + +@geekblue-base: #2f54eb; +@geekblue-1: color(~`colorPalette('@{geekblue-6}', 1) `); +@geekblue-2: color(~`colorPalette('@{geekblue-6}', 2) `); +@geekblue-3: color(~`colorPalette('@{geekblue-6}', 3) `); +@geekblue-4: color(~`colorPalette('@{geekblue-6}', 4) `); +@geekblue-5: color(~`colorPalette('@{geekblue-6}', 5) `); +@geekblue-6: @geekblue-base; +@geekblue-7: color(~`colorPalette('@{geekblue-6}', 7) `); +@geekblue-8: color(~`colorPalette('@{geekblue-6}', 8) `); +@geekblue-9: color(~`colorPalette('@{geekblue-6}', 9) `); +@geekblue-10: color(~`colorPalette('@{geekblue-6}', 10) `); + +@lime-base: #a0d911; +@lime-1: color(~`colorPalette('@{lime-6}', 1) `); +@lime-2: color(~`colorPalette('@{lime-6}', 2) `); +@lime-3: color(~`colorPalette('@{lime-6}', 3) `); +@lime-4: color(~`colorPalette('@{lime-6}', 4) `); +@lime-5: color(~`colorPalette('@{lime-6}', 5) `); +@lime-6: @lime-base; +@lime-7: color(~`colorPalette('@{lime-6}', 7) `); +@lime-8: color(~`colorPalette('@{lime-6}', 8) `); +@lime-9: color(~`colorPalette('@{lime-6}', 9) `); +@lime-10: color(~`colorPalette('@{lime-6}', 10) `); + +@gold-base: #faad14; +@gold-1: color(~`colorPalette('@{gold-6}', 1) `); +@gold-2: color(~`colorPalette('@{gold-6}', 2) `); +@gold-3: color(~`colorPalette('@{gold-6}', 3) `); +@gold-4: color(~`colorPalette('@{gold-6}', 4) `); +@gold-5: color(~`colorPalette('@{gold-6}', 5) `); +@gold-6: @gold-base; +@gold-7: color(~`colorPalette('@{gold-6}', 7) `); +@gold-8: color(~`colorPalette('@{gold-6}', 8) `); +@gold-9: color(~`colorPalette('@{gold-6}', 9) `); +@gold-10: color(~`colorPalette('@{gold-6}', 10) `); + +@preset-colors: pink, magenta, red, volcano, orange, yellow, gold, cyan, lime, green, blue, geekblue, + purple; diff --git a/src/styles/color/tinyColor.less b/src/styles/color/tinyColor.less new file mode 100644 index 0000000..e576c78 --- /dev/null +++ b/src/styles/color/tinyColor.less @@ -0,0 +1,1184 @@ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.tinyColorMixin() { +@functions: ~`(function() { +// TinyColor v1.4.1 +// https://github.com/bgrins/TinyColor +// 2016-07-07, Brian Grinstead, MIT License +var trimLeft = /^\s+/, + trimRight = /\s+$/, + tinyCounter = 0, + mathRound = Math.round, + mathMin = Math.min, + mathMax = Math.max, + mathRandom = Math.random; + +function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (color instanceof tinycolor) { + return color; + } + // If we are called as a function, call using new instead + if (!(this instanceof tinycolor)) { + return new tinycolor(color, opts); + } + + var rgb = inputToRGB(color); + this._originalInput = color, + this._r = rgb.r, + this._g = rgb.g, + this._b = rgb.b, + this._a = rgb.a, + this._roundA = mathRound(100*this._a) / 100, + this._format = opts.format || rgb.format; + this._gradientType = opts.gradientType; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by inputToRgb + if (this._r < 1) { this._r = mathRound(this._r); } + if (this._g < 1) { this._g = mathRound(this._g); } + if (this._b < 1) { this._b = mathRound(this._b); } + + this._ok = rgb.ok; + this._tc_id = tinyCounter++; +} + +tinycolor.prototype = { + isDark: function() { + return this.getBrightness() < 128; + }, + isLight: function() { + return !this.isDark(); + }, + isValid: function() { + return this._ok; + }, + getOriginalInput: function() { + return this._originalInput; + }, + getFormat: function() { + return this._format; + }, + getAlpha: function() { + return this._a; + }, + getBrightness: function() { + //http://www.w3.org/TR/AERT#color-contrast + var rgb = this.toRgb(); + return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000; + }, + getLuminance: function() { + //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef + var rgb = this.toRgb(); + var RsRGB, GsRGB, BsRGB, R, G, B; + RsRGB = rgb.r/255; + GsRGB = rgb.g/255; + BsRGB = rgb.b/255; + + if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);} + if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);} + if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);} + return (0.2126 * R) + (0.7152 * G) + (0.0722 * B); + }, + setAlpha: function(value) { + this._a = boundAlpha(value); + this._roundA = mathRound(100*this._a) / 100; + return this; + }, + toHsv: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (this._a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a }; + }, + toHslString: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (this._a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(this._r, this._g, this._b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + this.toHex(allow3Char); + }, + toHex8: function(allow4Char) { + return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char); + }, + toHex8String: function(allow4Char) { + return '#' + this.toHex8(allow4Char); + }, + toRgb: function() { + return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a }; + }, + toRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : + "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a }; + }, + toPercentageRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")"; + }, + toName: function() { + if (this._a === 0) { + return "transparent"; + } + + if (this._a < 1) { + return false; + } + + return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false; + }, + toFilter: function(secondColor) { + var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a); + var secondHex8String = hex8String; + var gradientType = this._gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this._format; + + var formattedString = false; + var hasAlpha = this._a < 1 && this._a >= 0; + var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name"); + + if (needsAlphaFormat) { + // Special case for "transparent", all other non-alpha formats + // will return rgba when there is transparency. + if (format === "name" && this._a === 0) { + return this.toName(); + } + return this.toRgbString(); + } + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "hex4") { + formattedString = this.toHex8String(true); + } + if (format === "hex8") { + formattedString = this.toHex8String(); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + return formattedString || this.toHexString(); + }, + clone: function() { + return tinycolor(this.toString()); + }, + + _applyModification: function(fn, args) { + var color = fn.apply(null, [this].concat([].slice.call(args))); + this._r = color._r; + this._g = color._g; + this._b = color._b; + this.setAlpha(color._a); + return this; + }, + lighten: function() { + return this._applyModification(lighten, arguments); + }, + brighten: function() { + return this._applyModification(brighten, arguments); + }, + darken: function() { + return this._applyModification(darken, arguments); + }, + desaturate: function() { + return this._applyModification(desaturate, arguments); + }, + saturate: function() { + return this._applyModification(saturate, arguments); + }, + greyscale: function() { + return this._applyModification(greyscale, arguments); + }, + spin: function() { + return this._applyModification(spin, arguments); + }, + + _applyCombination: function(fn, args) { + return fn.apply(null, [this].concat([].slice.call(args))); + }, + analogous: function() { + return this._applyCombination(analogous, arguments); + }, + complement: function() { + return this._applyCombination(complement, arguments); + }, + monochromatic: function() { + return this._applyCombination(monochromatic, arguments); + }, + splitcomplement: function() { + return this._applyCombination(splitcomplement, arguments); + }, + triad: function() { + return this._applyCombination(triad, arguments); + }, + tetrad: function() { + return this._applyCombination(tetrad, arguments); + } +}; + +// If input is an object, force 1 into "1.0" to handle ratios properly +// String input requires "1.0" as input, so 1 will be treated as 1 +tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); +}; + +// Given a string or object, convert that input to RGB +// Possible string inputs: +// +// "red" +// "#f00" or "f00" +// "#ff0000" or "ff0000" +// "#ff000000" or "ff000000" +// "rgb 255 0 0" or "rgb (255, 0, 0)" +// "rgb 1.0 0 0" or "rgb (1, 0, 0)" +// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" +// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" +// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" +// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" +// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" +// +function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var s = null; + var v = null; + var l = null; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) { + s = convertToPercentage(color.s); + v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, s, v); + ok = true; + format = "hsv"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) { + s = convertToPercentage(color.s); + l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, s, l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; +} + +// Conversion Functions +// -------------------- + +// rgbToHsl, rgbToHsv, hslToRgb, hsvToRgb modified from: +// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript> + +// rgbToRgb +// Handle bounds / percentage checking to conform to CSS color spec +// <http://www.w3.org/TR/css3-color/> +// *Assumes:* r, g, b in [0, 255] or [0, 1] +// *Returns:* { r, g, b } in [0, 255] +function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; +} + +// rgbToHsl +// Converts an RGB color value to HSL. +// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] +// *Returns:* { h, s, l } in [0,1] +function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; +} + +// hslToRgb +// Converts an HSL color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] +function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// rgbToHsv +// Converts an RGB color value to HSV +// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] +// *Returns:* { h, s, v } in [0,1] +function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; +} + +// hsvToRgb +// Converts an HSV color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = Math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// rgbToHex +// Converts an RGB color to hex +// Assumes r, g, and b are contained in the set [0, 255] +// Returns a 3 or 6 character hex +function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); +} + +// rgbaToHex +// Converts an RGBA color plus alpha transparency to hex +// Assumes r, g, b are contained in the set [0, 255] and +// a in [0, 1]. Returns a 4 or 8 character rgba hex +function rgbaToHex(r, g, b, a, allow4Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)), + pad2(convertDecimalToHex(a)) + ]; + + // Return a 4 character hex if possible + if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0); + } + + return hex.join(""); +} + +// rgbaToArgbHex +// Converts an RGBA color to an ARGB Hex8 string +// Rarely used, but required for "toFilter()" +function rgbaToArgbHex(r, g, b, a) { + + var hex = [ + pad2(convertDecimalToHex(a)), + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + return hex.join(""); +} + +// equals +// Can be called with any tinycolor input +tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); +}; + +tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); +}; + +// Modification Functions +// ---------------------- +// Thanks to less.js for some of the basics here +// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js> + +function desaturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function saturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function greyscale(color) { + return tinycolor(color).desaturate(100); +} + +function lighten (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +function brighten(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var rgb = tinycolor(color).toRgb(); + rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100)))); + rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100)))); + rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100)))); + return tinycolor(rgb); +} + +function darken (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. +// Values outside of this range will be wrapped into this range. +function spin(color, amount) { + var hsl = tinycolor(color).toHsl(); + var hue = (hsl.h + amount) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return tinycolor(hsl); +} + +// Combination Functions +// --------------------- +// Thanks to jQuery xColor for some of the ideas behind these +// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js> + +function complement(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); +} + +function triad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function tetrad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function splitcomplement(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; +} + +function analogous(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; +} + +function monochromatic(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; +} + +// Utility Functions +// --------------------- + +tinycolor.mix = function(color1, color2, amount) { + amount = (amount === 0) ? 0 : (amount || 50); + + var rgb1 = tinycolor(color1).toRgb(); + var rgb2 = tinycolor(color2).toRgb(); + + var p = amount / 100; + + var rgba = { + r: ((rgb2.r - rgb1.r) * p) + rgb1.r, + g: ((rgb2.g - rgb1.g) * p) + rgb1.g, + b: ((rgb2.b - rgb1.b) * p) + rgb1.b, + a: ((rgb2.a - rgb1.a) * p) + rgb1.a + }; + + return tinycolor(rgba); +}; + +// Readability Functions +// --------------------- +// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2) + +// contrast +// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2) +tinycolor.readability = function(color1, color2) { + var c1 = tinycolor(color1); + var c2 = tinycolor(color2); + return (Math.max(c1.getLuminance(),c2.getLuminance())+0.05) / (Math.min(c1.getLuminance(),c2.getLuminance())+0.05); +}; + +// isReadable +// Ensure that foreground and background color combinations meet WCAG2 guidelines. +// The third argument is an optional Object. +// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA'; +// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'. +// If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}. + +// *Example* +// tinycolor.isReadable("#000", "#111") => false +// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false +tinycolor.isReadable = function(color1, color2, wcag2) { + var readability = tinycolor.readability(color1, color2); + var wcag2Parms, out; + + out = false; + + wcag2Parms = validateWCAG2Parms(wcag2); + switch (wcag2Parms.level + wcag2Parms.size) { + case "AAsmall": + case "AAAlarge": + out = readability >= 4.5; + break; + case "AAlarge": + out = readability >= 3; + break; + case "AAAsmall": + out = readability >= 7; + break; + } + return out; + +}; + +// mostReadable +// Given a base color and a list of possible foreground or background +// colors for that base, returns the most readable color. +// Optionally returns Black or White if the most readable color is unreadable. +// *Example* +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255" +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff" +tinycolor.mostReadable = function(baseColor, colorList, args) { + var bestColor = null; + var bestScore = 0; + var readability; + var includeFallbackColors, level, size ; + args = args || {}; + includeFallbackColors = args.includeFallbackColors ; + level = args.level; + size = args.size; + + for (var i= 0; i < colorList.length ; i++) { + readability = tinycolor.readability(baseColor, colorList[i]); + if (readability > bestScore) { + bestScore = readability; + bestColor = tinycolor(colorList[i]); + } + } + + if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) { + return bestColor; + } + else { + args.includeFallbackColors=false; + return tinycolor.mostReadable(baseColor,["#fff", "#000"],args); + } +}; + +// Big List of Colors +// ------------------ +// <http://www.w3.org/TR/css3-color/#svg-color> +var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + rebeccapurple: "663399", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" +}; + +// Make it easy to access colors via hexNames[hex] +var hexNames = tinycolor.hexNames = flip(names); + +// Utilities +// --------- + +// { 'name1': 'val1' } becomes { 'val1': 'name1' } +function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; +} + +// Return a valid alpha value [0,1] with all invalid values being set to 1 +function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; +} + +// Take input from [0, n] and return it as [0, 1] +function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((Math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); +} + +// Force a number between 0 and 1 +function clamp01(val) { + return mathMin(1, mathMax(0, val)); +} + +// Parse a base-16 hex value into a base-10 integer +function parseIntFromHex(val) { + return parseInt(val, 16); +} + +// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 +// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0> +function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; +} + +// Check to see if string passed in is a percentage +function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} + +// Replace a decimal with it's percentage value +function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; +} + +// Converts a decimal to a hex value +function convertDecimalToHex(d) { + return Math.round(parseFloat(d) * 255).toString(16); +} +// Converts a hex value to a decimal +function convertHexToDecimal(h) { + return (parseIntFromHex(h) / 255); +} + +var matchers = (function() { + + // <http://www.w3.org/TR/css3-values/#integers> + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // <http://www.w3.org/TR/css3-values/#number-value> + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + CSS_UNIT: new RegExp(CSS_UNIT), + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hsva: new RegExp("hsva" + PERMISSIVE_MATCH4), + hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; +})(); + +// isValidCSSUnit +// Take in a single string / number and check to see if it looks like a CSS unit +// (see matchers above for definition). +function isValidCSSUnit(color) { + return !!matchers.CSS_UNIT.exec(color); +} + +// stringInputToObject +// Permissive string parsing. Take in a number of formats, and output an object +// based on detected format. Returns { r, g, b } or { h, s, l } or { h, s, v} +function stringInputToObject(color) { + + color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hsva.exec(color))) { + return { h: match[1], s: match[2], v: match[3], a: match[4] }; + } + if ((match = matchers.hex8.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + a: convertHexToDecimal(match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex4.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + a: convertHexToDecimal(match[4] + '' + match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; +} + +function validateWCAG2Parms(parms) { + // return valid WCAG2 parms for isReadable. + // If input parms are invalid, return {"level":"AA", "size":"small"} + var level, size; + parms = parms || {"level":"AA", "size":"small"}; + level = (parms.level || "AA").toUpperCase(); + size = (parms.size || "small").toLowerCase(); + if (level !== "AA" && level !== "AAA") { + level = "AA"; + } + if (size !== "small" && size !== "large") { + size = "small"; + } + return {"level":level, "size":size}; +} + +this.tinycolor = tinycolor; + +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.tinyColorMixin(); diff --git a/src/styles/compact.less b/src/styles/compact.less new file mode 100644 index 0000000..ef0008b --- /dev/null +++ b/src/styles/compact.less @@ -0,0 +1,4 @@ +@root-entry-name: default; + +@import './themes/compact.less'; +@import './core/index'; diff --git a/src/styles/core/base.less b/src/styles/core/base.less new file mode 100644 index 0000000..a704c55 --- /dev/null +++ b/src/styles/core/base.less @@ -0,0 +1,10 @@ +// Config global less under antd +[class^=~'@{ant-prefix}-'], +[class*=~' @{ant-prefix}-'] { + // remove the clear button of a text input control in IE10+ + &::-ms-clear, + input::-ms-clear, + input::-ms-reveal { + display: none; + } +} diff --git a/src/styles/core/global.less b/src/styles/core/global.less new file mode 100644 index 0000000..cb26cce --- /dev/null +++ b/src/styles/core/global.less @@ -0,0 +1,491 @@ +/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */ + +// Reboot +// +// Normalization of HTML elements, manually forked from Normalize.css to remove +// styles targeting irrelevant browsers while applying new styles. +// +// Normalize is licensed MIT. https://github.com/necolas/normalize.css + +// HTML & Body reset +@{html-selector}, +body { + .square(100%); +} + +// remove the clear button of a text input control in IE10+ +input::-ms-clear, +input::-ms-reveal { + display: none; +} + +// Document +// +// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`. +// 2. Change the default font family in all browsers. +// 3. Correct the line height in all browsers. +// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS. +// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so +// we force a non-overlapping, non-auto-hiding scrollbar to counteract. +// 6. Change the default tap highlight to be completely transparent in iOS. + +*, +*::before, +*::after { + box-sizing: border-box; // 1 +} + +@{html-selector} { + font-family: sans-serif; // 2 + line-height: 1.15; // 3 + -webkit-text-size-adjust: 100%; // 4 + -ms-text-size-adjust: 100%; // 4 + -ms-overflow-style: scrollbar; // 5 + -webkit-tap-highlight-color: fade(@black, 0%); // 6 +} + +// IE10+ doesn't honor `<meta name="viewport">` in some cases. +@-ms-viewport { + width: device-width; +} + +// Body +// +// 1. remove the margin in all browsers. +// 2. As a best practice, apply a default `body-background`. + +body { + margin: 0; // 1 + color: @text-color; + font-size: @font-size-base; + font-family: @font-family; + font-variant: @font-variant-base; + line-height: @line-height-base; + background-color: @body-background; // 2 + font-feature-settings: @font-feature-settings-base; +} + +// Suppress the focus outline on elements that cannot be accessed via keyboard. +// This prevents an unwanted focus outline from appearing around elements that +// might still respond to pointer events. +// +// Credit: https://github.com/suitcss/base +[tabindex='-1']:focus { + outline: none !important; +} + +// Content grouping +// +// 1. Add the correct box sizing in Firefox. +// 2. Show the overflow in Edge and IE. + +hr { + box-sizing: content-box; // 1 + height: 0; // 1 + overflow: visible; // 2 +} + +// +// Typography +// + +// remove top margins from headings +// +// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top +// margin for easier control within type scales as it avoids margin collapsing. +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 0.5em; + color: @heading-color; + font-weight: 500; +} + +// Reset margins on paragraphs +// +// Similarly, the top margin on `<p>`s get reset. However, we also reset the +// bottom margin to use `em` units instead of `em`. +p { + margin-top: 0; + margin-bottom: 1em; +} + +// Abbreviations +// +// 1. remove the bottom border in Firefox 39-. +// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. +// 3. Add explicit cursor to indicate changed behavior. +// 4. Duplicate behavior to the data-* attribute for our tooltip plugin + +abbr[title], +abbr[data-original-title] { + // 4 + text-decoration: underline; // 2 + text-decoration: underline dotted; // 2 + border-bottom: 0; // 1 + cursor: help; // 3 +} + +address { + margin-bottom: 1em; + font-style: normal; + line-height: inherit; +} + +input[type='text'], +input[type='password'], +input[type='number'], +textarea { + -webkit-appearance: none; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1em; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 500; +} + +dd { + margin-bottom: 0.5em; + margin-left: 0; // Undo browser default +} + +blockquote { + margin: 0 0 1em; +} + +dfn { + font-style: italic; // Add the correct font style in Android 4.3- +} + +b, +strong { + font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari +} + +small { + font-size: 80%; // Add the correct font size in all browsers +} + +// +// Prevent `sub` and `sup` elements from affecting the line height in +// all browsers. +// + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +// +// Links +// + +a { + color: @link-color; + text-decoration: @link-decoration; + background-color: transparent; // remove the gray background on active links in IE 10. + outline: none; + cursor: pointer; + transition: color 0.3s; + -webkit-text-decoration-skip: objects; // remove gaps in links underline in iOS 8+ and Safari 8+. + + &:hover { + color: @link-hover-color; + } + + &:active { + color: @link-active-color; + } + + &:active, + &:hover { + text-decoration: @link-hover-decoration; + outline: 0; + } + + // https://github.com/ant-design/ant-design/issues/22503 + &:focus { + text-decoration: @link-focus-decoration; + outline: @link-focus-outline; + } + + &[disabled] { + color: @disabled-color; + cursor: not-allowed; + } +} + +// +// Code +// + +pre, +code, +kbd, +samp { + font-size: 1em; // Correct the odd `em` font sizing in all browsers. + font-family: @code-family; +} + +pre { + // remove browser default top margin + margin-top: 0; + // Reset browser default of `1em` to use `em`s + margin-bottom: 1em; + // Don't allow content to break outside + overflow: auto; +} + +// +// Figures +// +figure { + // Apply a consistent margin strategy (matches our type styles). + margin: 0 0 1em; +} + +// +// Images and content +// + +img { + vertical-align: middle; + border-style: none; // remove the border on images inside links in IE 10-. +} + +// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property. +// +// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11 +// DON'T remove the click delay when `<meta name="viewport" content="width=device-width">` is present. +// However, they DO support emoving the click delay via `touch-action: manipulation`. +// See: +// * https://getbootstrap.com/docs/4.0/content/reboot/#click-delay-optimization-for-touch +// * http://caniuse.com/#feat=css-touch-action +// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay + +a, +area, +button, +[role='button'], +input:not([type='range']), +label, +select, +summary, +textarea { + touch-action: manipulation; +} + +// +// Tables +// + +table { + border-collapse: collapse; // Prevent double borders +} + +caption { + padding-top: 0.75em; + padding-bottom: 0.3em; + color: @text-color-secondary; + text-align: left; + caption-side: bottom; +} + +// +// Forms +// + +input, +button, +select, +optgroup, +textarea { + margin: 0; // remove the margin in Firefox and Safari + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; // Show the overflow in Edge +} + +button, +select { + text-transform: none; // remove the inheritance of text transform in Firefox +} + +// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` +// controls in Android 4. +// 2. Correct the inability to style clickable types in iOS and Safari. +button, +@{html-selector} [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; // 2 +} + +// remove inner border and padding from Firefox, but don't restore the outline like Normalize. +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type='radio'], +input[type='checkbox'] { + box-sizing: border-box; // 1. Add the correct box sizing in IE 10- + padding: 0; // 2. remove the padding in IE 10- +} + +input[type='date'], +input[type='time'], +input[type='datetime-local'], +input[type='month'] { + // remove the default appearance of temporal inputs to avoid a Mobile Safari + // bug where setting a custom line-height prevents text from being vertically + // centered within the input. + // See https://bugs.webkit.org/show_bug.cgi?id=139848 + // and https://github.com/twbs/bootstrap/issues/11266 + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; // remove the default vertical scrollbar in IE. + // Textareas should really only resize vertically so they don't break their (horizontal) containers. + resize: vertical; +} + +fieldset { + // Browsers set a default `min-width: min-content;` on fieldsets, + // unlike e.g. `<div>`s, which have `min-width: 0;` by default. + // So we reset that to ensure fieldsets behave more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359 + // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements + min-width: 0; + margin: 0; + // Reset the default outline behavior of fieldsets so they don't affect page layout. + padding: 0; + border: 0; +} + +// 1. Correct the text wrapping in Edge and IE. +// 2. Correct the color inheritance from `fieldset` elements in IE. +legend { + display: block; + width: 100%; + max-width: 100%; // 1 + margin-bottom: 0.5em; + padding: 0; + color: inherit; // 2 + font-size: 1.5em; + line-height: inherit; + white-space: normal; // 1 +} + +progress { + vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera. +} + +// Correct the cursor style of incement and decement buttons in Chrome. +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} + +[type='search'] { + // This overrides the extra rounded corners on search inputs in iOS so that our + // `.form-control` class can properly style them. Note that this cannot simply + // be added to `.form-control` as it's not specific enough. For details, see + // https://github.com/twbs/bootstrap/issues/11586. + outline-offset: -2px; // 2. Correct the outline style in Safari. + -webkit-appearance: none; +} + +// +// remove the inner padding and cancel buttons in Chrome and Safari on macOS. +// + +[type='search']::-webkit-search-cancel-button, +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} + +// +// 1. Correct the inability to style clickable types in iOS and Safari. +// 2. Change font properties to `inherit` in Safari. +// + +::-webkit-file-upload-button { + font: inherit; // 2 + -webkit-appearance: button; // 1 +} + +// +// Correct element displays +// + +output { + display: inline-block; +} + +summary { + display: list-item; // Add the correct display in all browsers +} + +template { + display: none; // Add the correct display in IE +} + +// Always hide an element with the `hidden` HTML attribute (from PureCSS). +// Needed for proper display in IE 10-. +[hidden] { + display: none !important; +} + +mark { + padding: 0.2em; + background-color: @yellow-1; +} + +::selection { + color: @text-color-inverse; + background: @text-selection-bg; +} + +// Utility classes +.clearfix { + .clearfix(); +} diff --git a/src/styles/core/iconfont.less b/src/styles/core/iconfont.less new file mode 100644 index 0000000..597b854 --- /dev/null +++ b/src/styles/core/iconfont.less @@ -0,0 +1,22 @@ +@import '../themes/index'; +@import '../mixins/iconfont'; + +.@{iconfont-css-prefix} { + .iconfont-mixin(); + + // https://github.com/ant-design/ant-design/issues/33703 + & > & { + line-height: 0; + vertical-align: 0; + } + + &[tabindex] { + cursor: pointer; + } +} + +.@{iconfont-css-prefix}-spin, +.@{iconfont-css-prefix}-spin::before { + display: inline-block; + animation: loadingCircle 1s infinite linear; +} diff --git a/src/styles/core/index.less b/src/styles/core/index.less new file mode 100644 index 0000000..c493947 --- /dev/null +++ b/src/styles/core/index.less @@ -0,0 +1,5 @@ +@import '../mixins/index'; +@import 'base'; +@import 'global'; +@import 'iconfont'; +@import 'motion'; diff --git a/src/styles/core/motion.less b/src/styles/core/motion.less new file mode 100644 index 0000000..286d50e --- /dev/null +++ b/src/styles/core/motion.less @@ -0,0 +1,22 @@ +// @import '../mixins/motion'; This has moved to theme/xxx inside. +@import 'motion/fade'; +@import 'motion/move'; +@import 'motion/other'; +@import 'motion/slide'; +@import 'motion/zoom'; + +// For common/openAnimation +.ant-motion-collapse-legacy { + overflow: hidden; + + &-active { + transition: height @animation-duration-base @ease-in-out, + opacity @animation-duration-base @ease-in-out !important; + } +} + +.ant-motion-collapse { + overflow: hidden; + transition: height @animation-duration-base @ease-in-out, + opacity @animation-duration-base @ease-in-out !important; +} diff --git a/src/styles/core/motion/fade.less b/src/styles/core/motion/fade.less new file mode 100644 index 0000000..f4a9513 --- /dev/null +++ b/src/styles/core/motion/fade.less @@ -0,0 +1,34 @@ +.fade-motion(@className, @keyframeName) { + @name: ~'@{ant-prefix}-@{className}'; + .make-motion(@name, @keyframeName); + .@{name}-enter, + .@{name}-appear { + opacity: 0; + animation-timing-function: linear; + } + .@{name}-leave { + animation-timing-function: linear; + } +} + +.fade-motion(fade, antFade); + +@keyframes antFadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes antFadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} diff --git a/src/styles/core/motion/move.less b/src/styles/core/motion/move.less new file mode 100644 index 0000000..733f26d --- /dev/null +++ b/src/styles/core/motion/move.less @@ -0,0 +1,129 @@ +.move-motion(@className, @keyframeName) { + @name: ~'@{ant-prefix}-@{className}'; + .make-motion(@name, @keyframeName); + .@{name}-enter, + .@{name}-appear { + opacity: 0; + animation-timing-function: @ease-out-circ; + } + .@{name}-leave { + animation-timing-function: @ease-in-circ; + } +} + +.move-motion(move-up, antMoveUp); +.move-motion(move-down, antMoveDown); +.move-motion(move-left, antMoveLeft); +.move-motion(move-right, antMoveRight); + +@keyframes antMoveDownIn { + 0% { + transform: translateY(100%); + transform-origin: 0 0; + opacity: 0; + } + + 100% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } +} + +@keyframes antMoveDownOut { + 0% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } + + 100% { + transform: translateY(100%); + transform-origin: 0 0; + opacity: 0; + } +} + +@keyframes antMoveLeftIn { + 0% { + transform: translateX(-100%); + transform-origin: 0 0; + opacity: 0; + } + + 100% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } +} + +@keyframes antMoveLeftOut { + 0% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } + + 100% { + transform: translateX(-100%); + transform-origin: 0 0; + opacity: 0; + } +} + +@keyframes antMoveRightIn { + 0% { + transform: translateX(100%); + transform-origin: 0 0; + opacity: 0; + } + + 100% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } +} + +@keyframes antMoveRightOut { + 0% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } + + 100% { + transform: translateX(100%); + transform-origin: 0 0; + opacity: 0; + } +} + +@keyframes antMoveUpIn { + 0% { + transform: translateY(-100%); + transform-origin: 0 0; + opacity: 0; + } + + 100% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } +} + +@keyframes antMoveUpOut { + 0% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } + + 100% { + transform: translateY(-100%); + transform-origin: 0 0; + opacity: 0; + } +} diff --git a/src/styles/core/motion/other.less b/src/styles/core/motion/other.less new file mode 100644 index 0000000..d1a2549 --- /dev/null +++ b/src/styles/core/motion/other.less @@ -0,0 +1,51 @@ +@keyframes loadingCircle { + 100% { + transform: rotate(360deg); + } +} + +@click-animating-true: ~"[@{ant-prefix}-click-animating='true']"; +@click-animating-with-extra-node-true: ~"[@{ant-prefix}-click-animating-without-extra-node='true']"; + +@{click-animating-true}, +@{click-animating-with-extra-node-true} { + position: relative; +} + +html { + --antd-wave-shadow-color: @primary-color; + --scroll-bar: 0; +} + +@click-animating-with-extra-node-true-after: ~'@{click-animating-with-extra-node-true}::after'; + +@{click-animating-with-extra-node-true-after}, +.@{ant-prefix}-click-animating-node { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + display: block; + border-radius: inherit; + box-shadow: 0 0 0 0 @primary-color; + box-shadow: 0 0 0 0 var(--antd-wave-shadow-color); + opacity: 0.2; + animation: fadeEffect 2s @ease-out-circ, waveEffect 0.4s @ease-out-circ; + animation-fill-mode: forwards; + content: ''; + pointer-events: none; +} + +@keyframes waveEffect { + 100% { + box-shadow: 0 0 0 @primary-color; + box-shadow: 0 0 0 @wave-animation-width var(--antd-wave-shadow-color); + } +} + +@keyframes fadeEffect { + 100% { + opacity: 0; + } +} diff --git a/src/styles/core/motion/slide.less b/src/styles/core/motion/slide.less new file mode 100644 index 0000000..7831b4b --- /dev/null +++ b/src/styles/core/motion/slide.less @@ -0,0 +1,131 @@ +.slide-motion(@className, @keyframeName) { + @name: ~'@{ant-prefix}-@{className}'; + .make-motion(@name, @keyframeName); + .@{name}-enter, + .@{name}-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: @ease-out-quint; + } + .@{name}-leave { + animation-timing-function: @ease-in-quint; + } +} + +.slide-motion(slide-up, antSlideUp); +.slide-motion(slide-down, antSlideDown); +.slide-motion(slide-left, antSlideLeft); +.slide-motion(slide-right, antSlideRight); + +@keyframes antSlideUpIn { + 0% { + transform: scaleY(0.8); + transform-origin: 0% 0%; + opacity: 0; + } + + 100% { + transform: scaleY(1); + transform-origin: 0% 0%; + opacity: 1; + } +} + +@keyframes antSlideUpOut { + 0% { + transform: scaleY(1); + transform-origin: 0% 0%; + opacity: 1; + } + + 100% { + transform: scaleY(0.8); + transform-origin: 0% 0%; + opacity: 0; + } +} + +@keyframes antSlideDownIn { + 0% { + transform: scaleY(0.8); + transform-origin: 100% 100%; + opacity: 0; + } + + 100% { + transform: scaleY(1); + transform-origin: 100% 100%; + opacity: 1; + } +} + +@keyframes antSlideDownOut { + 0% { + transform: scaleY(1); + transform-origin: 100% 100%; + opacity: 1; + } + + 100% { + transform: scaleY(0.8); + transform-origin: 100% 100%; + opacity: 0; + } +} + +@keyframes antSlideLeftIn { + 0% { + transform: scaleX(0.8); + transform-origin: 0% 0%; + opacity: 0; + } + + 100% { + transform: scaleX(1); + transform-origin: 0% 0%; + opacity: 1; + } +} + +@keyframes antSlideLeftOut { + 0% { + transform: scaleX(1); + transform-origin: 0% 0%; + opacity: 1; + } + + 100% { + transform: scaleX(0.8); + transform-origin: 0% 0%; + opacity: 0; + } +} + +@keyframes antSlideRightIn { + 0% { + transform: scaleX(0.8); + transform-origin: 100% 0%; + opacity: 0; + } + + 100% { + transform: scaleX(1); + transform-origin: 100% 0%; + opacity: 1; + } +} + +@keyframes antSlideRightOut { + 0% { + transform: scaleX(1); + transform-origin: 100% 0%; + opacity: 1; + } + + 100% { + transform: scaleX(0.8); + transform-origin: 100% 0%; + opacity: 0; + } +} diff --git a/src/styles/core/motion/zoom.less b/src/styles/core/motion/zoom.less new file mode 100644 index 0000000..72739b7 --- /dev/null +++ b/src/styles/core/motion/zoom.less @@ -0,0 +1,179 @@ +.zoom-motion(@className, @keyframeName, @duration: @animation-duration-base) { + @name: ~'@{ant-prefix}-@{className}'; + .make-motion(@name, @keyframeName, @duration); + .@{name}-enter, + .@{name}-appear { + transform: scale(0); // need this by yiminghe + opacity: 0; + animation-timing-function: @ease-out-circ; + + &-prepare { + transform: none; + } + } + .@{name}-leave { + animation-timing-function: @ease-in-out-circ; + } +} + +// For Modal, Select choosen item +.zoom-motion(zoom, antZoom); +// For Popover, Popconfirm, Dropdown +.zoom-motion(zoom-big, antZoomBig); +// For Tooltip +.zoom-motion(zoom-big-fast, antZoomBig, @animation-duration-fast); + +.zoom-motion(zoom-up, antZoomUp); +.zoom-motion(zoom-down, antZoomDown); +.zoom-motion(zoom-left, antZoomLeft); +.zoom-motion(zoom-right, antZoomRight); + +@keyframes antZoomIn { + 0% { + transform: scale(0.2); + opacity: 0; + } + + 100% { + transform: scale(1); + opacity: 1; + } +} + +@keyframes antZoomOut { + 0% { + transform: scale(1); + } + + 100% { + transform: scale(0.2); + opacity: 0; + } +} + +@keyframes antZoomBigIn { + 0% { + transform: scale(0.8); + opacity: 0; + } + + 100% { + transform: scale(1); + opacity: 1; + } +} + +@keyframes antZoomBigOut { + 0% { + transform: scale(1); + } + + 100% { + transform: scale(0.8); + opacity: 0; + } +} + +@keyframes antZoomUpIn { + 0% { + transform: scale(0.8); + transform-origin: 50% 0%; + opacity: 0; + } + + 100% { + transform: scale(1); + transform-origin: 50% 0%; + } +} + +@keyframes antZoomUpOut { + 0% { + transform: scale(1); + transform-origin: 50% 0%; + } + + 100% { + transform: scale(0.8); + transform-origin: 50% 0%; + opacity: 0; + } +} + +@keyframes antZoomLeftIn { + 0% { + transform: scale(0.8); + transform-origin: 0% 50%; + opacity: 0; + } + + 100% { + transform: scale(1); + transform-origin: 0% 50%; + } +} + +@keyframes antZoomLeftOut { + 0% { + transform: scale(1); + transform-origin: 0% 50%; + } + + 100% { + transform: scale(0.8); + transform-origin: 0% 50%; + opacity: 0; + } +} + +@keyframes antZoomRightIn { + 0% { + transform: scale(0.8); + transform-origin: 100% 50%; + opacity: 0; + } + + 100% { + transform: scale(1); + transform-origin: 100% 50%; + } +} + +@keyframes antZoomRightOut { + 0% { + transform: scale(1); + transform-origin: 100% 50%; + } + + 100% { + transform: scale(0.8); + transform-origin: 100% 50%; + opacity: 0; + } +} + +@keyframes antZoomDownIn { + 0% { + transform: scale(0.8); + transform-origin: 50% 100%; + opacity: 0; + } + + 100% { + transform: scale(1); + transform-origin: 50% 100%; + } +} + +@keyframes antZoomDownOut { + 0% { + transform: scale(1); + transform-origin: 50% 100%; + } + + 100% { + transform: scale(0.8); + transform-origin: 50% 100%; + opacity: 0; + } +} diff --git a/src/styles/css.js b/src/styles/css.js new file mode 100644 index 0000000..b67dcb9 --- /dev/null +++ b/src/styles/css.js @@ -0,0 +1 @@ +import './index.css'; \ No newline at end of file diff --git a/src/styles/dark.less b/src/styles/dark.less new file mode 100644 index 0000000..12a3731 --- /dev/null +++ b/src/styles/dark.less @@ -0,0 +1,4 @@ +@root-entry-name: default; + +@import './themes/dark.less'; +@import './core/index'; diff --git a/src/styles/default.css b/src/styles/default.css new file mode 100644 index 0000000..b363d91 --- /dev/null +++ b/src/styles/default.css @@ -0,0 +1,1248 @@ +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +[class^=ant-]::-ms-clear, +[class*= ant-]::-ms-clear, +[class^=ant-] input::-ms-clear, +[class*= ant-] input::-ms-clear, +[class^=ant-] input::-ms-reveal, +[class*= ant-] input::-ms-reveal { + display: none; +} +/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */ +html, +body { + width: 100%; + height: 100%; +} +input::-ms-clear, +input::-ms-reveal { + display: none; +} +*, +*::before, +*::after { + box-sizing: border-box; +} +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +@-ms-viewport { + width: device-width; +} +body { + margin: 0; + color: rgba(0, 0, 0, 0.85); + font-size: 14px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + font-variant: tabular-nums; + line-height: 1.5715; + background-color: #fff; + font-feature-settings: 'tnum'; +} +[tabindex='-1']:focus { + outline: none !important; +} +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 0.5em; + color: rgba(0, 0, 0, 0.85); + font-weight: 500; +} +p { + margin-top: 0; + margin-bottom: 1em; +} +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + border-bottom: 0; + cursor: help; +} +address { + margin-bottom: 1em; + font-style: normal; + line-height: inherit; +} +input[type='text'], +input[type='password'], +input[type='number'], +textarea { + -webkit-appearance: none; +} +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1em; +} +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} +dt { + font-weight: 500; +} +dd { + margin-bottom: 0.5em; + margin-left: 0; +} +blockquote { + margin: 0 0 1em; +} +dfn { + font-style: italic; +} +b, +strong { + font-weight: bolder; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +a { + color: #1890ff; + text-decoration: none; + background-color: transparent; + outline: none; + cursor: pointer; + transition: color 0.3s; + -webkit-text-decoration-skip: objects; +} +a:hover { + color: #40a9ff; +} +a:active { + color: #096dd9; +} +a:active, +a:hover { + text-decoration: none; + outline: 0; +} +a:focus { + text-decoration: none; + outline: 0; +} +a[disabled] { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +pre, +code, +kbd, +samp { + font-size: 1em; + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; +} +pre { + margin-top: 0; + margin-bottom: 1em; + overflow: auto; +} +figure { + margin: 0 0 1em; +} +img { + vertical-align: middle; + border-style: none; +} +a, +area, +button, +[role='button'], +input:not([type='range']), +label, +select, +summary, +textarea { + touch-action: manipulation; +} +table { + border-collapse: collapse; +} +caption { + padding-top: 0.75em; + padding-bottom: 0.3em; + color: rgba(0, 0, 0, 0.45); + text-align: left; + caption-side: bottom; +} +input, +button, +select, +optgroup, +textarea { + margin: 0; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} +button, +input { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + padding: 0; + border-style: none; +} +input[type='radio'], +input[type='checkbox'] { + box-sizing: border-box; + padding: 0; +} +input[type='date'], +input[type='time'], +input[type='datetime-local'], +input[type='month'] { + -webkit-appearance: listbox; +} +textarea { + overflow: auto; + resize: vertical; +} +fieldset { + min-width: 0; + margin: 0; + padding: 0; + border: 0; +} +legend { + display: block; + width: 100%; + max-width: 100%; + margin-bottom: 0.5em; + padding: 0; + color: inherit; + font-size: 1.5em; + line-height: inherit; + white-space: normal; +} +progress { + vertical-align: baseline; +} +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} +[type='search'] { + outline-offset: -2px; + -webkit-appearance: none; +} +[type='search']::-webkit-search-cancel-button, +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} +output { + display: inline-block; +} +summary { + display: list-item; +} +template { + display: none; +} +[hidden] { + display: none !important; +} +mark { + padding: 0.2em; + background-color: #feffe6; +} +::-moz-selection { + color: #fff; + background: #1890ff; +} +::selection { + color: #fff; + background: #1890ff; +} +.clearfix::before { + display: table; + content: ''; +} +.clearfix::after { + display: table; + clear: both; + content: ''; +} +.anticon { + display: inline-flex; + align-items: center; + color: inherit; + font-style: normal; + line-height: 0; + text-align: center; + text-transform: none; + vertical-align: -0.125em; + text-rendering: optimizelegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.anticon > * { + line-height: 1; +} +.anticon svg { + display: inline-block; +} +.anticon::before { + display: none; +} +.anticon .anticon-icon { + display: block; +} +.anticon > .anticon { + line-height: 0; + vertical-align: 0; +} +.anticon[tabindex] { + cursor: pointer; +} +.anticon-spin, +.anticon-spin::before { + display: inline-block; + animation: loadingCircle 1s infinite linear; +} +.ant-fade-enter, +.ant-fade-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-fade-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-fade-enter.ant-fade-enter-active, +.ant-fade-appear.ant-fade-appear-active { + animation-name: antFadeIn; + animation-play-state: running; +} +.ant-fade-leave.ant-fade-leave-active { + animation-name: antFadeOut; + animation-play-state: running; + pointer-events: none; +} +.ant-fade-enter, +.ant-fade-appear { + opacity: 0; + animation-timing-function: linear; +} +.ant-fade-leave { + animation-timing-function: linear; +} +@keyframes antFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes antFadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +.ant-move-up-enter, +.ant-move-up-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-up-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-up-enter.ant-move-up-enter-active, +.ant-move-up-appear.ant-move-up-appear-active { + animation-name: antMoveUpIn; + animation-play-state: running; +} +.ant-move-up-leave.ant-move-up-leave-active { + animation-name: antMoveUpOut; + animation-play-state: running; + pointer-events: none; +} +.ant-move-up-enter, +.ant-move-up-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-move-up-leave { + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.ant-move-down-enter, +.ant-move-down-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-down-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-down-enter.ant-move-down-enter-active, +.ant-move-down-appear.ant-move-down-appear-active { + animation-name: antMoveDownIn; + animation-play-state: running; +} +.ant-move-down-leave.ant-move-down-leave-active { + animation-name: antMoveDownOut; + animation-play-state: running; + pointer-events: none; +} +.ant-move-down-enter, +.ant-move-down-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-move-down-leave { + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.ant-move-left-enter, +.ant-move-left-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-left-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-left-enter.ant-move-left-enter-active, +.ant-move-left-appear.ant-move-left-appear-active { + animation-name: antMoveLeftIn; + animation-play-state: running; +} +.ant-move-left-leave.ant-move-left-leave-active { + animation-name: antMoveLeftOut; + animation-play-state: running; + pointer-events: none; +} +.ant-move-left-enter, +.ant-move-left-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-move-left-leave { + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.ant-move-right-enter, +.ant-move-right-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-right-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-right-enter.ant-move-right-enter-active, +.ant-move-right-appear.ant-move-right-appear-active { + animation-name: antMoveRightIn; + animation-play-state: running; +} +.ant-move-right-leave.ant-move-right-leave-active { + animation-name: antMoveRightOut; + animation-play-state: running; + pointer-events: none; +} +.ant-move-right-enter, +.ant-move-right-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-move-right-leave { + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +@keyframes antMoveDownIn { + 0% { + transform: translateY(100%); + transform-origin: 0 0; + opacity: 0; + } + 100% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } +} +@keyframes antMoveDownOut { + 0% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } + 100% { + transform: translateY(100%); + transform-origin: 0 0; + opacity: 0; + } +} +@keyframes antMoveLeftIn { + 0% { + transform: translateX(-100%); + transform-origin: 0 0; + opacity: 0; + } + 100% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } +} +@keyframes antMoveLeftOut { + 0% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } + 100% { + transform: translateX(-100%); + transform-origin: 0 0; + opacity: 0; + } +} +@keyframes antMoveRightIn { + 0% { + transform: translateX(100%); + transform-origin: 0 0; + opacity: 0; + } + 100% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } +} +@keyframes antMoveRightOut { + 0% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } + 100% { + transform: translateX(100%); + transform-origin: 0 0; + opacity: 0; + } +} +@keyframes antMoveUpIn { + 0% { + transform: translateY(-100%); + transform-origin: 0 0; + opacity: 0; + } + 100% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } +} +@keyframes antMoveUpOut { + 0% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } + 100% { + transform: translateY(-100%); + transform-origin: 0 0; + opacity: 0; + } +} +@keyframes loadingCircle { + 100% { + transform: rotate(360deg); + } +} +[ant-click-animating='true'], +[ant-click-animating-without-extra-node='true'] { + position: relative; +} +html { + --antd-wave-shadow-color: #1890ff; + --scroll-bar: 0; +} +[ant-click-animating-without-extra-node='true']::after, +.ant-click-animating-node { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + display: block; + border-radius: inherit; + box-shadow: 0 0 0 0 #1890ff; + box-shadow: 0 0 0 0 var(--antd-wave-shadow-color); + opacity: 0.2; + animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1); + animation-fill-mode: forwards; + content: ''; + pointer-events: none; +} +@keyframes waveEffect { + 100% { + box-shadow: 0 0 0 #1890ff; + box-shadow: 0 0 0 6px var(--antd-wave-shadow-color); + } +} +@keyframes fadeEffect { + 100% { + opacity: 0; + } +} +.ant-slide-up-enter, +.ant-slide-up-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-up-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-up-enter.ant-slide-up-enter-active, +.ant-slide-up-appear.ant-slide-up-appear-active { + animation-name: antSlideUpIn; + animation-play-state: running; +} +.ant-slide-up-leave.ant-slide-up-leave-active { + animation-name: antSlideUpOut; + animation-play-state: running; + pointer-events: none; +} +.ant-slide-up-enter, +.ant-slide-up-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.ant-slide-up-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.ant-slide-down-enter, +.ant-slide-down-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-down-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-down-enter.ant-slide-down-enter-active, +.ant-slide-down-appear.ant-slide-down-appear-active { + animation-name: antSlideDownIn; + animation-play-state: running; +} +.ant-slide-down-leave.ant-slide-down-leave-active { + animation-name: antSlideDownOut; + animation-play-state: running; + pointer-events: none; +} +.ant-slide-down-enter, +.ant-slide-down-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.ant-slide-down-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.ant-slide-left-enter, +.ant-slide-left-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-left-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-left-enter.ant-slide-left-enter-active, +.ant-slide-left-appear.ant-slide-left-appear-active { + animation-name: antSlideLeftIn; + animation-play-state: running; +} +.ant-slide-left-leave.ant-slide-left-leave-active { + animation-name: antSlideLeftOut; + animation-play-state: running; + pointer-events: none; +} +.ant-slide-left-enter, +.ant-slide-left-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.ant-slide-left-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.ant-slide-right-enter, +.ant-slide-right-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-right-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-right-enter.ant-slide-right-enter-active, +.ant-slide-right-appear.ant-slide-right-appear-active { + animation-name: antSlideRightIn; + animation-play-state: running; +} +.ant-slide-right-leave.ant-slide-right-leave-active { + animation-name: antSlideRightOut; + animation-play-state: running; + pointer-events: none; +} +.ant-slide-right-enter, +.ant-slide-right-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.ant-slide-right-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +@keyframes antSlideUpIn { + 0% { + transform: scaleY(0.8); + transform-origin: 0% 0%; + opacity: 0; + } + 100% { + transform: scaleY(1); + transform-origin: 0% 0%; + opacity: 1; + } +} +@keyframes antSlideUpOut { + 0% { + transform: scaleY(1); + transform-origin: 0% 0%; + opacity: 1; + } + 100% { + transform: scaleY(0.8); + transform-origin: 0% 0%; + opacity: 0; + } +} +@keyframes antSlideDownIn { + 0% { + transform: scaleY(0.8); + transform-origin: 100% 100%; + opacity: 0; + } + 100% { + transform: scaleY(1); + transform-origin: 100% 100%; + opacity: 1; + } +} +@keyframes antSlideDownOut { + 0% { + transform: scaleY(1); + transform-origin: 100% 100%; + opacity: 1; + } + 100% { + transform: scaleY(0.8); + transform-origin: 100% 100%; + opacity: 0; + } +} +@keyframes antSlideLeftIn { + 0% { + transform: scaleX(0.8); + transform-origin: 0% 0%; + opacity: 0; + } + 100% { + transform: scaleX(1); + transform-origin: 0% 0%; + opacity: 1; + } +} +@keyframes antSlideLeftOut { + 0% { + transform: scaleX(1); + transform-origin: 0% 0%; + opacity: 1; + } + 100% { + transform: scaleX(0.8); + transform-origin: 0% 0%; + opacity: 0; + } +} +@keyframes antSlideRightIn { + 0% { + transform: scaleX(0.8); + transform-origin: 100% 0%; + opacity: 0; + } + 100% { + transform: scaleX(1); + transform-origin: 100% 0%; + opacity: 1; + } +} +@keyframes antSlideRightOut { + 0% { + transform: scaleX(1); + transform-origin: 100% 0%; + opacity: 1; + } + 100% { + transform: scaleX(0.8); + transform-origin: 100% 0%; + opacity: 0; + } +} +.ant-zoom-enter, +.ant-zoom-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-enter.ant-zoom-enter-active, +.ant-zoom-appear.ant-zoom-appear-active { + animation-name: antZoomIn; + animation-play-state: running; +} +.ant-zoom-leave.ant-zoom-leave-active { + animation-name: antZoomOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-enter, +.ant-zoom-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-enter-prepare, +.ant-zoom-appear-prepare { + transform: none; +} +.ant-zoom-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-big-enter, +.ant-zoom-big-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-big-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-big-enter.ant-zoom-big-enter-active, +.ant-zoom-big-appear.ant-zoom-big-appear-active { + animation-name: antZoomBigIn; + animation-play-state: running; +} +.ant-zoom-big-leave.ant-zoom-big-leave-active { + animation-name: antZoomBigOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-big-enter, +.ant-zoom-big-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-big-enter-prepare, +.ant-zoom-big-appear-prepare { + transform: none; +} +.ant-zoom-big-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-big-fast-enter, +.ant-zoom-big-fast-appear { + animation-duration: 0.1s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-big-fast-leave { + animation-duration: 0.1s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active, +.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active { + animation-name: antZoomBigIn; + animation-play-state: running; +} +.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active { + animation-name: antZoomBigOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-big-fast-enter, +.ant-zoom-big-fast-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-big-fast-enter-prepare, +.ant-zoom-big-fast-appear-prepare { + transform: none; +} +.ant-zoom-big-fast-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-up-enter, +.ant-zoom-up-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-up-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-up-enter.ant-zoom-up-enter-active, +.ant-zoom-up-appear.ant-zoom-up-appear-active { + animation-name: antZoomUpIn; + animation-play-state: running; +} +.ant-zoom-up-leave.ant-zoom-up-leave-active { + animation-name: antZoomUpOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-up-enter, +.ant-zoom-up-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-up-enter-prepare, +.ant-zoom-up-appear-prepare { + transform: none; +} +.ant-zoom-up-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-down-enter, +.ant-zoom-down-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-down-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-down-enter.ant-zoom-down-enter-active, +.ant-zoom-down-appear.ant-zoom-down-appear-active { + animation-name: antZoomDownIn; + animation-play-state: running; +} +.ant-zoom-down-leave.ant-zoom-down-leave-active { + animation-name: antZoomDownOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-down-enter, +.ant-zoom-down-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-down-enter-prepare, +.ant-zoom-down-appear-prepare { + transform: none; +} +.ant-zoom-down-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-left-enter, +.ant-zoom-left-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-left-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-left-enter.ant-zoom-left-enter-active, +.ant-zoom-left-appear.ant-zoom-left-appear-active { + animation-name: antZoomLeftIn; + animation-play-state: running; +} +.ant-zoom-left-leave.ant-zoom-left-leave-active { + animation-name: antZoomLeftOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-left-enter, +.ant-zoom-left-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-left-enter-prepare, +.ant-zoom-left-appear-prepare { + transform: none; +} +.ant-zoom-left-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-right-enter, +.ant-zoom-right-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-right-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-right-enter.ant-zoom-right-enter-active, +.ant-zoom-right-appear.ant-zoom-right-appear-active { + animation-name: antZoomRightIn; + animation-play-state: running; +} +.ant-zoom-right-leave.ant-zoom-right-leave-active { + animation-name: antZoomRightOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-right-enter, +.ant-zoom-right-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-right-enter-prepare, +.ant-zoom-right-appear-prepare { + transform: none; +} +.ant-zoom-right-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +@keyframes antZoomIn { + 0% { + transform: scale(0.2); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} +@keyframes antZoomOut { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0.2); + opacity: 0; + } +} +@keyframes antZoomBigIn { + 0% { + transform: scale(0.8); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} +@keyframes antZoomBigOut { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0.8); + opacity: 0; + } +} +@keyframes antZoomUpIn { + 0% { + transform: scale(0.8); + transform-origin: 50% 0%; + opacity: 0; + } + 100% { + transform: scale(1); + transform-origin: 50% 0%; + } +} +@keyframes antZoomUpOut { + 0% { + transform: scale(1); + transform-origin: 50% 0%; + } + 100% { + transform: scale(0.8); + transform-origin: 50% 0%; + opacity: 0; + } +} +@keyframes antZoomLeftIn { + 0% { + transform: scale(0.8); + transform-origin: 0% 50%; + opacity: 0; + } + 100% { + transform: scale(1); + transform-origin: 0% 50%; + } +} +@keyframes antZoomLeftOut { + 0% { + transform: scale(1); + transform-origin: 0% 50%; + } + 100% { + transform: scale(0.8); + transform-origin: 0% 50%; + opacity: 0; + } +} +@keyframes antZoomRightIn { + 0% { + transform: scale(0.8); + transform-origin: 100% 50%; + opacity: 0; + } + 100% { + transform: scale(1); + transform-origin: 100% 50%; + } +} +@keyframes antZoomRightOut { + 0% { + transform: scale(1); + transform-origin: 100% 50%; + } + 100% { + transform: scale(0.8); + transform-origin: 100% 50%; + opacity: 0; + } +} +@keyframes antZoomDownIn { + 0% { + transform: scale(0.8); + transform-origin: 50% 100%; + opacity: 0; + } + 100% { + transform: scale(1); + transform-origin: 50% 100%; + } +} +@keyframes antZoomDownOut { + 0% { + transform: scale(1); + transform-origin: 50% 100%; + } + 100% { + transform: scale(0.8); + transform-origin: 50% 100%; + opacity: 0; + } +} +.ant-motion-collapse-legacy { + overflow: hidden; +} +.ant-motion-collapse-legacy-active { + transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important; +} +.ant-motion-collapse { + overflow: hidden; + transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important; +} diff --git a/src/styles/default.less b/src/styles/default.less new file mode 100644 index 0000000..ecec084 --- /dev/null +++ b/src/styles/default.less @@ -0,0 +1,4 @@ +// This is same as `index.less` but given `root-entry-name` for `dist/antd.less` usage +@root-entry-name: default; + +@import './index'; diff --git a/src/styles/index-pure.less b/src/styles/index-pure.less new file mode 100644 index 0000000..04efa3b --- /dev/null +++ b/src/styles/index-pure.less @@ -0,0 +1,2 @@ +@import './themes/index'; +@import './core/index'; diff --git a/src/styles/index.css b/src/styles/index.css new file mode 100644 index 0000000..b363d91 --- /dev/null +++ b/src/styles/index.css @@ -0,0 +1,1248 @@ +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +[class^=ant-]::-ms-clear, +[class*= ant-]::-ms-clear, +[class^=ant-] input::-ms-clear, +[class*= ant-] input::-ms-clear, +[class^=ant-] input::-ms-reveal, +[class*= ant-] input::-ms-reveal { + display: none; +} +/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */ +html, +body { + width: 100%; + height: 100%; +} +input::-ms-clear, +input::-ms-reveal { + display: none; +} +*, +*::before, +*::after { + box-sizing: border-box; +} +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +@-ms-viewport { + width: device-width; +} +body { + margin: 0; + color: rgba(0, 0, 0, 0.85); + font-size: 14px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + font-variant: tabular-nums; + line-height: 1.5715; + background-color: #fff; + font-feature-settings: 'tnum'; +} +[tabindex='-1']:focus { + outline: none !important; +} +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 0.5em; + color: rgba(0, 0, 0, 0.85); + font-weight: 500; +} +p { + margin-top: 0; + margin-bottom: 1em; +} +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + border-bottom: 0; + cursor: help; +} +address { + margin-bottom: 1em; + font-style: normal; + line-height: inherit; +} +input[type='text'], +input[type='password'], +input[type='number'], +textarea { + -webkit-appearance: none; +} +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1em; +} +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} +dt { + font-weight: 500; +} +dd { + margin-bottom: 0.5em; + margin-left: 0; +} +blockquote { + margin: 0 0 1em; +} +dfn { + font-style: italic; +} +b, +strong { + font-weight: bolder; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +a { + color: #1890ff; + text-decoration: none; + background-color: transparent; + outline: none; + cursor: pointer; + transition: color 0.3s; + -webkit-text-decoration-skip: objects; +} +a:hover { + color: #40a9ff; +} +a:active { + color: #096dd9; +} +a:active, +a:hover { + text-decoration: none; + outline: 0; +} +a:focus { + text-decoration: none; + outline: 0; +} +a[disabled] { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +pre, +code, +kbd, +samp { + font-size: 1em; + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; +} +pre { + margin-top: 0; + margin-bottom: 1em; + overflow: auto; +} +figure { + margin: 0 0 1em; +} +img { + vertical-align: middle; + border-style: none; +} +a, +area, +button, +[role='button'], +input:not([type='range']), +label, +select, +summary, +textarea { + touch-action: manipulation; +} +table { + border-collapse: collapse; +} +caption { + padding-top: 0.75em; + padding-bottom: 0.3em; + color: rgba(0, 0, 0, 0.45); + text-align: left; + caption-side: bottom; +} +input, +button, +select, +optgroup, +textarea { + margin: 0; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} +button, +input { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + padding: 0; + border-style: none; +} +input[type='radio'], +input[type='checkbox'] { + box-sizing: border-box; + padding: 0; +} +input[type='date'], +input[type='time'], +input[type='datetime-local'], +input[type='month'] { + -webkit-appearance: listbox; +} +textarea { + overflow: auto; + resize: vertical; +} +fieldset { + min-width: 0; + margin: 0; + padding: 0; + border: 0; +} +legend { + display: block; + width: 100%; + max-width: 100%; + margin-bottom: 0.5em; + padding: 0; + color: inherit; + font-size: 1.5em; + line-height: inherit; + white-space: normal; +} +progress { + vertical-align: baseline; +} +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} +[type='search'] { + outline-offset: -2px; + -webkit-appearance: none; +} +[type='search']::-webkit-search-cancel-button, +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} +output { + display: inline-block; +} +summary { + display: list-item; +} +template { + display: none; +} +[hidden] { + display: none !important; +} +mark { + padding: 0.2em; + background-color: #feffe6; +} +::-moz-selection { + color: #fff; + background: #1890ff; +} +::selection { + color: #fff; + background: #1890ff; +} +.clearfix::before { + display: table; + content: ''; +} +.clearfix::after { + display: table; + clear: both; + content: ''; +} +.anticon { + display: inline-flex; + align-items: center; + color: inherit; + font-style: normal; + line-height: 0; + text-align: center; + text-transform: none; + vertical-align: -0.125em; + text-rendering: optimizelegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.anticon > * { + line-height: 1; +} +.anticon svg { + display: inline-block; +} +.anticon::before { + display: none; +} +.anticon .anticon-icon { + display: block; +} +.anticon > .anticon { + line-height: 0; + vertical-align: 0; +} +.anticon[tabindex] { + cursor: pointer; +} +.anticon-spin, +.anticon-spin::before { + display: inline-block; + animation: loadingCircle 1s infinite linear; +} +.ant-fade-enter, +.ant-fade-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-fade-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-fade-enter.ant-fade-enter-active, +.ant-fade-appear.ant-fade-appear-active { + animation-name: antFadeIn; + animation-play-state: running; +} +.ant-fade-leave.ant-fade-leave-active { + animation-name: antFadeOut; + animation-play-state: running; + pointer-events: none; +} +.ant-fade-enter, +.ant-fade-appear { + opacity: 0; + animation-timing-function: linear; +} +.ant-fade-leave { + animation-timing-function: linear; +} +@keyframes antFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes antFadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +.ant-move-up-enter, +.ant-move-up-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-up-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-up-enter.ant-move-up-enter-active, +.ant-move-up-appear.ant-move-up-appear-active { + animation-name: antMoveUpIn; + animation-play-state: running; +} +.ant-move-up-leave.ant-move-up-leave-active { + animation-name: antMoveUpOut; + animation-play-state: running; + pointer-events: none; +} +.ant-move-up-enter, +.ant-move-up-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-move-up-leave { + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.ant-move-down-enter, +.ant-move-down-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-down-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-down-enter.ant-move-down-enter-active, +.ant-move-down-appear.ant-move-down-appear-active { + animation-name: antMoveDownIn; + animation-play-state: running; +} +.ant-move-down-leave.ant-move-down-leave-active { + animation-name: antMoveDownOut; + animation-play-state: running; + pointer-events: none; +} +.ant-move-down-enter, +.ant-move-down-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-move-down-leave { + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.ant-move-left-enter, +.ant-move-left-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-left-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-left-enter.ant-move-left-enter-active, +.ant-move-left-appear.ant-move-left-appear-active { + animation-name: antMoveLeftIn; + animation-play-state: running; +} +.ant-move-left-leave.ant-move-left-leave-active { + animation-name: antMoveLeftOut; + animation-play-state: running; + pointer-events: none; +} +.ant-move-left-enter, +.ant-move-left-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-move-left-leave { + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.ant-move-right-enter, +.ant-move-right-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-right-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-move-right-enter.ant-move-right-enter-active, +.ant-move-right-appear.ant-move-right-appear-active { + animation-name: antMoveRightIn; + animation-play-state: running; +} +.ant-move-right-leave.ant-move-right-leave-active { + animation-name: antMoveRightOut; + animation-play-state: running; + pointer-events: none; +} +.ant-move-right-enter, +.ant-move-right-appear { + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-move-right-leave { + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +@keyframes antMoveDownIn { + 0% { + transform: translateY(100%); + transform-origin: 0 0; + opacity: 0; + } + 100% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } +} +@keyframes antMoveDownOut { + 0% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } + 100% { + transform: translateY(100%); + transform-origin: 0 0; + opacity: 0; + } +} +@keyframes antMoveLeftIn { + 0% { + transform: translateX(-100%); + transform-origin: 0 0; + opacity: 0; + } + 100% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } +} +@keyframes antMoveLeftOut { + 0% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } + 100% { + transform: translateX(-100%); + transform-origin: 0 0; + opacity: 0; + } +} +@keyframes antMoveRightIn { + 0% { + transform: translateX(100%); + transform-origin: 0 0; + opacity: 0; + } + 100% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } +} +@keyframes antMoveRightOut { + 0% { + transform: translateX(0%); + transform-origin: 0 0; + opacity: 1; + } + 100% { + transform: translateX(100%); + transform-origin: 0 0; + opacity: 0; + } +} +@keyframes antMoveUpIn { + 0% { + transform: translateY(-100%); + transform-origin: 0 0; + opacity: 0; + } + 100% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } +} +@keyframes antMoveUpOut { + 0% { + transform: translateY(0%); + transform-origin: 0 0; + opacity: 1; + } + 100% { + transform: translateY(-100%); + transform-origin: 0 0; + opacity: 0; + } +} +@keyframes loadingCircle { + 100% { + transform: rotate(360deg); + } +} +[ant-click-animating='true'], +[ant-click-animating-without-extra-node='true'] { + position: relative; +} +html { + --antd-wave-shadow-color: #1890ff; + --scroll-bar: 0; +} +[ant-click-animating-without-extra-node='true']::after, +.ant-click-animating-node { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + display: block; + border-radius: inherit; + box-shadow: 0 0 0 0 #1890ff; + box-shadow: 0 0 0 0 var(--antd-wave-shadow-color); + opacity: 0.2; + animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1); + animation-fill-mode: forwards; + content: ''; + pointer-events: none; +} +@keyframes waveEffect { + 100% { + box-shadow: 0 0 0 #1890ff; + box-shadow: 0 0 0 6px var(--antd-wave-shadow-color); + } +} +@keyframes fadeEffect { + 100% { + opacity: 0; + } +} +.ant-slide-up-enter, +.ant-slide-up-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-up-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-up-enter.ant-slide-up-enter-active, +.ant-slide-up-appear.ant-slide-up-appear-active { + animation-name: antSlideUpIn; + animation-play-state: running; +} +.ant-slide-up-leave.ant-slide-up-leave-active { + animation-name: antSlideUpOut; + animation-play-state: running; + pointer-events: none; +} +.ant-slide-up-enter, +.ant-slide-up-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.ant-slide-up-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.ant-slide-down-enter, +.ant-slide-down-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-down-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-down-enter.ant-slide-down-enter-active, +.ant-slide-down-appear.ant-slide-down-appear-active { + animation-name: antSlideDownIn; + animation-play-state: running; +} +.ant-slide-down-leave.ant-slide-down-leave-active { + animation-name: antSlideDownOut; + animation-play-state: running; + pointer-events: none; +} +.ant-slide-down-enter, +.ant-slide-down-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.ant-slide-down-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.ant-slide-left-enter, +.ant-slide-left-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-left-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-left-enter.ant-slide-left-enter-active, +.ant-slide-left-appear.ant-slide-left-appear-active { + animation-name: antSlideLeftIn; + animation-play-state: running; +} +.ant-slide-left-leave.ant-slide-left-leave-active { + animation-name: antSlideLeftOut; + animation-play-state: running; + pointer-events: none; +} +.ant-slide-left-enter, +.ant-slide-left-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.ant-slide-left-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.ant-slide-right-enter, +.ant-slide-right-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-right-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-slide-right-enter.ant-slide-right-enter-active, +.ant-slide-right-appear.ant-slide-right-appear-active { + animation-name: antSlideRightIn; + animation-play-state: running; +} +.ant-slide-right-leave.ant-slide-right-leave-active { + animation-name: antSlideRightOut; + animation-play-state: running; + pointer-events: none; +} +.ant-slide-right-enter, +.ant-slide-right-appear { + transform: scale(0); + transform-origin: 0% 0%; + opacity: 0; + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.ant-slide-right-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +@keyframes antSlideUpIn { + 0% { + transform: scaleY(0.8); + transform-origin: 0% 0%; + opacity: 0; + } + 100% { + transform: scaleY(1); + transform-origin: 0% 0%; + opacity: 1; + } +} +@keyframes antSlideUpOut { + 0% { + transform: scaleY(1); + transform-origin: 0% 0%; + opacity: 1; + } + 100% { + transform: scaleY(0.8); + transform-origin: 0% 0%; + opacity: 0; + } +} +@keyframes antSlideDownIn { + 0% { + transform: scaleY(0.8); + transform-origin: 100% 100%; + opacity: 0; + } + 100% { + transform: scaleY(1); + transform-origin: 100% 100%; + opacity: 1; + } +} +@keyframes antSlideDownOut { + 0% { + transform: scaleY(1); + transform-origin: 100% 100%; + opacity: 1; + } + 100% { + transform: scaleY(0.8); + transform-origin: 100% 100%; + opacity: 0; + } +} +@keyframes antSlideLeftIn { + 0% { + transform: scaleX(0.8); + transform-origin: 0% 0%; + opacity: 0; + } + 100% { + transform: scaleX(1); + transform-origin: 0% 0%; + opacity: 1; + } +} +@keyframes antSlideLeftOut { + 0% { + transform: scaleX(1); + transform-origin: 0% 0%; + opacity: 1; + } + 100% { + transform: scaleX(0.8); + transform-origin: 0% 0%; + opacity: 0; + } +} +@keyframes antSlideRightIn { + 0% { + transform: scaleX(0.8); + transform-origin: 100% 0%; + opacity: 0; + } + 100% { + transform: scaleX(1); + transform-origin: 100% 0%; + opacity: 1; + } +} +@keyframes antSlideRightOut { + 0% { + transform: scaleX(1); + transform-origin: 100% 0%; + opacity: 1; + } + 100% { + transform: scaleX(0.8); + transform-origin: 100% 0%; + opacity: 0; + } +} +.ant-zoom-enter, +.ant-zoom-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-enter.ant-zoom-enter-active, +.ant-zoom-appear.ant-zoom-appear-active { + animation-name: antZoomIn; + animation-play-state: running; +} +.ant-zoom-leave.ant-zoom-leave-active { + animation-name: antZoomOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-enter, +.ant-zoom-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-enter-prepare, +.ant-zoom-appear-prepare { + transform: none; +} +.ant-zoom-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-big-enter, +.ant-zoom-big-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-big-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-big-enter.ant-zoom-big-enter-active, +.ant-zoom-big-appear.ant-zoom-big-appear-active { + animation-name: antZoomBigIn; + animation-play-state: running; +} +.ant-zoom-big-leave.ant-zoom-big-leave-active { + animation-name: antZoomBigOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-big-enter, +.ant-zoom-big-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-big-enter-prepare, +.ant-zoom-big-appear-prepare { + transform: none; +} +.ant-zoom-big-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-big-fast-enter, +.ant-zoom-big-fast-appear { + animation-duration: 0.1s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-big-fast-leave { + animation-duration: 0.1s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active, +.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active { + animation-name: antZoomBigIn; + animation-play-state: running; +} +.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active { + animation-name: antZoomBigOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-big-fast-enter, +.ant-zoom-big-fast-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-big-fast-enter-prepare, +.ant-zoom-big-fast-appear-prepare { + transform: none; +} +.ant-zoom-big-fast-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-up-enter, +.ant-zoom-up-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-up-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-up-enter.ant-zoom-up-enter-active, +.ant-zoom-up-appear.ant-zoom-up-appear-active { + animation-name: antZoomUpIn; + animation-play-state: running; +} +.ant-zoom-up-leave.ant-zoom-up-leave-active { + animation-name: antZoomUpOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-up-enter, +.ant-zoom-up-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-up-enter-prepare, +.ant-zoom-up-appear-prepare { + transform: none; +} +.ant-zoom-up-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-down-enter, +.ant-zoom-down-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-down-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-down-enter.ant-zoom-down-enter-active, +.ant-zoom-down-appear.ant-zoom-down-appear-active { + animation-name: antZoomDownIn; + animation-play-state: running; +} +.ant-zoom-down-leave.ant-zoom-down-leave-active { + animation-name: antZoomDownOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-down-enter, +.ant-zoom-down-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-down-enter-prepare, +.ant-zoom-down-appear-prepare { + transform: none; +} +.ant-zoom-down-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-left-enter, +.ant-zoom-left-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-left-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-left-enter.ant-zoom-left-enter-active, +.ant-zoom-left-appear.ant-zoom-left-appear-active { + animation-name: antZoomLeftIn; + animation-play-state: running; +} +.ant-zoom-left-leave.ant-zoom-left-leave-active { + animation-name: antZoomLeftOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-left-enter, +.ant-zoom-left-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-left-enter-prepare, +.ant-zoom-left-appear-prepare { + transform: none; +} +.ant-zoom-left-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-zoom-right-enter, +.ant-zoom-right-appear { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-right-leave { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-play-state: paused; +} +.ant-zoom-right-enter.ant-zoom-right-enter-active, +.ant-zoom-right-appear.ant-zoom-right-appear-active { + animation-name: antZoomRightIn; + animation-play-state: running; +} +.ant-zoom-right-leave.ant-zoom-right-leave-active { + animation-name: antZoomRightOut; + animation-play-state: running; + pointer-events: none; +} +.ant-zoom-right-enter, +.ant-zoom-right-appear { + transform: scale(0); + opacity: 0; + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.ant-zoom-right-enter-prepare, +.ant-zoom-right-appear-prepare { + transform: none; +} +.ant-zoom-right-leave { + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +@keyframes antZoomIn { + 0% { + transform: scale(0.2); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} +@keyframes antZoomOut { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0.2); + opacity: 0; + } +} +@keyframes antZoomBigIn { + 0% { + transform: scale(0.8); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} +@keyframes antZoomBigOut { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0.8); + opacity: 0; + } +} +@keyframes antZoomUpIn { + 0% { + transform: scale(0.8); + transform-origin: 50% 0%; + opacity: 0; + } + 100% { + transform: scale(1); + transform-origin: 50% 0%; + } +} +@keyframes antZoomUpOut { + 0% { + transform: scale(1); + transform-origin: 50% 0%; + } + 100% { + transform: scale(0.8); + transform-origin: 50% 0%; + opacity: 0; + } +} +@keyframes antZoomLeftIn { + 0% { + transform: scale(0.8); + transform-origin: 0% 50%; + opacity: 0; + } + 100% { + transform: scale(1); + transform-origin: 0% 50%; + } +} +@keyframes antZoomLeftOut { + 0% { + transform: scale(1); + transform-origin: 0% 50%; + } + 100% { + transform: scale(0.8); + transform-origin: 0% 50%; + opacity: 0; + } +} +@keyframes antZoomRightIn { + 0% { + transform: scale(0.8); + transform-origin: 100% 50%; + opacity: 0; + } + 100% { + transform: scale(1); + transform-origin: 100% 50%; + } +} +@keyframes antZoomRightOut { + 0% { + transform: scale(1); + transform-origin: 100% 50%; + } + 100% { + transform: scale(0.8); + transform-origin: 100% 50%; + opacity: 0; + } +} +@keyframes antZoomDownIn { + 0% { + transform: scale(0.8); + transform-origin: 50% 100%; + opacity: 0; + } + 100% { + transform: scale(1); + transform-origin: 50% 100%; + } +} +@keyframes antZoomDownOut { + 0% { + transform: scale(1); + transform-origin: 50% 100%; + } + 100% { + transform: scale(0.8); + transform-origin: 50% 100%; + opacity: 0; + } +} +.ant-motion-collapse-legacy { + overflow: hidden; +} +.ant-motion-collapse-legacy-active { + transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important; +} +.ant-motion-collapse { + overflow: hidden; + transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important; +} diff --git a/src/styles/index.d.ts b/src/styles/index.d.ts new file mode 100644 index 0000000..d74e52e --- /dev/null +++ b/src/styles/index.d.ts @@ -0,0 +1 @@ +import './index.less'; diff --git a/src/styles/index.js b/src/styles/index.js new file mode 100644 index 0000000..17665f8 --- /dev/null +++ b/src/styles/index.js @@ -0,0 +1 @@ +import './index.less'; \ No newline at end of file diff --git a/src/styles/index.less b/src/styles/index.less new file mode 100644 index 0000000..7882cea --- /dev/null +++ b/src/styles/index.less @@ -0,0 +1,3 @@ +@root-entry-name: default; + +@import './index-pure.less'; \ No newline at end of file diff --git a/src/styles/mixins/box.less b/src/styles/mixins/box.less new file mode 100644 index 0000000..4bd3ffa --- /dev/null +++ b/src/styles/mixins/box.less @@ -0,0 +1,7 @@ +.box(@position: absolute) { + position: @position; + top: 0; + right: 0; + bottom: 0; + left: 0; +} diff --git a/src/styles/mixins/clearfix.less b/src/styles/mixins/clearfix.less new file mode 100644 index 0000000..07e89f8 --- /dev/null +++ b/src/styles/mixins/clearfix.less @@ -0,0 +1,16 @@ +// mixins for clearfix +// ------------------------ +.clearfix() { + // https://github.com/ant-design/ant-design/issues/21301#issuecomment-583955229 + &::before { + display: table; + content: ''; + } + + &::after { + // https://github.com/ant-design/ant-design/issues/21864 + display: table; + clear: both; + content: ''; + } +} diff --git a/src/styles/mixins/compact-item-vertical.less b/src/styles/mixins/compact-item-vertical.less new file mode 100644 index 0000000..503b1f0 --- /dev/null +++ b/src/styles/mixins/compact-item-vertical.less @@ -0,0 +1,41 @@ +.compact-item-vertical-border-radius(@prefix-cls) { + &-item:not(&-first-item):not(&-last-item) { + border-radius: 0; + } + + &-item&-first-item:not(&-last-item) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + &-item&-last-item:not(&-first-item) { + border-top-left-radius: 0; + border-top-right-radius: 0; + } +} + +.compact-item-vertical-border(@prefix-cls) { + // border collapse + &-item:not(&-last-item) { + margin-bottom: -@border-width-base; + } + + &-item { + &:hover, + &:focus, + &:active { + z-index: 2; + } + + &[disabled] { + z-index: 0; + } + } +} + +.compact-item-vertical(@prefix-cls) { + &-compact-vertical { + .compact-item-vertical-border(@prefix-cls); + .compact-item-vertical-border-radius(@prefix-cls); + } +} diff --git a/src/styles/mixins/compact-item.less b/src/styles/mixins/compact-item.less new file mode 100644 index 0000000..cb49027 --- /dev/null +++ b/src/styles/mixins/compact-item.less @@ -0,0 +1,133 @@ +.compact-item-border-radius(@prefix-cls, @bordered-item-cls: null) { + & when (@bordered-item-cls = null) { + // border-radius + &-item:not(&-first-item):not(&-last-item).@{prefix-cls} { + border-radius: 0; + } + + &-item.@{prefix-cls}&-first-item:not(&-last-item):not(&-item-rtl) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + &-item.@{prefix-cls}&-last-item:not(&-first-item):not(&-item-rtl) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + // ----------rtl for first item---------- + &-item.@{prefix-cls}&-item-rtl&-first-item:not(&-last-item) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + // ----------rtl for last item---------- + &-item.@{prefix-cls}&-item-rtl&-last-item:not(&-first-item) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + + & when (not (@bordered-item-cls = null)) { + // border-radius + &-item:not(&-first-item):not(&-last-item).@{prefix-cls} > .@{bordered-item-cls} { + border-radius: 0; + } + + &-item&-first-item.@{prefix-cls}:not(&-last-item):not(&-item-rtl) > .@{bordered-item-cls} { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + &-item&-last-item.@{prefix-cls}:not(&-first-item):not(&-item-rtl) > .@{bordered-item-cls} { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + // ----------rtl for first item---------- + &-item.@{prefix-cls}&-first-item&-item-rtl:not(&-last-item) > .@{bordered-item-cls} { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + // ----------rtl for last item---------- + &-item.@{prefix-cls}&-last-item&-item-rtl:not(&-first-item) > .@{bordered-item-cls} { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } +} + +.compact-item-border(@prefix-cls, @bordered-item-cls: null, @special-open-cls) { + & when (@bordered-item-cls = null) { + // border collapse + &-item:not(&-last-item):not(&-item-rtl) { + margin-right: -@border-width-base; + } + + // rtl border collapse + &-item:not(&-last-item)&-item-rtl { + margin-left: -@border-width-base; + } + + &-item { + &:hover, + &:focus, + &:active { + z-index: 2; + } + + // Select has an extra focus className + & when (not (@special-item-cls = null)) { + &.@{special-item-cls} { + z-index: 2; + } + } + + &[disabled] { + z-index: 0; + } + } + } + + & when (not (@bordered-item-cls = null)) { + // border collapse + &-item:not(&-last-item) { + margin-right: -@border-width-base; + + &.@{prefix-cls}-compact-item-rtl { + margin-right: 0; + margin-left: -@border-width-base; + } + } + + &-item { + &:hover, + &:focus, + &:active { + > * { + z-index: 2; + } + } + + // Select has an special focus-item + & when (not (@special-item-cls = null)) { + &.@{special-item-cls} > * { + z-index: 2; + } + } + + &[disabled] > * { + z-index: 0; + } + } + } +} + +.compact-item(@prefix-cls, @bordered-item-cls: null, @special-item-cls: null) { + &-compact { + .compact-item-border(@prefix-cls, @bordered-item-cls, @special-item-cls); + + .compact-item-border-radius(@prefix-cls, @bordered-item-cls); + } +} diff --git a/src/styles/mixins/compatibility.less b/src/styles/mixins/compatibility.less new file mode 100644 index 0000000..9464a75 --- /dev/null +++ b/src/styles/mixins/compatibility.less @@ -0,0 +1,13 @@ +// Compatibility for browsers. + +// Placeholder text +.placeholder(@color: @input-placeholder-color) { + &::placeholder { + color: @color; + user-select: none; // https://github.com/ant-design/ant-design/pull/32639 + } + + &:placeholder-shown { + text-overflow: ellipsis; + } +} diff --git a/src/styles/mixins/customize.less b/src/styles/mixins/customize.less new file mode 100644 index 0000000..6f6fc18 --- /dev/null +++ b/src/styles/mixins/customize.less @@ -0,0 +1,181 @@ +// customize dark components background in popover containers(like Modal, Drawer, Card, Popover, Popconfirm, Notification, ...) +// for dark theme +.popover-customize-bg(@containerClass, @background: @popover-background, @prefix: @ant-prefix) + when + (@theme = dark) { + @picker-prefix-cls: ~'@{prefix}-picker'; + @slider-prefix-cls: ~'@{prefix}-slider'; + @anchor-prefix-cls: ~'@{prefix}-anchor'; + @collapse-prefix-cls: ~'@{prefix}-collapse'; + @tab-prefix-cls: ~'@{prefix}-tabs'; + @timeline-prefix-cls: ~'@{prefix}-timeline'; + @tree-prefix-cls: ~'@{prefix}-tree'; + @card-prefix-cls: ~'@{prefix}-card'; + @badge-prefix-cls: ~'@{prefix}-badge'; + @transfer-prefix-cls: ~'@{prefix}-transfer'; + @calendar-prefix-cls: ~'@{prefix}-picker-calendar'; + @calendar-picker-prefix-cls: ~'@{prefix}-picker'; + @table-prefix-cls: ~'@{prefix}-table'; + + @popover-border: @border-width-base @border-style-base @popover-customize-border-color; + + .@{containerClass} { + .@{picker-prefix-cls}-clear, + .@{slider-prefix-cls}-handle, + .@{anchor-prefix-cls}-wrapper, + .@{collapse-prefix-cls}-content, + .@{timeline-prefix-cls}-item-head, + .@{card-prefix-cls} { + background-color: @background; + } + + .@{transfer-prefix-cls} { + &-list { + &-header { + background: @background; + border-bottom: @popover-border; + } + &-content-item:not(.@{transfer-prefix-cls}-list-content-item-disabled):hover { + background-color: @item-hover-bg; + } + } + } + + tr.@{table-prefix-cls}-expanded-row { + &, + &:hover { + > td { + background: #272727; + } + } + } + .@{table-prefix-cls}.@{table-prefix-cls}-small { + thead { + > tr { + > th { + background-color: @background; + border-bottom: @popover-border; + } + } + } + } + .@{table-prefix-cls} { + background-color: @background; + .@{table-prefix-cls}-row-expand-icon { + border: @popover-border; + } + + tfoot { + > tr { + > th, + > td { + border-bottom: @popover-border; + } + } + } + + thead { + > tr { + > th { + background-color: #272727; + border-bottom: @popover-border; + } + } + } + + tbody { + > tr { + > td { + border-bottom: @popover-border; + &.@{table-prefix-cls}-cell-fix-left, + &.@{table-prefix-cls}-cell-fix-right { + background-color: @background; + } + } + &.@{table-prefix-cls}-row:hover { + > td { + background: @table-header-sort-active-bg; + } + } + } + } + &.@{table-prefix-cls}-bordered { + .@{table-prefix-cls}-title { + border: @popover-border; + } + + // ============================= Cell ============================= + thead > tr > th, + tbody > tr > td, + tfoot > tr > th, + tfoot > tr > td { + border-right: @popover-border; + } + + // Fixed right should provides additional border + .@{table-prefix-cls}-cell-fix-right-first::after { + border-right: @popover-border; + } + + // ============================ Header ============================ + table > { + thead { + > tr:not(:last-child) > th { + border-bottom: @border-width-base @border-style-base @border-color-split; + } + } + } + + // =========================== Content ============================ + .@{table-prefix-cls}-container { + border: @popover-border; + } + + // ========================== Expandable ========================== + .@{table-prefix-cls}-expanded-row-fixed { + &::after { + border-right: @popover-border; + } + } + + .@{table-prefix-cls}-footer { + border: @popover-border; + } + } + .@{table-prefix-cls}-filter-trigger-container-open { + background-color: #525252; + } + } + + .@{calendar-prefix-cls}-full { + background-color: @background; + .@{calendar-picker-prefix-cls}-panel { + background-color: @background; + .@{calendar-prefix-cls}-date { + border-top: 2px solid @popover-customize-border-color; + } + } + } + + .@{tab-prefix-cls} { + &.@{tab-prefix-cls}-card .@{tab-prefix-cls}-card-bar .@{tab-prefix-cls}-tab-active { + background-color: @background; + border-bottom: @border-width-base solid @background; + } + } + + .@{badge-prefix-cls} { + &-count { + box-shadow: 0 0 0 1px @background; + } + } + + .@{tree-prefix-cls} { + &-show-line { + .@{tree-prefix-cls}-switcher { + background: @background; + } + } + } + } +} diff --git a/src/styles/mixins/iconfont.less b/src/styles/mixins/iconfont.less new file mode 100644 index 0000000..aeb4e96 --- /dev/null +++ b/src/styles/mixins/iconfont.less @@ -0,0 +1,29 @@ +.iconfont-mixin() { + display: inline-flex; + align-items: center; + color: @icon-color; + font-style: normal; + line-height: 0; + text-align: center; + text-transform: none; + vertical-align: -0.125em; // for SVG icon, see https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4 + text-rendering: optimizelegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + > * { + line-height: 1; + } + + svg { + display: inline-block; + } + + &::before { + display: none; // dont display old icon. + } + + & &-icon { + display: block; + } +} diff --git a/src/styles/mixins/index.less b/src/styles/mixins/index.less new file mode 100644 index 0000000..5438846 --- /dev/null +++ b/src/styles/mixins/index.less @@ -0,0 +1,16 @@ +// Mixins +// -------------------------------------------------- +@import 'size'; +@import 'compatibility'; +@import 'clearfix'; +@import 'iconfont'; +@import 'typography'; +@import 'customize'; +@import 'box'; +@import 'modal-mask'; +@import 'motion'; +@import 'reset'; +@import 'operation-unit'; +@import 'rounded-arrow'; +@import 'compact-item'; +@import 'compact-item-vertical'; diff --git a/src/styles/mixins/modal-mask.less b/src/styles/mixins/modal-mask.less new file mode 100644 index 0000000..b406bc1 --- /dev/null +++ b/src/styles/mixins/modal-mask.less @@ -0,0 +1,30 @@ +@import 'box'; + +.modal-mask() { + pointer-events: none; + + &.@{ant-prefix}-zoom-enter, + &.@{ant-prefix}-zoom-appear { + transform: none; // reset scale avoid mousePosition bug + opacity: 0; + animation-duration: @animation-duration-slow; + user-select: none; // https://github.com/ant-design/ant-design/issues/11777 + } + + &-mask { + .box(fixed); + z-index: @zindex-modal-mask; + height: 100%; + background-color: @modal-mask-bg; + + &-hidden { + display: none; + } + } + + &-wrap { + .box(fixed); + overflow: auto; + outline: 0; + } +} diff --git a/src/styles/mixins/motion.less b/src/styles/mixins/motion.less new file mode 100644 index 0000000..1e15350 --- /dev/null +++ b/src/styles/mixins/motion.less @@ -0,0 +1,33 @@ +.motion-common(@duration: @animation-duration-base) { + animation-duration: @duration; + animation-fill-mode: both; +} + +.motion-common-leave(@duration: @animation-duration-base) { + animation-duration: @duration; + animation-fill-mode: both; +} + +.make-motion(@className, @keyframeName, @duration: @animation-duration-base) { + .@{className}-enter, + .@{className}-appear { + .motion-common(@duration); + + animation-play-state: paused; + } + .@{className}-leave { + .motion-common-leave(@duration); + + animation-play-state: paused; + } + .@{className}-enter.@{className}-enter-active, + .@{className}-appear.@{className}-appear-active { + animation-name: ~'@{keyframeName}In'; + animation-play-state: running; + } + .@{className}-leave.@{className}-leave-active { + animation-name: ~'@{keyframeName}Out'; + animation-play-state: running; + pointer-events: none; + } +} diff --git a/src/styles/mixins/operation-unit.less b/src/styles/mixins/operation-unit.less new file mode 100644 index 0000000..b695171 --- /dev/null +++ b/src/styles/mixins/operation-unit.less @@ -0,0 +1,15 @@ +.operation-unit() { + color: @link-color; + outline: none; + cursor: pointer; + transition: color 0.3s; + + &:focus-visible, + &:hover { + color: @link-hover-color; + } + + &:active { + color: @link-active-color; + } +} diff --git a/src/styles/mixins/reset.less b/src/styles/mixins/reset.less new file mode 100644 index 0000000..905c16e --- /dev/null +++ b/src/styles/mixins/reset.less @@ -0,0 +1,11 @@ +.reset-component() { + box-sizing: border-box; + margin: 0; + padding: 0; + color: @text-color; + font-size: @font-size-base; + font-variant: @font-variant-base; + line-height: @line-height-base; + list-style: none; + font-feature-settings: @font-feature-settings-base; +} diff --git a/src/styles/mixins/rounded-arrow.less b/src/styles/mixins/rounded-arrow.less new file mode 100644 index 0000000..1c82643 --- /dev/null +++ b/src/styles/mixins/rounded-arrow.less @@ -0,0 +1,44 @@ +.roundedArrow(@width, @outer-radius, @bg-color: var(--antd-arrow-background-color)) { + @corner-height: unit(((@outer-radius) * (1 - 1 / sqrt(2)))); + + @width-without-unit: unit(@width); + @outer-radius-without-unit: unit(@outer-radius); + @inner-radius-without-unit: unit(@arrow-border-radius); + + @a-x: @width-without-unit - @corner-height; + @a-y: 2 * @width-without-unit + @corner-height; + @b-x: @a-x + @outer-radius-without-unit * (1 / sqrt(2)); + @b-y: 2 * @width-without-unit; + @c-x: 2 * @width-without-unit - @inner-radius-without-unit; + @c-y: 2 * @width-without-unit; + @d-x: 2 * @width-without-unit; + @d-y: 2 * @width-without-unit - @inner-radius-without-unit; + @e-x: 2 * @width-without-unit; + @e-y: @f-y + @outer-radius-without-unit * (1 / sqrt(2)); + @f-x: 2 * @width-without-unit + @corner-height; + @f-y: @width-without-unit - @corner-height; + @g-x: @f-x - 1; + @g-y: @f-y; + @h-x: @a-x; + @h-y: @a-y - 1; + + border-radius: 0 0 @arrow-border-radius; + pointer-events: none; + + &::before { + position: absolute; + top: -@width; + left: -@width; + width: @width * 3; + height: @width * 3; + background: @bg-color; + // Hack firefox: https://github.com/ant-design/ant-design/pull/33710#issuecomment-1015287825 + background-repeat: no-repeat; + background-position: ceil(-@width + 1px) ceil(-@width + 1px); + content: ''; + clip-path: inset(33% 33%); // For browsers that do not support path() + clip-path: path( + 'M @{a-x} @{a-y} A @{outer-radius-without-unit} @{outer-radius-without-unit} 0 0 1 @{b-x} @{b-y} L @{c-x} @{c-y} A @{inner-radius-without-unit} @{inner-radius-without-unit} 0 0 0 @{d-x} @{d-y} L @{e-x} @{e-y} A @{outer-radius-without-unit} @{outer-radius-without-unit} 0 0 1 @{f-x} @{f-y} L @{g-x} @{g-y} L @{h-x} @{h-y} Z' + ); + } +} diff --git a/src/styles/mixins/size.less b/src/styles/mixins/size.less new file mode 100644 index 0000000..a8be650 --- /dev/null +++ b/src/styles/mixins/size.less @@ -0,0 +1,10 @@ +// Sizing shortcuts + +.size(@width; @height) { + width: @width; + height: @height; +} + +.square(@size) { + .size(@size; @size); +} diff --git a/src/styles/mixins/typography.less b/src/styles/mixins/typography.less new file mode 100644 index 0000000..71a4d39 --- /dev/null +++ b/src/styles/mixins/typography.less @@ -0,0 +1,58 @@ +// =============== Common =============== +.typography-paragraph() { + margin-bottom: 1em; +} + +.typography-title(@fontSize; @fontWeight; @lineHeight; @headingColor; @headingMarginBottom;) { + margin-bottom: @headingMarginBottom; + color: @headingColor; + font-weight: @fontWeight; + font-size: @fontSize; + line-height: @lineHeight; +} + +.typography-title-1() { + .typography-title( + @heading-1-size, + @typography-title-font-weight, + 1.23, + @heading-color, + @typography-title-margin-bottom + ); +} +.typography-title-2() { + .typography-title( + @heading-2-size, + @typography-title-font-weight, + 1.35, + @heading-color, + @typography-title-margin-bottom + ); +} +.typography-title-3() { + .typography-title( + @heading-3-size, + @typography-title-font-weight, + 1.35, + @heading-color, + @typography-title-margin-bottom + ); +} +.typography-title-4() { + .typography-title( + @heading-4-size, + @typography-title-font-weight, + 1.4, + @heading-color, + @typography-title-margin-bottom + ); +} +.typography-title-5() { + .typography-title( + @heading-5-size, + @typography-title-font-weight, + 1.5, + @heading-color, + @typography-title-margin-bottom + ); +} diff --git a/src/styles/themes/compact.less b/src/styles/themes/compact.less new file mode 100644 index 0000000..bd0b01d --- /dev/null +++ b/src/styles/themes/compact.less @@ -0,0 +1,295 @@ +@import './default.less'; + +@line-height-base: 1.66667; +@mode: compact; +@font-size-base: 12px; +@font-size-lg: @font-size-base + 2px; + +// default paddings +@default-padding-lg: 24px; // containers +@default-padding-md: 16px; // small containers and buttons +@default-padding-sm: 12px; // Form controls and items +@default-padding-xs: 8px; // small items +@default-padding-xss: 4px; // more small + +// vertical paddings +@padding-lg: 16px; // containers +@padding-md: 8px; // small containers and buttons +@padding-sm: 8px; // Form controls and items +@padding-xs: 4px; // small items +@padding-xss: 0px; // more small + +// vertical padding for all form controls +@control-padding-horizontal: @padding-sm; +@control-padding-horizontal-sm: @default-padding-xs; + +// vertical margins +@margin-lg: 16px; // containers +@margin-md: 8px; // small containers and buttons +@margin-sm: 8px; // Form controls and items +@margin-xs: 4px; // small items +@margin-xss: 0px; // more small + +// height rules +@height-base: 28px; +@height-lg: 32px; +@height-sm: 22px; + +// Button +// --- +@btn-padding-horizontal-base: @default-padding-sm - 1px; +@btn-padding-horizontal-lg: @btn-padding-horizontal-base; +@btn-padding-horizontal-sm: @default-padding-xs - 1px; +@btn-square-only-icon-size-lg: 16px; +@btn-square-only-icon-size: 14px; +@btn-square-only-icon-size-sm: 12px; + +// Breadcrumb +// --- +@breadcrumb-font-size: @font-size-base; +@breadcrumb-icon-font-size: @font-size-base; + +//Dropdown +@dropdown-line-height: 18px; + +// Menu +@menu-item-padding-horizontal: 12px; +@menu-horizontal-line-height: 38px; +@menu-inline-toplevel-item-height: 32px; +@menu-item-height: 32px; +@menu-item-vertical-margin: 0px; +@menu-item-boundary-margin: 0px; +@menu-icon-margin-right: 8px; + +// Checkbox +@checkbox-size: 14px; +@checkbox-group-item-margin-right: 6px; + +// picker +@picker-panel-cell-height: 22px; +@picker-panel-cell-width: 32px; +@picker-text-height: 32px; +@picker-time-panel-cell-height: 24px; +@picker-panel-without-time-cell-height: 48px; + +// Form +// --- +@form-item-margin-bottom: 16px; +@form-vertical-label-padding: 0 0 4px; + +// Rate +// --- +@rate-star-size: 16px; + +// Radio +// --- +@radio-size: 14px; +@radio-wrapper-margin-right: 6px; + +// Switch +// --- +@switch-height: 20px; +@switch-sm-height: 14px; +@switch-min-width: 40px; +@switch-sm-min-width: 24px; +@switch-inner-margin-min: 4px; +@switch-inner-margin-max: 22px; + +// Slider +// --- +@slider-handle-size: 12px; +@slider-handle-margin-top: -4px; + +// Input +// --- +@input-padding-vertical-base: round( + max( + (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) - + @border-width-base, + 2px + ) +); +@input-padding-horizontal-lg: 11px; + +// PageHeader +// --- +@page-header-padding: 16px; +@page-header-padding-vertical: 8px; +@page-header-heading-title: 16px; +@page-header-heading-sub-title: 12px; +@page-header-tabs-tab-font-size: 14px; + +// Pagination +// --- +@pagination-mini-options-size-changer-top: 1px; +@pagination-item-size-sm: 22px; + +// Cascader +// ---- +@cascader-dropdown-line-height: @dropdown-line-height; + +// Select +// --- +@select-dropdown-height: @height-base; +@select-single-item-height-lg: 32px; +@select-multiple-item-height: @input-height-base - max(@input-padding-vertical-base, 4) * 2; // Normal 24px +@select-multiple-item-height-lg: 24px; +@select-multiple-item-spacing-half: 3px; + +// Tree +// --- +@tree-title-height: 20px; + +// Transfer +// --- +@transfer-item-padding-vertical: 3px; +@transfer-list-search-icon-top: 8px; +@transfer-header-height: 36px; + +// Comment +// --- +@comment-actions-margin-bottom: 0px; +@comment-actions-margin-top: @margin-xs; +@comment-content-detail-p-margin-bottom: 0px; + +// Steps +// --- +@steps-icon-size: 24px; +@steps-icon-custom-size: 20px; +@steps-icon-custom-font-size: 20px; +@steps-icon-custom-top: 2px; +@steps-icon-margin: 2px 8px 2px 0; +@steps-icon-font-size: @font-size-base; +@steps-dot-top: 4px; +@steps-icon-top: 0px; +@steps-small-icon-size: 20px; +@steps-vertical-icon-width: 12px; +@steps-vertical-tail-width: 12px; +@steps-vertical-tail-width-sm: 10px; +// Collapse +// --- +//@collapse-header-padding-extra: 32px; +@collapse-content-padding: @padding-md @padding-lg; + +// List +// --- +@list-item-meta-description-font-size: @font-size-sm; +@list-item-padding-sm: 4px 12px; +@list-item-padding-lg: 12px 16px; + +// Drawer +// --- +@drawer-header-padding: 11px @padding-lg; +@drawer-footer-padding-vertical: @padding-sm; +@drawer-footer-padding-horizontal: @padding-sm; +@drawer-header-close-size: 44px; + +// Modal +// -- +@modal-header-padding-vertical: 11px; +@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal; +@modal-footer-padding-vertical: @padding-sm; +@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical; +@modal-confirm-body-padding: 24px 24px 16px; + +// Message +// --- +@message-notice-content-padding: 8px 16px; + +// popover +// -- +@popover-min-height: 28px; +@popover-padding-horizontal: @default-padding-sm; + +// Card +// --- +@card-head-height: 36px; +@card-head-font-size: @card-head-font-size-sm; +@card-head-padding: 8.5px; +@card-padding-base: 12px; +@card-padding-base-sm: @card-padding-base; +@card-head-height-sm: 30px; +@card-head-padding-sm: 6px; +@card-actions-li-margin: 4px 0; +@card-head-tabs-margin-bottom: -9px; + +// Table +// --- +@table-padding-vertical: 12px; +@table-padding-horizontal: 8px; +@table-padding-vertical-md: 8px; +@table-padding-horizontal-md: 8px; +@table-padding-vertical-sm: 4px; +@table-padding-horizontal-sm: 4px; +@table-selection-column-width: 32px; + +// Statistic +// --- +@statistic-content-font-size: 20px; + +// Alert +// --- +@alert-with-description-no-icon-padding-vertical: 7px; +@alert-with-description-padding-vertical: 11px; +@alert-icon-top: 7px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2); +@alert-with-description-icon-size: 20px; + +// Skeleton +// --- +@skeleton-paragraph-margin-top: 20px; +@skeleton-paragraph-li-margin-top: 12px; +@skeleton-paragraph-li-height: 14px; +@skeleton-title-height: 14px; +@skeleton-title-paragraph-margin-top: 20px; + +// Descriptions +@descriptions-title-margin-bottom: 8px; +@descriptions-default-padding: 12px @padding-lg; +@descriptions-item-padding-bottom: @padding-xs; + +// Avatar +// --- +@avatar-size-base: 28px; +@avatar-size-lg: 32px; +@avatar-size-sm: 22px; +@avatar-font-size-base: 16px; +@avatar-font-size-lg: 20px; +@avatar-font-size-sm: 12px; + +// Badge +// --- +@badge-height: 18px; + +// Tag +// --- +@tag-line-height: 18px; + +// Notification +// --- +@notification-padding-vertical: 12px; +@notification-padding-horizontal: 16px; + +// Result +// --- +@result-title-font-size: 20px; +@result-icon-font-size: 64px; +@result-extra-margin: 24px 0 0 0; + +// Anchor +// --- +@anchor-link-top: 4px; +@anchor-link-left: 16px; +@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left; + +// Tabs +// --- +@tabs-card-horizontal-padding: 4px @padding-md; + +// Progress +// --- +@progress-circle-text-font-size: 0.833333em; + +// Image +// --- +@image-size-base: 48px; +@image-font-size-base: 24px; diff --git a/src/styles/themes/dark.less b/src/styles/themes/dark.less new file mode 100644 index 0000000..4cfda90 --- /dev/null +++ b/src/styles/themes/dark.less @@ -0,0 +1,457 @@ +@import './default.less'; + +@theme: dark; +// color palettes +@blue-1: mix(color(~`colorPalette('@{blue-base}', 8) `), @component-background, 15%); +@blue-2: mix(color(~`colorPalette('@{blue-base}', 7) `), @component-background, 25%); +@blue-3: mix(@blue-base, @component-background, 30%); +@blue-4: mix(@blue-base, @component-background, 45%); +@blue-5: mix(@blue-base, @component-background, 65%); +@blue-6: mix(@blue-base, @component-background, 85%); +@blue-7: mix(color(~`colorPalette('@{blue-base}', 5) `), @component-background, 90%); +@blue-8: mix(color(~`colorPalette('@{blue-base}', 4) `), @component-background, 95%); +@blue-9: mix(color(~`colorPalette('@{blue-base}', 3) `), @component-background, 97%); +@blue-10: mix(color(~`colorPalette('@{blue-base}', 2) `), @component-background, 98%); + +@purple-1: mix(color(~`colorPalette('@{purple-base}', 8) `), @component-background, 15%); +@purple-2: mix(color(~`colorPalette('@{purple-base}', 7) `), @component-background, 25%); +@purple-3: mix(@purple-base, @component-background, 30%); +@purple-4: mix(@purple-base, @component-background, 45%); +@purple-5: mix(@purple-base, @component-background, 65%); +@purple-6: mix(@purple-base, @component-background, 85%); +@purple-7: mix(color(~`colorPalette('@{purple-base}', 5) `), @component-background, 90%); +@purple-8: mix(color(~`colorPalette('@{purple-base}', 4) `), @component-background, 95%); +@purple-9: mix(color(~`colorPalette('@{purple-base}', 3) `), @component-background, 97%); +@purple-10: mix(color(~`colorPalette('@{purple-base}', 2) `), @component-background, 98%); + +@cyan-1: mix(color(~`colorPalette('@{cyan-base}', 8) `), @component-background, 15%); +@cyan-2: mix(color(~`colorPalette('@{cyan-base}', 7) `), @component-background, 25%); +@cyan-3: mix(@cyan-base, @component-background, 30%); +@cyan-4: mix(@cyan-base, @component-background, 45%); +@cyan-5: mix(@cyan-base, @component-background, 65%); +@cyan-6: mix(@cyan-base, @component-background, 85%); +@cyan-7: mix(color(~`colorPalette('@{cyan-base}', 5) `), @component-background, 90%); +@cyan-8: mix(color(~`colorPalette('@{cyan-base}', 4) `), @component-background, 95%); +@cyan-9: mix(color(~`colorPalette('@{cyan-base}', 3) `), @component-background, 97%); +@cyan-10: mix(color(~`colorPalette('@{cyan-base}', 2) `), @component-background, 98%); + +@green-1: mix(color(~`colorPalette('@{green-base}', 8) `), @component-background, 15%); +@green-2: mix(color(~`colorPalette('@{green-base}', 7) `), @component-background, 25%); +@green-3: mix(@green-base, @component-background, 30%); +@green-4: mix(@green-base, @component-background, 45%); +@green-5: mix(@green-base, @component-background, 65%); +@green-6: mix(@green-base, @component-background, 85%); +@green-7: mix(color(~`colorPalette('@{green-base}', 5) `), @component-background, 90%); +@green-8: mix(color(~`colorPalette('@{green-base}', 4) `), @component-background, 95%); +@green-9: mix(color(~`colorPalette('@{green-base}', 3) `), @component-background, 97%); +@green-10: mix(color(~`colorPalette('@{green-base}', 2) `), @component-background, 98%); + +@magenta-1: mix(color(~`colorPalette('@{magenta-base}', 8) `), @component-background, 15%); +@magenta-2: mix(color(~`colorPalette('@{magenta-base}', 7) `), @component-background, 25%); +@magenta-3: mix(@magenta-base, @component-background, 30%); +@magenta-4: mix(@magenta-base, @component-background, 45%); +@magenta-5: mix(@magenta-base, @component-background, 65%); +@magenta-6: mix(@magenta-base, @component-background, 85%); +@magenta-7: mix(color(~`colorPalette('@{magenta-base}', 5) `), @component-background, 90%); +@magenta-8: mix(color(~`colorPalette('@{magenta-base}', 4) `), @component-background, 95%); +@magenta-9: mix(color(~`colorPalette('@{magenta-base}', 3) `), @component-background, 97%); +@magenta-10: mix(color(~`colorPalette('@{magenta-base}', 2) `), @component-background, 98%); + +@pink-1: mix(color(~`colorPalette('@{pink-base}', 8) `), @component-background, 15%); +@pink-2: mix(color(~`colorPalette('@{pink-base}', 7) `), @component-background, 25%); +@pink-3: mix(@pink-base, @component-background, 30%); +@pink-4: mix(@pink-base, @component-background, 45%); +@pink-5: mix(@pink-base, @component-background, 65%); +@pink-6: mix(@pink-base, @component-background, 85%); +@pink-7: mix(color(~`colorPalette('@{pink-base}', 5) `), @component-background, 90%); +@pink-8: mix(color(~`colorPalette('@{pink-base}', 4) `), @component-background, 95%); +@pink-9: mix(color(~`colorPalette('@{pink-base}', 3) `), @component-background, 97%); +@pink-10: mix(color(~`colorPalette('@{pink-base}', 2) `), @component-background, 98%); + +@red-1: mix(color(~`colorPalette('@{red-base}', 8) `), @component-background, 15%); +@red-2: mix(color(~`colorPalette('@{red-base}', 7) `), @component-background, 25%); +@red-3: mix(@red-base, @component-background, 30%); +@red-4: mix(@red-base, @component-background, 45%); +@red-5: mix(@red-base, @component-background, 65%); +@red-6: mix(@red-base, @component-background, 85%); +@red-7: mix(color(~`colorPalette('@{red-base}', 5) `), @component-background, 90%); +@red-8: mix(color(~`colorPalette('@{red-base}', 4) `), @component-background, 95%); +@red-9: mix(color(~`colorPalette('@{red-base}', 3) `), @component-background, 97%); +@red-10: mix(color(~`colorPalette('@{red-base}', 2) `), @component-background, 98%); + +@orange-1: mix(color(~`colorPalette('@{orange-base}', 8) `), @component-background, 15%); +@orange-2: mix(color(~`colorPalette('@{orange-base}', 7) `), @component-background, 25%); +@orange-3: mix(@orange-base, @component-background, 30%); +@orange-4: mix(@orange-base, @component-background, 45%); +@orange-5: mix(@orange-base, @component-background, 65%); +@orange-6: mix(@orange-base, @component-background, 85%); +@orange-7: mix(color(~`colorPalette('@{orange-base}', 5) `), @component-background, 90%); +@orange-8: mix(color(~`colorPalette('@{orange-base}', 4) `), @component-background, 95%); +@orange-9: mix(color(~`colorPalette('@{orange-base}', 3) `), @component-background, 97%); +@orange-10: mix(color(~`colorPalette('@{orange-base}', 2) `), @component-background, 98%); + +@yellow-1: mix(color(~`colorPalette('@{yellow-base}', 8) `), @component-background, 15%); +@yellow-2: mix(color(~`colorPalette('@{yellow-base}', 7) `), @component-background, 25%); +@yellow-3: mix(@yellow-base, @component-background, 30%); +@yellow-4: mix(@yellow-base, @component-background, 45%); +@yellow-5: mix(@yellow-base, @component-background, 65%); +@yellow-6: mix(@yellow-base, @component-background, 85%); +@yellow-7: mix(color(~`colorPalette('@{yellow-base}', 5) `), @component-background, 90%); +@yellow-8: mix(color(~`colorPalette('@{yellow-base}', 4) `), @component-background, 95%); +@yellow-9: mix(color(~`colorPalette('@{yellow-base}', 3) `), @component-background, 97%); +@yellow-10: mix(color(~`colorPalette('@{yellow-base}', 2) `), @component-background, 98%); + +@volcano-1: mix(color(~`colorPalette('@{volcano-base}', 8) `), @component-background, 15%); +@volcano-2: mix(color(~`colorPalette('@{volcano-base}', 7) `), @component-background, 25%); +@volcano-3: mix(@volcano-base, @component-background, 30%); +@volcano-4: mix(@volcano-base, @component-background, 45%); +@volcano-5: mix(@volcano-base, @component-background, 65%); +@volcano-6: mix(@volcano-base, @component-background, 85%); +@volcano-7: mix(color(~`colorPalette('@{volcano-base}', 5) `), @component-background, 90%); +@volcano-8: mix(color(~`colorPalette('@{volcano-base}', 4) `), @component-background, 95%); +@volcano-9: mix(color(~`colorPalette('@{volcano-base}', 3) `), @component-background, 97%); +@volcano-10: mix(color(~`colorPalette('@{volcano-base}', 2) `), @component-background, 98%); + +@geekblue-1: mix(color(~`colorPalette('@{geekblue-base}', 8) `), @component-background, 15%); +@geekblue-2: mix(color(~`colorPalette('@{geekblue-base}', 7) `), @component-background, 25%); +@geekblue-3: mix(@geekblue-base, @component-background, 30%); +@geekblue-4: mix(@geekblue-base, @component-background, 45%); +@geekblue-5: mix(@geekblue-base, @component-background, 65%); +@geekblue-6: mix(@geekblue-base, @component-background, 85%); +@geekblue-7: mix(color(~`colorPalette('@{geekblue-base}', 5) `), @component-background, 90%); +@geekblue-8: mix(color(~`colorPalette('@{geekblue-base}', 4) `), @component-background, 95%); +@geekblue-9: mix(color(~`colorPalette('@{geekblue-base}', 3) `), @component-background, 97%); +@geekblue-10: mix(color(~`colorPalette('@{geekblue-base}', 2) `), @component-background, 98%); + +@lime-1: mix(color(~`colorPalette('@{lime-base}', 8) `), @component-background, 15%); +@lime-2: mix(color(~`colorPalette('@{lime-base}', 7) `), @component-background, 25%); +@lime-3: mix(@lime-base, @component-background, 30%); +@lime-4: mix(@lime-base, @component-background, 45%); +@lime-5: mix(@lime-base, @component-background, 65%); +@lime-6: mix(@lime-base, @component-background, 85%); +@lime-7: mix(color(~`colorPalette('@{lime-base}', 5) `), @component-background, 90%); +@lime-8: mix(color(~`colorPalette('@{lime-base}', 4) `), @component-background, 95%); +@lime-9: mix(color(~`colorPalette('@{lime-base}', 3) `), @component-background, 97%); +@lime-10: mix(color(~`colorPalette('@{lime-base}', 2) `), @component-background, 98%); + +@gold-1: mix(color(~`colorPalette('@{gold-base}', 8) `), @component-background, 15%); +@gold-2: mix(color(~`colorPalette('@{gold-base}', 7) `), @component-background, 25%); +@gold-3: mix(@gold-base, @component-background, 30%); +@gold-4: mix(@gold-base, @component-background, 45%); +@gold-5: mix(@gold-base, @component-background, 65%); +@gold-6: mix(@gold-base, @component-background, 85%); +@gold-7: mix(color(~`colorPalette('@{gold-base}', 5) `), @component-background, 90%); +@gold-8: mix(color(~`colorPalette('@{gold-base}', 4) `), @component-background, 95%); +@gold-9: mix(color(~`colorPalette('@{gold-base}', 3) `), @component-background, 97%); +@gold-10: mix(color(~`colorPalette('@{gold-base}', 2) `), @component-background, 98%); + +// Color used by default to control hover and active backgrounds and for +// alert info backgrounds. +@primary-1: mix(color(~`colorPalette('@{primary-color}', 8) `), @component-background, 15%); +@primary-2: mix(color(~`colorPalette('@{primary-color}', 7) `), @component-background, 25%); +@primary-3: mix(@primary-color, @component-background, 30%); +@primary-4: mix(@primary-color, @component-background, 45%); +@primary-5: mix(@primary-color, @component-background, 65%); +@primary-6: @primary-color; +@primary-7: mix(color(~`colorPalette('@{primary-color}', 5) `), @component-background, 90%); +@primary-8: mix(color(~`colorPalette('@{primary-color}', 4) `), @component-background, 95%); +@primary-9: mix(color(~`colorPalette('@{primary-color}', 3) `), @component-background, 97%); +@primary-10: mix(color(~`colorPalette('@{primary-color}', 2) `), @component-background, 98%); + +// Layer background +@popover-background: #1f1f1f; +@popover-customize-border-color: #3a3a3a; +@body-background: @black; +@component-background: #141414; + +@text-color: fade(@white, 85%); +@text-color-secondary: fade(@white, 45%); +@text-color-inverse: @white; +@icon-color-hover: fade(@white, 75%); +@heading-color: fade(@white, 85%); + +// The background colors for active and hover states for things like +// list items or table cells. +@item-active-bg: @primary-1; +@item-hover-bg: fade(@white, 8%); + +// Border color +@border-color-base: #434343; // base border outline a component +@border-color-split: #303030; // split border inside a component + +@background-color-light: fade(@white, 4%); // background of header and selected item +@background-color-base: fade(@white, 8%); // Default grey background color + +// Disabled states +@disabled-color: fade(@white, 30%); +@disabled-bg: @background-color-base; +@disabled-color-dark: fade(@white, 30%); + +// Tree +// --- +@tree-bg: transparent; + +// List +// --- +@list-customize-card-bg: transparent; + +// Shadow +// --- +@shadow-color: rgba(0, 0, 0, 0.45); +@shadow-color-inverse: @component-background; +@box-shadow-base: @shadow-2; +@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.32), 0 -9px 28px 0 rgba(0, 0, 0, 0.2), + 0 -12px 48px 16px rgba(0, 0, 0, 0.12); +@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.32), 0 9px 28px 0 rgba(0, 0, 0, 0.2), + 0 12px 48px 16px rgba(0, 0, 0, 0.12); +@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.32), 9px 0 28px 0 rgba(0, 0, 0, 0.2), + 12px 0 48px 16px rgba(0, 0, 0, 0.12); +@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32), + 0 9px 28px 8px rgba(0, 0, 0, 0.2); + +// Buttons +// --- +@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); +@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); +@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + +@btn-default-bg: transparent; + +@btn-default-ghost-color: @text-color; +@btn-default-ghost-border: fade(@white, 25%); + +@btn-text-hover-bg: rgba(255, 255, 255, 0.03); + +// Checkbox +// --- +@checkbox-check-bg: transparent; + +// Descriptions +// --- +@descriptions-bg: @background-color-light; + +// Divider +// --- +@divider-color: rgba(255, 255, 255, 12%); + +// Modal +// --- +@modal-header-bg: @popover-background; +@modal-header-border-color-split: @border-color-split; +@modal-content-bg: @popover-background; +@modal-footer-border-color-split: @border-color-split; + +// Radio +// --- +@radio-solid-checked-color: @white; +@radio-dot-disabled-color: fade(@white, 20%); + +// Radio buttons +// --- +@radio-disabled-button-checked-bg: fade(@white, 20%); +@radio-disabled-button-checked-color: @disabled-color; + +// Layout +// --- +@layout-body-background: @body-background; +@layout-header-background: @popover-background; +@layout-trigger-background: #262626; + +// Input +// --- +@input-bg: transparent; +@input-placeholder-color: fade(@white, 30%); +@input-icon-color: fade(@white, 30%); +@input-number-handler-active-bg: @item-hover-bg; +@input-icon-hover-color: fade(@white, 85%); + +// Select +// --- +@select-background: transparent; +@select-dropdown-bg: @popover-background; +@select-clear-background: @component-background; +@select-selection-item-bg: fade(@white, 8); +@select-selection-item-border-color: @border-color-split; +@select-multiple-disabled-background: @component-background; +@select-multiple-item-disabled-color: #595959; +@select-multiple-item-disabled-border-color: @popover-background; + +// Cascader +// --- +@cascader-bg: transparent; +@cascader-menu-bg: @popover-background; +@cascader-menu-border-color-split: @border-color-split; + +// Tooltip +// --- +// Tooltip background color +@tooltip-bg: #434343; + +// Menu +// --- +// dark theme +@menu-dark-inline-submenu-bg: @component-background; +@menu-dark-bg: @popover-background; +@menu-popup-bg: @popover-background; + +// Message +// --- +@message-notice-content-bg: @popover-background; + +// Notification +@notification-bg: @popover-background; + +// LINK +@link-hover-color: @primary-5; +@link-active-color: @primary-7; + +// Table +// -- +@table-header-bg: #1d1d1d; +@table-body-sort-bg: fade(@white, 1%); +@table-row-hover-bg: #262626; +@table-header-cell-split-color: fade(@white, 8%); +@table-header-sort-bg: #262626; +@table-header-filter-active-bg: #434343; +@table-header-sort-active-bg: #303030; +@table-fixed-header-sort-active-bg: #222; +@table-filter-btns-bg: @popover-background; +@table-expanded-row-bg: @table-header-bg; +@table-filter-dropdown-bg: @popover-background; +@table-expand-icon-bg: transparent; + +// Tag +// --- +@info-color-deprecated-bg: @primary-1; +@info-color-deprecated-border: @primary-3; +@success-color-deprecated-bg: @green-1; +@success-color-deprecated-border: @green-3; +@warning-color-deprecated-bg: @orange-1; +@warning-color-deprecated-border: @orange-3; +@error-color-deprecated-bg: @red-1; +@error-color-deprecated-border: @red-3; + +// TimePicker +// --- +@picker-basic-cell-hover-with-range-color: darken(@primary-color, 35%); +@picker-basic-cell-disabled-bg: #303030; +@picker-border-color: @border-color-split; +@picker-bg: transparent; +@picker-date-hover-range-border-color: darken(@primary-color, 20%); + +// Dropdown +// --- +@dropdown-menu-bg: @popover-background; +@dropdown-menu-submenu-disabled-bg: transparent; + +// Steps +// --- +@steps-nav-arrow-color: fade(@white, 20%); +@steps-background: transparent; + +// Avatar +// --- +@avatar-bg: fade(@white, 30%); + +// Progress +// --- +@progress-steps-item-bg: fade(@white, 8%); + +// Calendar +// --- +@calendar-bg: @popover-background; +@calendar-input-bg: @calendar-bg; +@calendar-border-color: transparent; +@calendar-full-bg: @component-background; + +// Badge +// --- +@badge-text-color: @white; + +// Popover +@popover-bg: @popover-background; + +// Drawer +@drawer-bg: @popover-background; + +// Card +// --- +@card-actions-background: @component-background; +@card-skeleton-bg: #303030; +@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.64), 0 3px 6px 0 rgba(0, 0, 0, 0.48), + 0 5px 12px 4px rgba(0, 0, 0, 0.36); + +// Transfer +// --- +@transfer-item-hover-bg: #262626; + +// Comment +// --- +@comment-bg: transparent; +@comment-author-time-color: fade(@white, 30%); +@comment-action-hover-color: fade(@white, 65%); + +// Rate +// --- +@rate-star-bg: fade(@white, 12%); + +// Switch +// --- +@switch-bg: @white; + +// Pagination +// --- +@pagination-item-bg: transparent; +@pagination-item-bg-active: transparent; +@pagination-item-link-bg: transparent; +@pagination-item-disabled-bg-active: fade(@white, 25%); +@pagination-item-disabled-color-active: @black; +@pagination-item-input-bg: @pagination-item-bg; + +// PageHeader +// --- +@page-header-back-color: @icon-color; +@page-header-ghost-bg: transparent; + +// Slider +// --- +@slider-rail-background-color: #262626; +@slider-rail-background-color-hover: @border-color-base; +@slider-dot-border-color: @border-color-split; +@slider-dot-border-color-active: @primary-4; + +// Skeleton +// --- +@skeleton-to-color: fade(@white, 16%); + +// Alert +// --- +@alert-success-border-color: @green-3; +@alert-success-bg-color: @green-1; +@alert-success-icon-color: @success-color; +@alert-info-border-color: @primary-3; +@alert-info-bg-color: @primary-1; +@alert-info-icon-color: @info-color; +@alert-warning-border-color: @gold-3; +@alert-warning-bg-color: @gold-1; +@alert-warning-icon-color: @warning-color; +@alert-error-border-color: @red-3; +@alert-error-bg-color: @red-1; +@alert-error-icon-color: @error-color; + +// Timeline +// --- +@timeline-color: @border-color-split; +@timeline-dot-color: @primary-color; + +// Mentions +// --- +@mentions-dropdown-bg: @popover-background; + +// Segmented +// --- +@segmented-bg: fade(@black, 25%); +@segmented-hover-bg: fade(@black, 45%); +@segmented-selected-bg: #333333; +@segmented-label-color: fade(@white, 65%); +@segmented-label-hover-color: fade(@white, 85%); diff --git a/src/styles/themes/default.less b/src/styles/themes/default.less new file mode 100644 index 0000000..5c5b47f --- /dev/null +++ b/src/styles/themes/default.less @@ -0,0 +1,1084 @@ +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +@import '../color/colors'; + +@theme: default; + +// The prefix to use on all css classes from ant. +@ant-prefix: ant; + +// An override for the html selector for theme prefixes +@html-selector: html; + +// [CSS-VARIABLE-REPLACE-BEGIN: html-variables] +// [CSS-VARIABLE-REPLACE-END: html-variables] + +// -------- Colors ----------- +// >>> Primary +@primary-color: @blue-6; +@primary-color-hover: color(~`colorPalette('@{primary-color}', 5) `); +@primary-color-active: color(~`colorPalette('@{primary-color}', 7) `); +@primary-color-outline: fade(@primary-color, @outline-fade); + +@processing-color: @blue-6; + +// >>> Info +@info-color: @primary-color; +@info-color-deprecated-bg: color(~`colorPalette('@{info-color}', 1) `); +@info-color-deprecated-border: color(~`colorPalette('@{info-color}', 3) `); + +// >>> Success +@success-color: @green-6; +@success-color-hover: color(~`colorPalette('@{success-color}', 5) `); +@success-color-active: color(~`colorPalette('@{success-color}', 7) `); +@success-color-outline: fade(@success-color, @outline-fade); +@success-color-deprecated-bg: color(~`colorPalette('@{success-color}', 1) `); +@success-color-deprecated-border: color(~`colorPalette('@{success-color}', 3) `); + +// >>> Warning +@warning-color: @gold-6; +@warning-color-hover: color(~`colorPalette('@{warning-color}', 5) `); +@warning-color-active: color(~`colorPalette('@{warning-color}', 7) `); +@warning-color-outline: fade(@warning-color, @outline-fade); +@warning-color-deprecated-bg: color(~`colorPalette('@{warning-color}', 1) `); +@warning-color-deprecated-border: color(~`colorPalette('@{warning-color}', 3) `); + +// >>> Error +@error-color: @red-5; +@error-color-hover: color(~`colorPalette('@{error-color}', 5) `); +@error-color-active: color(~`colorPalette('@{error-color}', 7) `); +@error-color-outline: fade(@error-color, @outline-fade); +@error-color-deprecated-bg: color(~`colorPalette('@{error-color}', 1) `); +@error-color-deprecated-border: color(~`colorPalette('@{error-color}', 3) `); + +@highlight-color: @red-5; +@normal-color: #d9d9d9; +@white: #fff; +@black: #000; + +// Color used by default to control hover and active backgrounds and for +// alert info backgrounds. +@primary-1: color(~`colorPalette('@{primary-color}', 1) `); // replace tint(@primary-color, 90%) +@primary-2: color(~`colorPalette('@{primary-color}', 2) `); // replace tint(@primary-color, 80%) +@primary-3: color(~`colorPalette('@{primary-color}', 3) `); // unused +@primary-4: color(~`colorPalette('@{primary-color}', 4) `); // unused +@primary-5: color( + ~`colorPalette('@{primary-color}', 5) ` +); // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%) +@primary-6: @primary-color; // color used to control the text color of active buttons, don't use, use @primary-color +@primary-7: color(~`colorPalette('@{primary-color}', 7) `); // replace shade(@primary-color, 5%) +@primary-8: color(~`colorPalette('@{primary-color}', 8) `); // unused +@primary-9: color(~`colorPalette('@{primary-color}', 9) `); // unused +@primary-10: color(~`colorPalette('@{primary-color}', 10) `); // unused + +// Base Scaffolding Variables +// --- + +// Background color for `<body>` +@body-background: #fff; +// Base background color for most components +@component-background: #fff; +// Popover background color +@popover-background: @component-background; +@popover-customize-border-color: @border-color-split; +@font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Noto Color Emoji'; +@code-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; +@text-color: fade(@black, 85%); +@text-color-secondary: fade(@black, 45%); +@text-color-inverse: @white; +@icon-color: inherit; +@icon-color-hover: fade(@black, 75%); +@heading-color: fade(@black, 85%); +@text-color-dark: fade(@white, 85%); +@text-color-secondary-dark: fade(@white, 65%); +@text-selection-bg: @primary-color; +@font-variant-base: tabular-nums; +@font-feature-settings-base: 'tnum'; +@font-size-base: 14px; +@font-size-lg: @font-size-base + 2px; +@font-size-sm: 12px; +@heading-1-size: ceil(@font-size-base * 2.71); +@heading-2-size: ceil(@font-size-base * 2.14); +@heading-3-size: ceil(@font-size-base * 1.71); +@heading-4-size: ceil(@font-size-base * 1.42); +@heading-5-size: ceil(@font-size-base * 1.14); +// https://github.com/ant-design/ant-design/issues/20210 +@line-height-base: 1.5715; +@border-radius-base: 2px; +@border-radius-sm: 2px; + +// control border +@control-border-radius: @border-radius-base; + +// arrow border +@arrow-border-radius: 2px; + +// vertical paddings +@padding-lg: 24px; // containers +@padding-md: 16px; // small containers and buttons +@padding-sm: 12px; // Form controls and items +@padding-xs: 8px; // small items +@padding-xss: 4px; // more small + +// vertical padding for all form controls +@control-padding-horizontal: @padding-sm; +@control-padding-horizontal-sm: @padding-xs; + +// vertical margins +@margin-lg: 24px; // containers +@margin-md: 16px; // small containers and buttons +@margin-sm: 12px; // Form controls and items +@margin-xs: 8px; // small items +@margin-xss: 4px; // more small + +// height rules +@height-base: 32px; +@height-lg: 40px; +@height-sm: 24px; + +// The background colors for active and hover states for things like +// list items or table cells. +@item-active-bg: @primary-1; +@item-hover-bg: #f5f5f5; + +// ICONFONT +@iconfont-css-prefix: anticon; + +// LINK +@link-color: @primary-color; +@link-hover-color: color(~`colorPalette('@{link-color}', 5) `); +@link-active-color: color(~`colorPalette('@{link-color}', 7) `); +@link-decoration: none; +@link-hover-decoration: none; +@link-focus-decoration: none; +@link-focus-outline: 0; + +// Animation +@ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1); +@ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7); +@ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); +@ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19); +@ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1); +@ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46); +@ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6); +@ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46); +@ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1); +@ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34); +@ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86); +@ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1); +@ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06); +@ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1); + +// Border color +@border-color-base: hsv(0, 0, 85%); // base border outline a component +@border-color-split: hsv(0, 0, 94%); // split border inside a component +@border-color-inverse: @white; +@border-width-base: 1px; // width of the border for a component +@border-style-base: solid; // style of a components border + +// Outline +@outline-blur-size: 0; +@outline-width: 2px; +@outline-color: @primary-color; // No use anymore +@outline-fade: 20%; + +@background-color-light: hsv(0, 0, 98%); // background of header and selected item +@background-color-base: hsv(0, 0, 96%); // Default grey background color + +// Disabled states +@disabled-color: fade(#000, 25%); +@disabled-bg: @background-color-base; +@disabled-active-bg: tint(@black, 90%); +@disabled-color-dark: fade(#fff, 35%); + +// Shadow +@shadow-color: rgba(0, 0, 0, 0.15); +@shadow-color-inverse: @component-background; +@box-shadow-base: @shadow-2; +@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), + 0 -12px 48px 16px rgba(0, 0, 0, 0.03); +@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05), + 0 12px 48px 16px rgba(0, 0, 0, 0.03); +@shadow-1-left: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), + -12px 0 48px 16px rgba(0, 0, 0, 0.03); +@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05), + 12px 0 48px 16px rgba(0, 0, 0, 0.03); +@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), + 0 9px 28px 8px rgba(0, 0, 0, 0.05); + +// Buttons +@btn-font-weight: 400; +@btn-border-radius-base: @border-radius-base; +@btn-border-radius-sm: @border-radius-base; +@btn-border-width: @border-width-base; +@btn-border-style: @border-style-base; +@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); +@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); +@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + +@btn-primary-color: #fff; +@btn-primary-bg: @primary-color; + +@btn-default-color: @text-color; +@btn-default-bg: @component-background; +@btn-default-border: @border-color-base; + +@btn-danger-color: #fff; +@btn-danger-bg: @error-color; +@btn-danger-border: @error-color; + +@btn-disable-color: @disabled-color; +@btn-disable-bg: @disabled-bg; +@btn-disable-border: @border-color-base; + +@btn-default-ghost-color: @component-background; +@btn-default-ghost-bg: transparent; +@btn-default-ghost-border: @component-background; + +@btn-font-size-lg: @font-size-lg; +@btn-font-size-sm: @font-size-base; +@btn-padding-horizontal-base: @padding-md - 1px; +@btn-padding-horizontal-lg: @btn-padding-horizontal-base; +@btn-padding-horizontal-sm: @padding-xs - 1px; + +@btn-height-base: @height-base; +@btn-height-lg: @height-lg; +@btn-height-sm: @height-sm; + +@btn-line-height: @line-height-base; + +@btn-circle-size: @btn-height-base; +@btn-circle-size-lg: @btn-height-lg; +@btn-circle-size-sm: @btn-height-sm; + +@btn-square-size: @btn-height-base; +@btn-square-size-lg: @btn-height-lg; +@btn-square-size-sm: @btn-height-sm; +@btn-square-only-icon-size: @font-size-base + 2px; +@btn-square-only-icon-size-sm: @font-size-base; +@btn-square-only-icon-size-lg: @btn-font-size-lg + 2px; + +@btn-group-border: @primary-5; + +@btn-link-hover-bg: transparent; +@btn-text-hover-bg: rgba(0, 0, 0, 0.018); + +// Checkbox +@checkbox-size: 16px; +@checkbox-color: @primary-color; +@checkbox-check-color: #fff; +@checkbox-check-bg: @checkbox-check-color; +@checkbox-border-width: @border-width-base; +@checkbox-border-radius: @border-radius-sm; +@checkbox-group-item-margin-right: 8px; + +// Descriptions +@descriptions-bg: #fafafa; +@descriptions-title-margin-bottom: 20px; +@descriptions-default-padding: @padding-md @padding-lg; +@descriptions-middle-padding: @padding-sm @padding-lg; +@descriptions-small-padding: @padding-xs @padding-md; +@descriptions-item-padding-bottom: @padding-md; +@descriptions-item-trailing-colon: true; +@descriptions-item-label-colon-margin-right: 8px; +@descriptions-item-label-colon-margin-left: 2px; +@descriptions-extra-color: @text-color; + +// Divider +@divider-text-padding: 1em; +@divider-orientation-margin: 5%; +@divider-color: rgba(0, 0, 0, 6%); +@divider-vertical-gutter: 8px; + +// Dropdown +@dropdown-selected-color: @primary-color; +@dropdown-menu-submenu-disabled-bg: @component-background; +@dropdown-selected-bg: @item-active-bg; + +// Empty +@empty-font-size: @font-size-base; + +// Radio +@radio-size: 16px; +@radio-top: 0.2em; +@radio-border-width: 1px; +@radio-dot-size: @radio-size - 8px; +@radio-dot-color: @primary-color; +@radio-dot-disabled-color: fade(@black, 20%); +@radio-solid-checked-color: @component-background; + +// Radio buttons +@radio-button-bg: @btn-default-bg; +@radio-button-checked-bg: @btn-default-bg; +@radio-button-color: @btn-default-color; +@radio-button-hover-color: @primary-5; +@radio-button-active-color: @primary-7; +@radio-button-padding-horizontal: @padding-md - 1px; +@radio-disabled-button-checked-bg: @disabled-active-bg; +@radio-disabled-button-checked-color: @disabled-color; +@radio-wrapper-margin-right: 8px; + +// Media queries breakpoints +// @screen-xs and @screen-xs-min is not used in Grid +// smallest break point is @screen-md +@screen-xs: 480px; +@screen-xs-min: @screen-xs; +// 👆 Extra small screen / phone + +// 👇 Small screen / tablet +@screen-sm: 576px; +@screen-sm-min: @screen-sm; + +// Medium screen / desktop +@screen-md: 768px; +@screen-md-min: @screen-md; + +// Large screen / wide desktop +@screen-lg: 992px; +@screen-lg-min: @screen-lg; + +// Extra large screen / full hd +@screen-xl: 1200px; +@screen-xl-min: @screen-xl; + +// Extra extra large screen / large desktop +@screen-xxl: 1600px; +@screen-xxl-min: @screen-xxl; + +// provide a maximum +@screen-xs-max: (@screen-sm-min - 1px); +@screen-sm-max: (@screen-md-min - 1px); +@screen-md-max: (@screen-lg-min - 1px); +@screen-lg-max: (@screen-xl-min - 1px); +@screen-xl-max: (@screen-xxl-min - 1px); + +// Grid system +@grid-columns: 24; + +// Layout +@layout-body-background: #f0f2f5; +@layout-header-background: #001529; +@layout-header-height: 64px; +@layout-header-padding: 0 50px; +@layout-header-color: @text-color; +@layout-footer-padding: 24px 50px; +@layout-footer-background: @layout-body-background; +@layout-sider-background: @layout-header-background; +@layout-trigger-height: 48px; +@layout-trigger-background: #002140; +@layout-trigger-color: #fff; +@layout-zero-trigger-width: 36px; +@layout-zero-trigger-height: 42px; +// Layout light theme +@layout-sider-background-light: #fff; +@layout-trigger-background-light: #fff; +@layout-trigger-color-light: @text-color; + +// z-index list, order by `z-index` +@zindex-badge: auto; +@zindex-table-fixed: 2; +@zindex-affix: 10; +@zindex-back-top: 10; +@zindex-picker-panel: 10; +@zindex-popup-close: 10; +@zindex-modal: 1000; +@zindex-modal-mask: 1000; +@zindex-message: 1010; +@zindex-notification: 1010; +@zindex-popover: 1030; +@zindex-dropdown: 1050; +@zindex-picker: 1050; +@zindex-popoconfirm: 1060; +@zindex-tooltip: 1070; +@zindex-image: 1080; + +// Animation +@animation-duration-slow: 0.3s; // Modal +@animation-duration-base: 0.2s; +@animation-duration-fast: 0.1s; // Tooltip + +//CollapsePanel +@collapse-panel-border-radius: @border-radius-base; + +//Dropdown +@dropdown-menu-bg: @component-background; +@dropdown-vertical-padding: 5px; +@dropdown-edge-child-vertical-padding: 4px; +@dropdown-font-size: @font-size-base; +@dropdown-line-height: 22px; + +// Form +// --- +@label-required-color: @highlight-color; +@label-color: @heading-color; +@form-warning-input-bg: @input-bg; +@form-item-margin-bottom: 24px; +@form-item-trailing-colon: true; +@form-vertical-label-padding: 0 0 8px; +@form-vertical-label-margin: 0; +@form-item-label-font-size: @font-size-base; +@form-item-label-height: @input-height-base; +@form-item-label-colon-margin-right: 8px; +@form-item-label-colon-margin-left: 2px; +@form-error-input-bg: @input-bg; + +// Input +// --- +@input-height-base: @height-base; +@input-height-lg: @height-lg; +@input-height-sm: @height-sm; +@input-padding-horizontal: @control-padding-horizontal - 1px; +@input-padding-horizontal-base: @input-padding-horizontal; +@input-padding-horizontal-sm: @control-padding-horizontal-sm - 1px; +@input-padding-horizontal-lg: @input-padding-horizontal; +@input-padding-vertical-base: max( + (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) - + @border-width-base, + 3px +); +@input-padding-vertical-sm: max( + (round(((@input-height-sm - @font-size-base * @line-height-base) / 2) * 10) / 10) - + @border-width-base, + 0 +); +@input-padding-vertical-lg: ( + ceil(((@input-height-lg - @font-size-lg * @line-height-base) / 2) * 10) / 10 + ) - @border-width-base; +@input-placeholder-color: hsv(0, 0, 75%); +@input-color: @text-color; +@input-icon-color: @input-color; +@input-border-color: @border-color-base; +@input-bg: @component-background; +@input-number-hover-border-color: @input-hover-border-color; +@input-number-handler-active-bg: #f4f4f4; +@input-number-handler-hover-bg: @primary-5; +@input-number-handler-bg: @component-background; +@input-number-handler-border-color: @border-color-base; +@input-addon-bg: @background-color-light; +@input-hover-border-color: @primary-5; +@input-disabled-bg: @disabled-bg; +@input-outline-offset: 0 0; +@input-icon-hover-color: fade(@black, 85%); +@input-disabled-color: @disabled-color; + +// Mentions +// --- +@mentions-dropdown-bg: @component-background; +@mentions-dropdown-menu-item-hover-bg: @mentions-dropdown-bg; + +// Select +// --- +@select-border-color: @border-color-base; +@select-item-selected-color: @text-color; +@select-item-selected-font-weight: 600; +@select-dropdown-bg: @component-background; +@select-item-selected-bg: @primary-1; +@select-item-active-bg: @item-hover-bg; +@select-dropdown-vertical-padding: @dropdown-vertical-padding; +@select-dropdown-font-size: @dropdown-font-size; +@select-dropdown-line-height: @dropdown-line-height; +@select-dropdown-height: 32px; +@select-background: @component-background; +@select-clear-background: @select-background; +@select-selection-item-bg: @background-color-base; +@select-selection-item-border-color: @border-color-split; +@select-single-item-height-lg: 40px; +@select-multiple-item-height: @input-height-base - @input-padding-vertical-base * 2; // Normal 24px +@select-multiple-item-height-lg: 32px; +@select-multiple-item-spacing-half: ceil((@input-padding-vertical-base / 2)); +@select-multiple-disabled-background: @input-disabled-bg; +@select-multiple-item-disabled-color: #bfbfbf; +@select-multiple-item-disabled-border-color: @select-border-color; + +// Cascader +// --- +@cascader-bg: @component-background; +@cascader-item-selected-bg: @primary-1; +@cascader-menu-bg: @component-background; +@cascader-menu-border-color-split: @border-color-split; + +// Cascader +// ---- +@cascader-dropdown-vertical-padding: @dropdown-vertical-padding; +@cascader-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding; +@cascader-dropdown-font-size: @dropdown-font-size; +@cascader-dropdown-line-height: @dropdown-line-height; + +// Anchor +// --- +@anchor-bg: transparent; +@anchor-border-color: @border-color-split; +@anchor-link-top: 4px; +@anchor-link-left: 16px; +@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left; + +// Tooltip +// --- +// Tooltip max width +@tooltip-max-width: 250px; +// Tooltip text color +@tooltip-color: #fff; +// Tooltip background color +@tooltip-bg: rgba(0, 0, 0, 0.75); +// Tooltip arrow width +@tooltip-arrow-width: 8px * sqrt(2); +// Tooltip distance with trigger +@tooltip-distance: @tooltip-arrow-width - 1px + 4px; +// Tooltip arrow color +@tooltip-arrow-color: @tooltip-bg; +@tooltip-border-radius: @border-radius-base; + +// Popover +// --- +// Popover body background color +@popover-bg: @component-background; +// Popover text color +@popover-color: @text-color; +// Popover maximum width +@popover-min-width: 177px; +@popover-min-height: 32px; +// Popover arrow width +@popover-arrow-width: @tooltip-arrow-width; +// Popover arrow color +@popover-arrow-color: @popover-bg; +// Popover outer arrow width +// Popover outer arrow color +@popover-arrow-outer-color: @popover-bg; +// Popover distance with trigger +@popover-distance: @popover-arrow-width + 4px; +@popover-padding-horizontal: @padding-md; + +// Modal +// -- +@modal-header-padding-vertical: @padding-md; +@modal-header-padding-horizontal: @padding-lg; +@modal-body-padding: @padding-lg; +@modal-header-bg: @component-background; +@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal; +@modal-header-border-width: @border-width-base; +@modal-header-border-style: @border-style-base; +@modal-header-title-line-height: 22px; +@modal-header-title-font-size: @font-size-lg; +@modal-header-border-color-split: @border-color-split; +@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical; +@modal-content-bg: @component-background; +@modal-heading-color: @heading-color; +@modal-close-color: @text-color-secondary; +@modal-footer-bg: transparent; +@modal-footer-border-color-split: @border-color-split; +@modal-footer-border-style: @border-style-base; +@modal-footer-padding-vertical: 10px; +@modal-footer-padding-horizontal: 16px; +@modal-footer-border-width: @border-width-base; +@modal-mask-bg: fade(@black, 45%); +@modal-confirm-body-padding: 32px 32px 24px; +@modal-confirm-title-font-size: @font-size-lg; +@modal-border-radius: @border-radius-base; + +// Progress +// -- +@progress-default-color: @processing-color; +@progress-remaining-color: @background-color-base; +@progress-info-text-color: @progress-text-color; +@progress-radius: 100px; +@progress-steps-item-bg: #f3f3f3; +@progress-text-font-size: 1em; +@progress-text-color: @text-color; // This is for circle text color, should be renamed better +@progress-circle-text-font-size: 1em; +// Menu +// --- +@menu-inline-toplevel-item-height: 40px; +@menu-item-height: 40px; +@menu-item-group-height: @line-height-base; +@menu-collapsed-width: 80px; +@menu-bg: @component-background; +@menu-popup-bg: @component-background; +@menu-item-color: @text-color; +@menu-inline-submenu-bg: @background-color-light; +@menu-highlight-color: @primary-color; +@menu-highlight-danger-color: @error-color; +@menu-item-active-bg: @primary-1; +@menu-item-active-danger-bg: @red-1; +@menu-item-active-border-width: 3px; +@menu-item-group-title-color: @text-color-secondary; +@menu-item-vertical-margin: 4px; +@menu-item-font-size: @font-size-base; +@menu-item-boundary-margin: 8px; +@menu-item-padding-horizontal: 20px; +@menu-item-padding: 0 @menu-item-padding-horizontal; +@menu-horizontal-line-height: 46px; +@menu-icon-margin-right: 10px; +@menu-icon-size: @menu-item-font-size; +@menu-icon-size-lg: @font-size-lg; +@menu-item-group-title-font-size: @menu-item-font-size; + +// dark theme +@menu-dark-color: @text-color-secondary-dark; +@menu-dark-danger-color: @error-color; +@menu-dark-bg: @layout-header-background; +@menu-dark-arrow-color: #fff; +@menu-dark-inline-submenu-bg: #000c17; +@menu-dark-highlight-color: #fff; +@menu-dark-item-active-bg: @primary-color; +@menu-dark-item-active-danger-bg: @error-color; +@menu-dark-selected-item-icon-color: @white; +@menu-dark-selected-item-text-color: @white; +@menu-dark-item-hover-bg: transparent; +// Spin +// --- +@spin-dot-size-sm: 14px; +@spin-dot-size: 20px; +@spin-dot-size-lg: 32px; + +// Table +// -- +@table-bg: @component-background; +@table-header-bg: @background-color-light; +@table-header-color: @heading-color; +@table-header-sort-bg: @background-color-base; +@table-body-sort-bg: #fafafa; +@table-row-hover-bg: @background-color-light; +@table-selected-row-color: inherit; +@table-selected-row-bg: @primary-1; +@table-body-selected-sort-bg: @table-selected-row-bg; +@table-selected-row-hover-bg: darken(@table-selected-row-bg, 2%); +@table-expanded-row-bg: #fbfbfb; +@table-padding-vertical: 16px; +@table-padding-horizontal: 16px; +@table-padding-vertical-md: (@table-padding-vertical * 3 / 4); +@table-padding-horizontal-md: (@table-padding-horizontal / 2); +@table-padding-vertical-sm: (@table-padding-vertical / 2); +@table-padding-horizontal-sm: (@table-padding-horizontal / 2); +@table-border-color: @border-color-split; +@table-border-radius-base: @border-radius-base; +@table-footer-bg: @background-color-light; +@table-footer-color: @heading-color; +@table-header-bg-sm: @table-header-bg; +@table-font-size: @font-size-base; +@table-font-size-md: @table-font-size; +@table-font-size-sm: @table-font-size; +@table-header-cell-split-color: rgba(0, 0, 0, 0.06); +// Sorter +// Legacy: `table-header-sort-active-bg` is used for hover not real active +@table-header-sort-active-bg: rgba(0, 0, 0, 0.04); +@table-fixed-header-sort-active-bg: hsv(0, 0, 96%); + +// Filter +@table-header-filter-active-bg: rgba(0, 0, 0, 0.04); +@table-filter-btns-bg: inherit; +@table-filter-dropdown-bg: @component-background; +@table-expand-icon-bg: @component-background; +@table-selection-column-width: 32px; +// Sticky +@table-sticky-scroll-bar-bg: fade(#000, 35%); +@table-sticky-scroll-bar-radius: 4px; + +// Tag +// -- +@tag-border-radius: @border-radius-base; +@tag-default-bg: @background-color-light; +@tag-default-color: @text-color; +@tag-font-size: @font-size-sm; +@tag-line-height: 20px; + +// TimePicker +// --- +@picker-bg: @component-background; +@picker-basic-cell-hover-color: @item-hover-bg; +@picker-basic-cell-active-with-range-color: @primary-1; +@picker-basic-cell-hover-with-range-color: lighten(@primary-color, 35%); +@picker-basic-cell-disabled-bg: rgba(0, 0, 0, 0.04); +@picker-border-color: @border-color-split; +@picker-date-hover-range-border-color: lighten(@primary-color, 20%); +@picker-date-hover-range-color: @picker-basic-cell-hover-with-range-color; +@picker-time-panel-column-width: 56px; +@picker-time-panel-column-height: 224px; +@picker-time-panel-cell-height: 28px; +@picker-panel-cell-height: 24px; +@picker-panel-cell-width: 36px; +@picker-text-height: 40px; +@picker-panel-without-time-cell-height: 66px; + +// Calendar +// --- +@calendar-bg: @component-background; +@calendar-input-bg: @input-bg; +@calendar-border-color: @border-color-inverse; +@calendar-item-active-bg: @item-active-bg; +@calendar-column-active-bg: fade(@calendar-item-active-bg, 20%); +@calendar-full-bg: @calendar-bg; +@calendar-full-panel-bg: @calendar-full-bg; + +// Carousel +// --- +@carousel-dot-width: 16px; +@carousel-dot-height: 3px; +@carousel-dot-active-width: 24px; + +// Badge +// --- +@badge-height: 20px; +@badge-height-sm: 14px; +@badge-dot-size: 6px; +@badge-font-size: @font-size-sm; +@badge-font-size-sm: @font-size-sm; +@badge-font-weight: normal; +@badge-status-size: 6px; +@badge-text-color: @component-background; +@badge-color: @highlight-color; + +// Rate +// --- +@rate-star-color: @yellow-6; +@rate-star-bg: @border-color-split; +@rate-star-size: 20px; +@rate-star-hover-scale: scale(1.1); + +// Card +// --- +@card-head-color: @heading-color; +@card-head-background: transparent; +@card-head-font-size: @font-size-lg; +@card-head-font-size-sm: @font-size-base; +@card-head-padding: 16px; +@card-head-padding-sm: (@card-head-padding / 2); +@card-head-height: 48px; +@card-head-height-sm: 36px; +@card-inner-head-padding: 12px; +@card-padding-base: 24px; +@card-padding-base-sm: (@card-padding-base / 2); +@card-actions-background: @component-background; +@card-actions-li-margin: 12px 0; +@card-skeleton-bg: #cfd8dc; +@card-background: @component-background; +@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), + 0 5px 12px 4px rgba(0, 0, 0, 0.09); +@card-radius: @border-radius-base; +@card-head-tabs-margin-bottom: -17px; +@card-head-extra-color: @text-color; + +// Comment +// --- +@comment-bg: inherit; +@comment-padding-base: @padding-md 0; +@comment-nest-indent: 44px; +@comment-font-size-base: @font-size-base; +@comment-font-size-sm: @font-size-sm; +@comment-author-name-color: @text-color-secondary; +@comment-author-time-color: #ccc; +@comment-action-color: @text-color-secondary; +@comment-action-hover-color: #595959; +@comment-actions-margin-bottom: inherit; +@comment-actions-margin-top: @margin-sm; +@comment-content-detail-p-margin-bottom: inherit; + +// Tabs +// --- +@tabs-card-head-background: @background-color-light; +@tabs-card-height: 40px; +@tabs-card-active-color: @primary-color; +@tabs-card-horizontal-padding: ( + (@tabs-card-height - floor(@font-size-base * @line-height-base)) / 2 + ) - @border-width-base @padding-md; +@tabs-card-horizontal-padding-sm: 6px @padding-md; +@tabs-card-horizontal-padding-lg: 7px @padding-md 6px; +@tabs-title-font-size: @font-size-base; +@tabs-title-font-size-lg: @font-size-lg; +@tabs-title-font-size-sm: @font-size-base; +@tabs-ink-bar-color: @primary-color; +@tabs-bar-margin: 0 0 @margin-md 0; +@tabs-horizontal-gutter: 32px; +@tabs-horizontal-margin: 0 0 0 @tabs-horizontal-gutter; +@tabs-horizontal-margin-rtl: 0 0 0 32px; +@tabs-horizontal-padding: @padding-sm 0; +@tabs-horizontal-padding-lg: @padding-md 0; +@tabs-horizontal-padding-sm: @padding-xs 0; +@tabs-vertical-padding: @padding-xs @padding-lg; +@tabs-vertical-margin: @margin-md 0 0 0; +@tabs-scrolling-size: 32px; +@tabs-highlight-color: @primary-color; +@tabs-hover-color: @primary-5; +@tabs-active-color: @primary-7; +@tabs-card-gutter: 2px; +@tabs-card-tab-active-border-top: 2px solid transparent; + +// BackTop +// --- +@back-top-color: #fff; +@back-top-bg: @text-color-secondary; +@back-top-hover-bg: @text-color; + +// Avatar +// --- +@avatar-size-base: 32px; +@avatar-size-lg: 40px; +@avatar-size-sm: 24px; +@avatar-font-size-base: 18px; +@avatar-font-size-lg: 24px; +@avatar-font-size-sm: 14px; +@avatar-bg: #ccc; +@avatar-color: #fff; +@avatar-border-radius: @border-radius-base; +@avatar-group-overlapping: -8px; +@avatar-group-space: 3px; +@avatar-group-border-color: #fff; + +// Switch +// --- +@switch-height: 22px; +@switch-sm-height: 16px; +@switch-min-width: 44px; +@switch-sm-min-width: 28px; +@switch-disabled-opacity: 0.4; +@switch-color: @primary-color; +@switch-bg: @component-background; +@switch-shadow-color: fade(#00230b, 20%); +@switch-padding: 2px; +@switch-inner-margin-min: ceil(@switch-height * 0.3); +@switch-inner-margin-max: ceil(@switch-height * 1.1); +@switch-sm-inner-margin-min: ceil(@switch-sm-height * 0.3); +@switch-sm-inner-margin-max: ceil(@switch-sm-height * 1.1); + +// Pagination +// --- +@pagination-item-bg: @component-background; +@pagination-item-size: @height-base; +@pagination-item-size-sm: 24px; +@pagination-font-family: @font-family; +@pagination-font-weight-active: 500; +@pagination-item-bg-active: @component-background; +@pagination-item-link-bg: @component-background; +@pagination-item-disabled-color-active: @disabled-color; +@pagination-item-disabled-bg-active: @disabled-active-bg; +@pagination-item-input-bg: @component-background; +@pagination-mini-options-size-changer-top: 0px; + +// PageHeader +// --- +@page-header-padding: @padding-lg; +@page-header-padding-vertical: @padding-md; +@page-header-padding-breadcrumb: @padding-sm; +@page-header-content-padding-vertical: @padding-sm; +@page-header-back-color: #000; +@page-header-ghost-bg: inherit; +@page-header-heading-title: @heading-4-size; +@page-header-heading-sub-title: 14px; +@page-header-tabs-tab-font-size: 16px; + +// Breadcrumb +// --- +@breadcrumb-base-color: @text-color-secondary; +@breadcrumb-last-item-color: @text-color; +@breadcrumb-font-size: @font-size-base; +@breadcrumb-icon-font-size: @font-size-base; +@breadcrumb-link-color: @text-color-secondary; +@breadcrumb-link-color-hover: @text-color; +@breadcrumb-separator-color: @text-color-secondary; +@breadcrumb-separator-margin: 0 @padding-xs; + +// Slider +// --- +@slider-margin: 10px 6px 10px; +@slider-rail-background-color: @background-color-base; +@slider-rail-background-color-hover: #e1e1e1; +@slider-track-background-color: @primary-3; +@slider-track-background-color-hover: @primary-4; +@slider-handle-border-width: 2px; +@slider-handle-background-color: @component-background; +@slider-handle-color: @primary-3; +@slider-handle-color-hover: @primary-4; +@slider-handle-color-focus: tint(@primary-color, 20%); +@slider-handle-color-focus-shadow: fade(@primary-color, 12%); +@slider-handle-color-tooltip-open: @primary-color; +@slider-handle-size: 14px; +@slider-handle-margin-top: -5px; +@slider-handle-margin-left: -5px; +@slider-handle-shadow: 0; +@slider-dot-border-color: @border-color-split; +@slider-dot-border-color-active: tint(@primary-color, 50%); +@slider-disabled-color: @disabled-color; +@slider-disabled-background-color: @component-background; + +// Tree +// --- +@tree-bg: @component-background; +@tree-title-height: 24px; +@tree-child-padding: 18px; +@tree-directory-selected-color: #fff; +@tree-directory-selected-bg: @primary-color; +@tree-node-hover-bg: @item-hover-bg; +@tree-node-selected-bg: @primary-2; + +// Collapse +// --- +@collapse-header-padding: @padding-sm @padding-md; +@collapse-header-padding-extra: 40px; +@collapse-header-bg: @background-color-light; +@collapse-content-padding: @padding-md; +@collapse-content-bg: @component-background; +@collapse-header-arrow-left: 16px; + +// Skeleton +// --- +@skeleton-color: rgba(190, 190, 190, 0.2); +@skeleton-to-color: shade(@skeleton-color, 5%); +@skeleton-paragraph-margin-top: 28px; +@skeleton-paragraph-li-margin-top: @margin-md; +@skeleton-paragraph-li-height: 16px; +@skeleton-title-height: 16px; +@skeleton-title-paragraph-margin-top: @margin-lg; + +// Transfer +// --- +@transfer-header-height: 40px; +@transfer-item-height: @height-base; +@transfer-disabled-bg: @disabled-bg; +@transfer-list-height: 200px; +@transfer-item-hover-bg: @item-hover-bg; +@transfer-item-selected-hover-bg: darken(@item-active-bg, 2%); +@transfer-item-padding-vertical: 6px; +@transfer-list-search-icon-top: 12px; + +// Message +// --- +@message-notice-content-padding: 10px 16px; +@message-notice-content-bg: @component-background; +// Motion +// --- +@wave-animation-width: 6px; + +// Alert +// --- +@alert-success-border-color: ~`colorPalette('@{success-color}', 3) `; +@alert-success-bg-color: ~`colorPalette('@{success-color}', 1) `; +@alert-success-icon-color: @success-color; +@alert-info-border-color: ~`colorPalette('@{info-color}', 3) `; +@alert-info-bg-color: ~`colorPalette('@{info-color}', 1) `; +@alert-info-icon-color: @info-color; +@alert-warning-border-color: ~`colorPalette('@{warning-color}', 3) `; +@alert-warning-bg-color: ~`colorPalette('@{warning-color}', 1) `; +@alert-warning-icon-color: @warning-color; +@alert-error-border-color: ~`colorPalette('@{error-color}', 3) `; +@alert-error-bg-color: ~`colorPalette('@{error-color}', 1) `; +@alert-error-icon-color: @error-color; +@alert-message-color: @heading-color; +@alert-text-color: @text-color; +@alert-close-color: @text-color-secondary; +@alert-close-hover-color: @icon-color-hover; +@alert-padding-vertical: @padding-xs; +@alert-padding-horizontal: @padding-md - 1px; +@alert-no-icon-padding-vertical: @padding-xs; +@alert-with-description-no-icon-padding-vertical: @padding-md - 1px; +@alert-with-description-padding-vertical: @padding-md - 1px; +@alert-with-description-padding: @alert-with-description-padding-vertical 15px + @alert-with-description-no-icon-padding-vertical @alert-with-description-icon-size; +@alert-icon-top: 8px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2); +@alert-with-description-icon-size: 24px; + +// List +// --- +@list-header-background: transparent; +@list-footer-background: transparent; +@list-empty-text-padding: @padding-md; +@list-item-padding: @padding-sm 0; +@list-item-padding-sm: @padding-xs @padding-md; +@list-item-padding-lg: 16px 24px; +@list-item-meta-margin-bottom: @padding-md; +@list-item-meta-avatar-margin-right: @padding-md; +@list-item-meta-title-margin-bottom: @padding-sm; +@list-customize-card-bg: @component-background; +@list-item-meta-description-font-size: @font-size-base; + +// Statistic +// --- +@statistic-title-font-size: @font-size-base; +@statistic-content-font-size: 24px; +@statistic-unit-font-size: 24px; +@statistic-font-family: @font-family; + +// Drawer +// --- +@drawer-header-padding: @padding-md @padding-lg; +@drawer-body-padding: @padding-lg; +@drawer-bg: @component-background; +@drawer-footer-padding-vertical: @modal-footer-padding-vertical; +@drawer-footer-padding-horizontal: @modal-footer-padding-horizontal; +@drawer-header-close-size: 56px; +@drawer-title-font-size: @font-size-lg; +@drawer-title-line-height: 22px; + +// Timeline +// --- +@timeline-width: 2px; +@timeline-color: @border-color-split; +@timeline-dot-border-width: 2px; +@timeline-dot-color: @primary-color; +@timeline-dot-bg: @component-background; +@timeline-item-padding-bottom: 20px; + +// Typography +// --- +@typography-title-font-weight: 600; +@typography-title-margin-top: 1.2em; +@typography-title-margin-bottom: 0.5em; + +// Upload +// --- +@upload-actions-color: @text-color-secondary; + +// Steps +// --- +@process-tail-color: @border-color-split; +@steps-nav-arrow-color: fade(@black, 25%); +@steps-background: @component-background; +@steps-icon-size: 32px; +@steps-icon-custom-size: @steps-icon-size; +@steps-icon-custom-top: 0px; +@steps-icon-custom-font-size: 24px; +@steps-icon-top: -0.5px; +@steps-icon-font-size: @font-size-lg; +@steps-icon-margin: 0 8px 0 0; +@steps-title-line-height: @height-base; +@steps-small-icon-size: 24px; +@steps-small-icon-margin: 0 8px 0 0; +@steps-dot-size: 8px; +@steps-dot-top: 2px; +@steps-current-dot-size: 10px; +@steps-description-max-width: 140px; +@steps-nav-content-max-width: auto; +@steps-vertical-icon-width: 16px; +@steps-vertical-tail-width: 16px; +@steps-vertical-tail-width-sm: 12px; + +// Notification +// --- +@notification-bg: @component-background; +@notification-padding-vertical: 16px; +@notification-padding-horizontal: 24px; + +// Result +// --- +@result-title-font-size: 24px; +@result-subtitle-font-size: @font-size-base; +@result-icon-font-size: 72px; +@result-extra-margin: 24px 0 0 0; + +// Image +// --- +@image-size-base: 48px; +@image-font-size-base: 24px; +@image-bg: #f5f5f5; +@image-color: #fff; +@image-mask-font-size: 16px; +@image-preview-operation-size: 18px; +@image-preview-operation-color: @text-color-dark; +@image-preview-operation-disabled-color: fade(@image-preview-operation-color, 25%); + +// Segmented +// --- +@segmented-bg: fade(@black, 4%); +@segmented-hover-bg: fade(@black, 6%); +@segmented-selected-bg: @white; +@segmented-label-color: fade(@black, 65%); +@segmented-label-hover-color: #262626; diff --git a/src/styles/themes/index.less b/src/styles/themes/index.less new file mode 100644 index 0000000..fd29f58 --- /dev/null +++ b/src/styles/themes/index.less @@ -0,0 +1,7 @@ +// Default using variable as entry to support site variable version +// This will be replaced in webpack bundle +// @root-entry-name: variable; + +// @import './default.less'; +// @import './variable.less'; +@import './@{root-entry-name}.less'; diff --git a/src/styles/themes/variable.less b/src/styles/themes/variable.less new file mode 100644 index 0000000..3a8e45e --- /dev/null +++ b/src/styles/themes/variable.less @@ -0,0 +1,1139 @@ +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +@import '../color/colors'; + +@theme: variable; + +// The prefix to use on all css classes from ant. +@ant-prefix: ant; + +// An override for the html selector for theme prefixes +@html-selector: html; + +@{html-selector} { + @base-primary: @blue-6; + + // ========= Primary Color ========= + --@{ant-prefix}-primary-color: @base-primary; + --@{ant-prefix}-primary-color-hover: color(~`colorPalette('@{base-primary}', 5) `); + --@{ant-prefix}-primary-color-active: color(~`colorPalette('@{base-primary}', 7) `); + --@{ant-prefix}-primary-color-outline: fade(@base-primary, @outline-fade); + + // Legacy + @legacy-primary-1: color(~`colorPalette('@{base-primary}', 1) `); + + --@{ant-prefix}-primary-1: @legacy-primary-1; + --@{ant-prefix}-primary-2: color(~`colorPalette('@{base-primary}', 2) `); + --@{ant-prefix}-primary-3: color(~`colorPalette('@{base-primary}', 3) `); + --@{ant-prefix}-primary-4: color(~`colorPalette('@{base-primary}', 4) `); + --@{ant-prefix}-primary-5: color(~`colorPalette('@{base-primary}', 5) `); + --@{ant-prefix}-primary-6: @base-primary; + --@{ant-prefix}-primary-7: color(~`colorPalette('@{base-primary}', 7) `); + + // Deprecated + --@{ant-prefix}-primary-color-deprecated-pure: ~''; + --@{ant-prefix}-primary-color-deprecated-l-35: lighten(@base-primary, 35%); + --@{ant-prefix}-primary-color-deprecated-l-20: lighten(@base-primary, 20%); + --@{ant-prefix}-primary-color-deprecated-t-20: tint(@base-primary, 20%); + --@{ant-prefix}-primary-color-deprecated-t-50: tint(@base-primary, 50%); + --@{ant-prefix}-primary-color-deprecated-f-12: fade(@base-primary, 12%); + --@{ant-prefix}-primary-color-active-deprecated-f-30: fade(@legacy-primary-1, 30%); + --@{ant-prefix}-primary-color-active-deprecated-d-02: darken(@legacy-primary-1, 2%); + + // ========= Success Color ========= + --@{ant-prefix}-success-color: @green-6; + --@{ant-prefix}-success-color-hover: color(~`colorPalette('@{green-6}', 5) `); + --@{ant-prefix}-success-color-active: color(~`colorPalette('@{green-6}', 7) `); + --@{ant-prefix}-success-color-outline: fade(@green-6, @outline-fade); + --@{ant-prefix}-success-color-deprecated-bg: ~`colorPalette('@{green-6}', 1) `; + --@{ant-prefix}-success-color-deprecated-border: ~`colorPalette('@{green-6}', 3) `; + + // ========== Error Color ========== + --@{ant-prefix}-error-color: @red-5; + --@{ant-prefix}-error-color-hover: color(~`colorPalette('@{red-5}', 5) `); + --@{ant-prefix}-error-color-active: color(~`colorPalette('@{red-5}', 7) `); + --@{ant-prefix}-error-color-outline: fade(@red-5, @outline-fade); + --@{ant-prefix}-error-color-deprecated-bg: ~`colorPalette('@{red-5}', 1) `; + --@{ant-prefix}-error-color-deprecated-border: ~`colorPalette('@{red-5}', 3) `; + + // ========= Warning Color ========= + --@{ant-prefix}-warning-color: @gold-6; + --@{ant-prefix}-warning-color-hover: color(~`colorPalette('@{gold-6}', 5) `); + --@{ant-prefix}-warning-color-active: color(~`colorPalette('@{gold-6}', 7) `); + --@{ant-prefix}-warning-color-outline: fade(@gold-6, @outline-fade); + --@{ant-prefix}-warning-color-deprecated-bg: ~`colorPalette('@{gold-6}', 1) `; + --@{ant-prefix}-warning-color-deprecated-border: ~`colorPalette('@{gold-6}', 3) `; + + // ========== Info Color =========== + --@{ant-prefix}-info-color: @base-primary; + --@{ant-prefix}-info-color-deprecated-bg: ~`colorPalette('@{base-primary}', 1) `; + --@{ant-prefix}-info-color-deprecated-border: ~`colorPalette('@{base-primary}', 3) `; +} + +// -------- Colors ----------- +// >>> Primary +@primary-color: ~'var(--@{ant-prefix}-primary-color)'; +@primary-color-hover: ~'var(--@{ant-prefix}-primary-color-hover)'; +@primary-color-active: ~'var(--@{ant-prefix}-primary-color-active)'; +@primary-color-outline: ~'var(--@{ant-prefix}-primary-color-outline)'; + +@processing-color: @primary-color; + +// >>> Info +@info-color: ~'var(--@{ant-prefix}-info-color)'; +@info-color-deprecated-bg: ~'var(--@{ant-prefix}-info-color-deprecated-bg)'; +@info-color-deprecated-border: ~'var(--@{ant-prefix}-info-color-deprecated-border)'; + +// >>> Success +@success-color: ~'var(--@{ant-prefix}-success-color)'; +@success-color-hover: ~'var(--@{ant-prefix}-success-color-hover)'; +@success-color-active: ~'var(--@{ant-prefix}-success-color-active)'; +@success-color-outline: ~'var(--@{ant-prefix}-success-color-outline)'; +@success-color-deprecated-bg: ~'var(--@{ant-prefix}-success-color-deprecated-bg)'; +@success-color-deprecated-border: ~'var(--@{ant-prefix}-success-color-deprecated-border)'; + +// >>> Warning +@warning-color: ~'var(--@{ant-prefix}-warning-color)'; +@warning-color-hover: ~'var(--@{ant-prefix}-warning-color-hover)'; +@warning-color-active: ~'var(--@{ant-prefix}-warning-color-active)'; +@warning-color-outline: ~'var(--@{ant-prefix}-warning-color-outline)'; +@warning-color-deprecated-bg: ~'var(--@{ant-prefix}-warning-color-deprecated-bg)'; +@warning-color-deprecated-border: ~'var(--@{ant-prefix}-warning-color-deprecated-border)'; + +// >>> Error +@error-color: ~'var(--@{ant-prefix}-error-color)'; +@error-color-hover: ~'var(--@{ant-prefix}-error-color-hover)'; +@error-color-active: ~'var(--@{ant-prefix}-error-color-active)'; +@error-color-outline: ~'var(--@{ant-prefix}-error-color-outline)'; +@error-color-deprecated-bg: ~'var(--@{ant-prefix}-error-color-deprecated-bg)'; +@error-color-deprecated-border: ~'var(--@{ant-prefix}-error-color-deprecated-border)'; + +@highlight-color: @red-5; +@normal-color: #d9d9d9; +@white: #fff; +@black: #000; + +// Color used by default to control hover and active backgrounds and for +// alert info backgrounds. +@primary-1: ~'var(--@{ant-prefix}-primary-1)'; // replace tint(@primary-color, 90%) +@primary-2: ~'var(--@{ant-prefix}-primary-2)'; // replace tint(@primary-color, 80%) +@primary-3: ~'var(--@{ant-prefix}-primary-3)'; // unused +@primary-4: ~'var(--@{ant-prefix}-primary-4)'; // unused +@primary-5: ~'var(--@{ant-prefix}-primary-5)'; // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%) +@primary-6: ~'var(--@{ant-prefix}-primary-6)'; // color used to control the text color of active buttons, don't use, use @primary-color +@primary-7: ~'var(--@{ant-prefix}-primary-7)'; // replace shade(@primary-color, 5%) +@primary-8: color(~`colorPalette('@{primary-color}', 8) `); // unused +@primary-9: color(~`colorPalette('@{primary-color}', 9) `); // unused +@primary-10: color(~`colorPalette('@{primary-color}', 10) `); // unused + +// Base Scaffolding Variables +// --- + +// Background color for `<body>` +@body-background: #fff; +// Base background color for most components +@component-background: #fff; +// Popover background color +@popover-background: @component-background; +@popover-customize-border-color: @border-color-split; +@font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Noto Color Emoji'; +@code-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; +@text-color: fade(@black, 85%); +@text-color-secondary: fade(@black, 45%); +@text-color-inverse: @white; +@icon-color: inherit; +@icon-color-hover: fade(@black, 75%); +@heading-color: fade(@black, 85%); +@text-color-dark: fade(@white, 85%); +@text-color-secondary-dark: fade(@white, 65%); +@text-selection-bg: @primary-color; +@font-variant-base: tabular-nums; +@font-feature-settings-base: 'tnum'; +@font-size-base: 14px; +@font-size-lg: @font-size-base + 2px; +@font-size-sm: 12px; +@heading-1-size: ceil(@font-size-base * 2.71); +@heading-2-size: ceil(@font-size-base * 2.14); +@heading-3-size: ceil(@font-size-base * 1.71); +@heading-4-size: ceil(@font-size-base * 1.42); +@heading-5-size: ceil(@font-size-base * 1.14); +// https://github.com/ant-design/ant-design/issues/20210 +@line-height-base: 1.5715; +@border-radius-base: 2px; +@border-radius-sm: 2px; + +// control border +@control-border-radius: @border-radius-base; + +// arrow border +@arrow-border-radius: @border-radius-sm; + +// vertical paddings +@padding-lg: 24px; // containers +@padding-md: 16px; // small containers and buttons +@padding-sm: 12px; // Form controls and items +@padding-xs: 8px; // small items +@padding-xss: 4px; // more small + +// vertical padding for all form controls +@control-padding-horizontal: @padding-sm; +@control-padding-horizontal-sm: @padding-xs; + +// vertical margins +@margin-lg: 24px; // containers +@margin-md: 16px; // small containers and buttons +@margin-sm: 12px; // Form controls and items +@margin-xs: 8px; // small items +@margin-xss: 4px; // more small + +// height rules +@height-base: 32px; +@height-lg: 40px; +@height-sm: 24px; + +// The background colors for active and hover states for things like +// list items or table cells. +@item-active-bg: @primary-1; +@item-hover-bg: #f5f5f5; + +// ICONFONT +@iconfont-css-prefix: anticon; + +// LINK +@link-color: @primary-color; +@link-hover-color: @primary-color-hover; +@link-active-color: @primary-color-active; +@link-decoration: none; +@link-hover-decoration: none; +@link-focus-decoration: none; +@link-focus-outline: 0; + +// Animation +@ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1); +@ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7); +@ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); +@ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19); +@ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1); +@ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46); +@ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6); +@ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46); +@ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1); +@ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34); +@ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86); +@ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1); +@ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06); +@ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1); + +// Border color +@border-color-base: hsv(0, 0, 85%); // base border outline a component +@border-color-split: rgba(0, 0, 0, 0.06); // split border inside a component +@border-color-inverse: @white; +@border-width-base: 1px; // width of the border for a component +@border-style-base: solid; // style of a components border + +// Outline +@outline-blur-size: 0; +@outline-width: 2px; +@outline-color: @primary-color; // No use anymore +@outline-fade: 20%; + +@background-color-light: hsv(0, 0, 98%); // background of header and selected item +@background-color-base: hsv(0, 0, 96%); // Default grey background color + +// Disabled states +@disabled-color: fade(#000, 25%); +@disabled-bg: @background-color-base; +@disabled-active-bg: tint(@black, 90%); +@disabled-color-dark: fade(#fff, 35%); + +// Shadow +@shadow-color: rgba(0, 0, 0, 0.15); +@shadow-color-inverse: @component-background; +@box-shadow-base: @shadow-2; +@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), + 0 -12px 48px 16px rgba(0, 0, 0, 0.03); +@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05), + 0 12px 48px 16px rgba(0, 0, 0, 0.03); +@shadow-1-left: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), + -12px 0 48px 16px rgba(0, 0, 0, 0.03); +@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05), + 12px 0 48px 16px rgba(0, 0, 0, 0.03); +@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), + 0 9px 28px 8px rgba(0, 0, 0, 0.05); + +// Buttons +@btn-font-weight: 400; +@btn-border-radius-base: @border-radius-base; +@btn-border-radius-sm: @border-radius-base; +@btn-border-width: @border-width-base; +@btn-border-style: @border-style-base; +@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); +@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); +@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + +@btn-primary-color: #fff; +@btn-primary-bg: @primary-color; + +@btn-default-color: @text-color; +@btn-default-bg: @component-background; +@btn-default-border: @border-color-base; + +@btn-danger-color: #fff; +@btn-danger-bg: @error-color; +@btn-danger-border: @error-color; + +@btn-disable-color: @disabled-color; +@btn-disable-bg: @disabled-bg; +@btn-disable-border: @border-color-base; + +@btn-default-ghost-color: @component-background; +@btn-default-ghost-bg: transparent; +@btn-default-ghost-border: @component-background; + +@btn-font-size-lg: @font-size-lg; +@btn-font-size-sm: @font-size-base; +@btn-padding-horizontal-base: @padding-md - 1px; +@btn-padding-horizontal-lg: @btn-padding-horizontal-base; +@btn-padding-horizontal-sm: @padding-xs - 1px; + +@btn-height-base: @height-base; +@btn-height-lg: @height-lg; +@btn-height-sm: @height-sm; + +@btn-line-height: @line-height-base; + +@btn-circle-size: @btn-height-base; +@btn-circle-size-lg: @btn-height-lg; +@btn-circle-size-sm: @btn-height-sm; + +@btn-square-size: @btn-height-base; +@btn-square-size-lg: @btn-height-lg; +@btn-square-size-sm: @btn-height-sm; +@btn-square-only-icon-size: @font-size-base + 2px; +@btn-square-only-icon-size-sm: @font-size-base; +@btn-square-only-icon-size-lg: @btn-font-size-lg + 2px; + +@btn-group-border: @primary-5; + +@btn-link-hover-bg: transparent; +@btn-text-hover-bg: rgba(0, 0, 0, 0.018); + +// Checkbox +@checkbox-size: 16px; +@checkbox-color: @primary-color; +@checkbox-check-color: #fff; +@checkbox-check-bg: @checkbox-check-color; +@checkbox-border-width: @border-width-base; +@checkbox-border-radius: @border-radius-sm; +@checkbox-group-item-margin-right: 8px; + +// Descriptions +@descriptions-bg: #fafafa; +@descriptions-title-margin-bottom: 20px; +@descriptions-default-padding: @padding-md @padding-lg; +@descriptions-middle-padding: @padding-sm @padding-lg; +@descriptions-small-padding: @padding-xs @padding-md; +@descriptions-item-padding-bottom: @padding-md; +@descriptions-item-trailing-colon: true; +@descriptions-item-label-colon-margin-right: 8px; +@descriptions-item-label-colon-margin-left: 2px; +@descriptions-extra-color: @text-color; + +// Divider +@divider-text-padding: 1em; +@divider-orientation-margin: 5%; +@divider-color: rgba(0, 0, 0, 6%); +@divider-vertical-gutter: 8px; + +// Dropdown +@dropdown-selected-color: @primary-color; +@dropdown-menu-submenu-disabled-bg: @component-background; +@dropdown-selected-bg: @item-active-bg; + +// Empty +@empty-font-size: @font-size-base; + +// Radio +@radio-size: 16px; +@radio-top: 0.2em; +@radio-border-width: 1px; +@radio-dot-size: @radio-size - 8px; +@radio-dot-color: @primary-color; +@radio-dot-disabled-color: fade(@black, 20%); +@radio-solid-checked-color: @component-background; + +// Radio buttons +@radio-button-bg: @btn-default-bg; +@radio-button-checked-bg: @btn-default-bg; +@radio-button-color: @btn-default-color; +@radio-button-hover-color: @primary-5; +@radio-button-active-color: @primary-7; +@radio-button-padding-horizontal: @padding-md - 1px; +@radio-disabled-button-checked-bg: @disabled-active-bg; +@radio-disabled-button-checked-color: @disabled-color; +@radio-wrapper-margin-right: 8px; + +// Media queries breakpoints +// @screen-xs and @screen-xs-min is not used in Grid +// smallest break point is @screen-md +@screen-xs: 480px; +@screen-xs-min: @screen-xs; +// 👆 Extra small screen / phone + +// 👇 Small screen / tablet +@screen-sm: 576px; +@screen-sm-min: @screen-sm; + +// Medium screen / desktop +@screen-md: 768px; +@screen-md-min: @screen-md; + +// Large screen / wide desktop +@screen-lg: 992px; +@screen-lg-min: @screen-lg; + +// Extra large screen / full hd +@screen-xl: 1200px; +@screen-xl-min: @screen-xl; + +// Extra extra large screen / large desktop +@screen-xxl: 1600px; +@screen-xxl-min: @screen-xxl; + +// provide a maximum +@screen-xs-max: (@screen-sm-min - 1px); +@screen-sm-max: (@screen-md-min - 1px); +@screen-md-max: (@screen-lg-min - 1px); +@screen-lg-max: (@screen-xl-min - 1px); +@screen-xl-max: (@screen-xxl-min - 1px); + +// Grid system +@grid-columns: 24; + +// Layout +@layout-body-background: #f0f2f5; +@layout-header-background: #001529; +@layout-header-height: 64px; +@layout-header-padding: 0 50px; +@layout-header-color: @text-color; +@layout-footer-padding: 24px 50px; +@layout-footer-background: @layout-body-background; +@layout-sider-background: @layout-header-background; +@layout-trigger-height: 48px; +@layout-trigger-background: #002140; +@layout-trigger-color: #fff; +@layout-zero-trigger-width: 36px; +@layout-zero-trigger-height: 42px; +// Layout light theme +@layout-sider-background-light: #fff; +@layout-trigger-background-light: #fff; +@layout-trigger-color-light: @text-color; + +// z-index list, order by `z-index` +@zindex-badge: auto; +@zindex-table-fixed: 2; +@zindex-affix: 10; +@zindex-back-top: 10; +@zindex-picker-panel: 10; +@zindex-popup-close: 10; +@zindex-modal: 1000; +@zindex-modal-mask: 1000; +@zindex-message: 1010; +@zindex-notification: 1010; +@zindex-popover: 1030; +@zindex-dropdown: 1050; +@zindex-picker: 1050; +@zindex-popoconfirm: 1060; +@zindex-tooltip: 1070; +@zindex-image: 1080; + +// Animation +@animation-duration-slow: 0.3s; // Modal +@animation-duration-base: 0.2s; +@animation-duration-fast: 0.1s; // Tooltip + +//CollapsePanel +@collapse-panel-border-radius: @border-radius-base; + +//Dropdown +@dropdown-menu-bg: @component-background; +@dropdown-vertical-padding: 5px; +@dropdown-edge-child-vertical-padding: 4px; +@dropdown-font-size: @font-size-base; +@dropdown-line-height: 22px; + +// Form +// --- +@label-required-color: @highlight-color; +@label-color: @heading-color; +@form-warning-input-bg: @input-bg; +@form-item-margin-bottom: 24px; +@form-item-trailing-colon: true; +@form-vertical-label-padding: 0 0 8px; +@form-vertical-label-margin: 0; +@form-item-label-font-size: @font-size-base; +@form-item-label-height: @input-height-base; +@form-item-label-colon-margin-right: 8px; +@form-item-label-colon-margin-left: 2px; +@form-error-input-bg: @input-bg; + +// Input +// --- +@input-height-base: @height-base; +@input-height-lg: @height-lg; +@input-height-sm: @height-sm; +@input-padding-horizontal: @control-padding-horizontal - 1px; +@input-padding-horizontal-base: @input-padding-horizontal; +@input-padding-horizontal-sm: @control-padding-horizontal-sm - 1px; +@input-padding-horizontal-lg: @input-padding-horizontal; +@input-padding-vertical-base: max( + (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) - + @border-width-base, + 3px +); +@input-padding-vertical-sm: max( + (round(((@input-height-sm - @font-size-base * @line-height-base) / 2) * 10) / 10) - + @border-width-base, + 0 +); +@input-padding-vertical-lg: ( + ceil(((@input-height-lg - @font-size-lg * @line-height-base) / 2) * 10) / 10 + ) - @border-width-base; +@input-placeholder-color: hsv(0, 0, 75%); +@input-color: @text-color; +@input-icon-color: @input-color; +@input-border-color: @border-color-base; +@input-bg: @component-background; +@input-number-hover-border-color: @input-hover-border-color; +@input-number-handler-active-bg: #f4f4f4; +@input-number-handler-hover-bg: @primary-5; +@input-number-handler-bg: @component-background; +@input-number-handler-border-color: @border-color-base; +@input-addon-bg: @background-color-light; +@input-hover-border-color: @primary-5; +@input-disabled-bg: @disabled-bg; +@input-outline-offset: 0 0; +@input-icon-hover-color: fade(@black, 85%); +@input-disabled-color: @disabled-color; + +// Mentions +// --- +@mentions-dropdown-bg: @component-background; +@mentions-dropdown-menu-item-hover-bg: @mentions-dropdown-bg; + +// Select +// --- +@select-border-color: @border-color-base; +@select-item-selected-color: @text-color; +@select-item-selected-font-weight: 600; +@select-dropdown-bg: @component-background; +@select-item-selected-bg: @primary-1; +@select-item-active-bg: @item-hover-bg; +@select-dropdown-vertical-padding: @dropdown-vertical-padding; +@select-dropdown-font-size: @dropdown-font-size; +@select-dropdown-line-height: @dropdown-line-height; +@select-dropdown-height: 32px; +@select-background: @component-background; +@select-clear-background: @select-background; +@select-selection-item-bg: @background-color-base; +@select-selection-item-border-color: @border-color-split; +@select-single-item-height-lg: 40px; +@select-multiple-item-height: @input-height-base - @input-padding-vertical-base * 2; // Normal 24px +@select-multiple-item-height-lg: 32px; +@select-multiple-item-spacing-half: ceil((@input-padding-vertical-base / 2)); +@select-multiple-disabled-background: @input-disabled-bg; +@select-multiple-item-disabled-color: #bfbfbf; +@select-multiple-item-disabled-border-color: @select-border-color; + +// Cascader +// --- +@cascader-bg: @component-background; +@cascader-item-selected-bg: @primary-1; +@cascader-menu-bg: @component-background; +@cascader-menu-border-color-split: @border-color-split; + +// Cascader +// ---- +@cascader-dropdown-vertical-padding: @dropdown-vertical-padding; +@cascader-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding; +@cascader-dropdown-font-size: @dropdown-font-size; +@cascader-dropdown-line-height: @dropdown-line-height; + +// Anchor +// --- +@anchor-bg: transparent; +@anchor-border-color: @border-color-split; +@anchor-link-top: 4px; +@anchor-link-left: 16px; +@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left; + +// Tooltip +// --- +// Tooltip max width +@tooltip-max-width: 250px; +// Tooltip text color +@tooltip-color: #fff; +// Tooltip background color +@tooltip-bg: rgba(0, 0, 0, 0.75); +// Tooltip arrow width +@tooltip-arrow-width: 8px * sqrt(2); +// Tooltip distance with trigger +@tooltip-distance: @tooltip-arrow-width - 1px + 4px; +// Tooltip arrow color +@tooltip-arrow-color: @tooltip-bg; +@tooltip-border-radius: @border-radius-base; + +// Popover +// --- +// Popover body background color +@popover-bg: @component-background; +// Popover text color +@popover-color: @text-color; +// Popover maximum width +@popover-min-width: 177px; +@popover-min-height: 32px; +// Popover arrow width +@popover-arrow-width: @tooltip-arrow-width; +// Popover arrow color +@popover-arrow-color: @popover-bg; +// Popover outer arrow width +// Popover outer arrow color +@popover-arrow-outer-color: @popover-bg; +// Popover distance with trigger +@popover-distance: @popover-arrow-width + 4px; +@popover-padding-horizontal: @padding-md; + +// Modal +// -- +@modal-header-padding-vertical: @padding-md; +@modal-header-padding-horizontal: @padding-lg; +@modal-body-padding: @padding-lg; +@modal-header-bg: @component-background; +@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal; +@modal-header-border-width: @border-width-base; +@modal-header-border-style: @border-style-base; +@modal-header-title-line-height: 22px; +@modal-header-title-font-size: @font-size-lg; +@modal-header-border-color-split: @border-color-split; +@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical; +@modal-content-bg: @component-background; +@modal-heading-color: @heading-color; +@modal-close-color: @text-color-secondary; +@modal-footer-bg: transparent; +@modal-footer-border-color-split: @border-color-split; +@modal-footer-border-style: @border-style-base; +@modal-footer-padding-vertical: 10px; +@modal-footer-padding-horizontal: 16px; +@modal-footer-border-width: @border-width-base; +@modal-mask-bg: fade(@black, 45%); +@modal-confirm-body-padding: 32px 32px 24px; +@modal-confirm-title-font-size: @font-size-lg; +@modal-border-radius: @border-radius-base; + +// Progress +// -- +@progress-default-color: @processing-color; +@progress-remaining-color: rgba(0, 0, 0, 0.04); +@progress-info-text-color: @progress-text-color; +@progress-radius: 100px; +@progress-steps-item-bg: #f3f3f3; +@progress-text-font-size: 1em; +@progress-text-color: @text-color; // This is for circle text color, should be renamed better +@progress-circle-text-font-size: 1em; +// Menu +// --- +@menu-inline-toplevel-item-height: 40px; +@menu-item-height: 40px; +@menu-item-group-height: @line-height-base; +@menu-collapsed-width: 80px; +@menu-bg: @component-background; +@menu-popup-bg: @component-background; +@menu-item-color: @text-color; +@menu-inline-submenu-bg: @background-color-light; +@menu-highlight-color: @primary-color; +@menu-highlight-danger-color: @error-color; +@menu-item-active-bg: @primary-1; +@menu-item-active-danger-bg: @red-1; +@menu-item-active-border-width: 3px; +@menu-item-group-title-color: @text-color-secondary; +@menu-item-vertical-margin: 4px; +@menu-item-font-size: @font-size-base; +@menu-item-boundary-margin: 8px; +@menu-item-padding-horizontal: 20px; +@menu-item-padding: 0 @menu-item-padding-horizontal; +@menu-horizontal-line-height: 46px; +@menu-icon-margin-right: 10px; +@menu-icon-size: @menu-item-font-size; +@menu-icon-size-lg: @font-size-lg; +@menu-item-group-title-font-size: @menu-item-font-size; + +// dark theme +@menu-dark-color: @text-color-secondary-dark; +@menu-dark-danger-color: @error-color; +@menu-dark-bg: @layout-header-background; +@menu-dark-arrow-color: #fff; +@menu-dark-inline-submenu-bg: #000c17; +@menu-dark-highlight-color: #fff; +@menu-dark-item-active-bg: @primary-color; +@menu-dark-item-active-danger-bg: @error-color; +@menu-dark-selected-item-icon-color: @white; +@menu-dark-selected-item-text-color: @white; +@menu-dark-item-hover-bg: transparent; +// Spin +// --- +@spin-dot-size-sm: 14px; +@spin-dot-size: 20px; +@spin-dot-size-lg: 32px; + +// Table +// -- +@table-bg: @component-background; +@table-header-bg: @background-color-light; +@table-header-color: @heading-color; +@table-header-sort-bg: @background-color-base; +@table-body-sort-bg: #fafafa; +@table-row-hover-bg: @background-color-light; +@table-selected-row-color: inherit; +@table-selected-row-bg: @primary-1; +@table-body-selected-sort-bg: @table-selected-row-bg; +@table-selected-row-hover-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-d-02)'; +@table-expanded-row-bg: #fbfbfb; +@table-padding-vertical: 16px; +@table-padding-horizontal: 16px; +@table-padding-vertical-md: (@table-padding-vertical * 3 / 4); +@table-padding-horizontal-md: (@table-padding-horizontal / 2); +@table-padding-vertical-sm: (@table-padding-vertical / 2); +@table-padding-horizontal-sm: (@table-padding-horizontal / 2); +@table-border-color: @border-color-split; +@table-border-radius-base: @border-radius-base; +@table-footer-bg: @background-color-light; +@table-footer-color: @heading-color; +@table-header-bg-sm: @table-header-bg; +@table-font-size: @font-size-base; +@table-font-size-md: @table-font-size; +@table-font-size-sm: @table-font-size; +@table-header-cell-split-color: rgba(0, 0, 0, 0.06); +// Sorter +// Legacy: `table-header-sort-active-bg` is used for hover not real active +@table-header-sort-active-bg: rgba(0, 0, 0, 0.04); +@table-fixed-header-sort-active-bg: hsv(0, 0, 96%); + +// Filter +@table-header-filter-active-bg: rgba(0, 0, 0, 0.04); +@table-filter-btns-bg: inherit; +@table-filter-dropdown-bg: @component-background; +@table-expand-icon-bg: @component-background; +@table-selection-column-width: 32px; +// Sticky +@table-sticky-scroll-bar-bg: fade(#000, 35%); +@table-sticky-scroll-bar-radius: 4px; + +// Tag +// -- +@tag-border-radius: @border-radius-base; +@tag-default-bg: @background-color-light; +@tag-default-color: @text-color; +@tag-font-size: @font-size-sm; +@tag-line-height: 20px; + +// TimePicker +// --- +@picker-bg: @component-background; +@picker-basic-cell-hover-color: @item-hover-bg; +@picker-basic-cell-active-with-range-color: @primary-1; +@picker-basic-cell-hover-with-range-color: ~'var(--@{ant-prefix}-primary-color-deprecated-l-35)'; +@picker-basic-cell-disabled-bg: rgba(0, 0, 0, 0.04); +@picker-border-color: @border-color-split; +@picker-date-hover-range-border-color: ~'var(--@{ant-prefix}-primary-color-deprecated-l-20)'; +@picker-date-hover-range-color: @picker-basic-cell-hover-with-range-color; +@picker-time-panel-column-width: 56px; +@picker-time-panel-column-height: 224px; +@picker-time-panel-cell-height: 28px; +@picker-panel-cell-height: 24px; +@picker-panel-cell-width: 36px; +@picker-text-height: 40px; +@picker-panel-without-time-cell-height: 66px; + +// Calendar +// --- +@calendar-bg: @component-background; +@calendar-input-bg: @input-bg; +@calendar-border-color: @border-color-inverse; +@calendar-item-active-bg: @item-active-bg; +@calendar-column-active-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-f-30)'; +@calendar-full-bg: @calendar-bg; +@calendar-full-panel-bg: @calendar-full-bg; + +// Carousel +// --- +@carousel-dot-width: 16px; +@carousel-dot-height: 3px; +@carousel-dot-active-width: 24px; + +// Badge +// --- +@badge-height: 20px; +@badge-height-sm: 14px; +@badge-dot-size: 6px; +@badge-font-size: @font-size-sm; +@badge-font-size-sm: @font-size-sm; +@badge-font-weight: normal; +@badge-status-size: 6px; +@badge-text-color: @component-background; +@badge-color: @highlight-color; + +// Rate +// --- +@rate-star-color: @yellow-6; +@rate-star-bg: @border-color-split; +@rate-star-size: 20px; +@rate-star-hover-scale: scale(1.1); + +// Card +// --- +@card-head-color: @heading-color; +@card-head-background: transparent; +@card-head-font-size: @font-size-lg; +@card-head-font-size-sm: @font-size-base; +@card-head-padding: 16px; +@card-head-padding-sm: (@card-head-padding / 2); +@card-head-height: 48px; +@card-head-height-sm: 36px; +@card-inner-head-padding: 12px; +@card-padding-base: 24px; +@card-padding-base-sm: (@card-padding-base / 2); +@card-actions-background: @component-background; +@card-actions-li-margin: 12px 0; +@card-skeleton-bg: #cfd8dc; +@card-background: @component-background; +@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), + 0 5px 12px 4px rgba(0, 0, 0, 0.09); +@card-radius: @border-radius-base; +@card-head-tabs-margin-bottom: -17px; +@card-head-extra-color: @text-color; + +// Comment +// --- +@comment-bg: inherit; +@comment-padding-base: @padding-md 0; +@comment-nest-indent: 44px; +@comment-font-size-base: @font-size-base; +@comment-font-size-sm: @font-size-sm; +@comment-author-name-color: @text-color-secondary; +@comment-author-time-color: #ccc; +@comment-action-color: @text-color-secondary; +@comment-action-hover-color: #595959; +@comment-actions-margin-bottom: inherit; +@comment-actions-margin-top: @margin-sm; +@comment-content-detail-p-margin-bottom: inherit; + +// Tabs +// --- +@tabs-card-head-background: @background-color-light; +@tabs-card-height: 40px; +@tabs-card-active-color: @primary-color; +@tabs-card-horizontal-padding: ( + (@tabs-card-height - floor(@font-size-base * @line-height-base)) / 2 + ) - @border-width-base @padding-md; +@tabs-card-horizontal-padding-sm: 6px @padding-md; +@tabs-card-horizontal-padding-lg: 7px @padding-md 6px; +@tabs-title-font-size: @font-size-base; +@tabs-title-font-size-lg: @font-size-lg; +@tabs-title-font-size-sm: @font-size-base; +@tabs-ink-bar-color: @primary-color; +@tabs-bar-margin: 0 0 @margin-md 0; +@tabs-horizontal-gutter: 32px; +@tabs-horizontal-margin: 0 0 0 @tabs-horizontal-gutter; +@tabs-horizontal-margin-rtl: 0 0 0 32px; +@tabs-horizontal-padding: @padding-sm 0; +@tabs-horizontal-padding-lg: @padding-md 0; +@tabs-horizontal-padding-sm: @padding-xs 0; +@tabs-vertical-padding: @padding-xs @padding-lg; +@tabs-vertical-margin: @margin-md 0 0 0; +@tabs-scrolling-size: 32px; +@tabs-highlight-color: @primary-color; +@tabs-hover-color: @primary-5; +@tabs-active-color: @primary-7; +@tabs-card-gutter: 2px; +@tabs-card-tab-active-border-top: 2px solid transparent; + +// BackTop +// --- +@back-top-color: #fff; +@back-top-bg: @text-color-secondary; +@back-top-hover-bg: @text-color; + +// Avatar +// --- +@avatar-size-base: 32px; +@avatar-size-lg: 40px; +@avatar-size-sm: 24px; +@avatar-font-size-base: 18px; +@avatar-font-size-lg: 24px; +@avatar-font-size-sm: 14px; +@avatar-bg: #ccc; +@avatar-color: #fff; +@avatar-border-radius: @border-radius-base; +@avatar-group-overlapping: -8px; +@avatar-group-space: 3px; +@avatar-group-border-color: #fff; + +// Switch +// --- +@switch-height: 22px; +@switch-sm-height: 16px; +@switch-min-width: 44px; +@switch-sm-min-width: 28px; +@switch-disabled-opacity: 0.4; +@switch-color: @primary-color; +@switch-bg: @component-background; +@switch-shadow-color: fade(#00230b, 20%); +@switch-padding: 2px; +@switch-inner-margin-min: ceil(@switch-height * 0.3); +@switch-inner-margin-max: ceil(@switch-height * 1.1); +@switch-sm-inner-margin-min: ceil(@switch-sm-height * 0.3); +@switch-sm-inner-margin-max: ceil(@switch-sm-height * 1.1); + +// Pagination +// --- +@pagination-item-bg: @component-background; +@pagination-item-size: @height-base; +@pagination-item-size-sm: 24px; +@pagination-font-family: @font-family; +@pagination-font-weight-active: 500; +@pagination-item-bg-active: @component-background; +@pagination-item-link-bg: @component-background; +@pagination-item-disabled-color-active: @disabled-color; +@pagination-item-disabled-bg-active: @disabled-active-bg; +@pagination-item-input-bg: @component-background; +@pagination-mini-options-size-changer-top: 0px; + +// PageHeader +// --- +@page-header-padding: @padding-lg; +@page-header-padding-vertical: @padding-md; +@page-header-padding-breadcrumb: @padding-sm; +@page-header-content-padding-vertical: @padding-sm; +@page-header-back-color: #000; +@page-header-ghost-bg: inherit; +@page-header-heading-title: @heading-4-size; +@page-header-heading-sub-title: 14px; +@page-header-tabs-tab-font-size: 16px; + +// Breadcrumb +// --- +@breadcrumb-base-color: @text-color-secondary; +@breadcrumb-last-item-color: @text-color; +@breadcrumb-font-size: @font-size-base; +@breadcrumb-icon-font-size: @font-size-base; +@breadcrumb-link-color: @text-color-secondary; +@breadcrumb-link-color-hover: @text-color; +@breadcrumb-separator-color: @text-color-secondary; +@breadcrumb-separator-margin: 0 @padding-xs; + +// Slider +// --- +@slider-margin: 10px 6px 10px; +@slider-rail-background-color: @background-color-base; +@slider-rail-background-color-hover: #e1e1e1; +@slider-track-background-color: @primary-3; +@slider-track-background-color-hover: @primary-4; +@slider-handle-border-width: 2px; +@slider-handle-background-color: @component-background; +@slider-handle-color: @primary-3; +@slider-handle-color-hover: @primary-4; +@slider-handle-color-focus: ~'var(--@{ant-prefix}-primary-color-deprecated-t-20)'; +@slider-handle-color-focus-shadow: ~'var(--@{ant-prefix}-primary-color-deprecated-f-12)'; +@slider-handle-color-tooltip-open: @primary-color; +@slider-handle-size: 14px; +@slider-handle-margin-top: -5px; +@slider-handle-margin-left: -5px; +@slider-handle-shadow: 0; +@slider-dot-border-color: @border-color-split; +@slider-dot-border-color-active: ~'var(--@{ant-prefix}-primary-color-deprecated-t-50)'; +@slider-disabled-color: @disabled-color; +@slider-disabled-background-color: @component-background; + +// Tree +// --- +@tree-bg: @component-background; +@tree-title-height: 24px; +@tree-child-padding: 18px; +@tree-directory-selected-color: #fff; +@tree-directory-selected-bg: @primary-color; +@tree-node-hover-bg: @item-hover-bg; +@tree-node-selected-bg: @primary-2; + +// Collapse +// --- +@collapse-header-padding: @padding-sm @padding-md; +@collapse-header-padding-extra: 40px; +@collapse-header-bg: @background-color-light; +@collapse-content-padding: @padding-md; +@collapse-content-bg: @component-background; +@collapse-header-arrow-left: 16px; + +// Skeleton +// --- +@skeleton-color: rgba(190, 190, 190, 0.2); +@skeleton-to-color: shade(@skeleton-color, 5%); +@skeleton-paragraph-margin-top: 28px; +@skeleton-paragraph-li-margin-top: @margin-md; +@skeleton-paragraph-li-height: 16px; +@skeleton-title-height: 16px; +@skeleton-title-paragraph-margin-top: @margin-lg; + +// Transfer +// --- +@transfer-header-height: 40px; +@transfer-item-height: @height-base; +@transfer-disabled-bg: @disabled-bg; +@transfer-list-height: 200px; +@transfer-item-hover-bg: @item-hover-bg; +@transfer-item-selected-hover-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-d-02)'; +@transfer-item-padding-vertical: 6px; +@transfer-list-search-icon-top: 12px; + +// Message +// --- +@message-notice-content-padding: 10px 16px; +@message-notice-content-bg: @component-background; +// Motion +// --- +@wave-animation-width: 6px; + +// Alert +// --- +@alert-success-border-color: @success-color-deprecated-border; +@alert-success-bg-color: @success-color-deprecated-bg; +@alert-success-icon-color: @success-color; +@alert-info-border-color: @info-color-deprecated-border; +@alert-info-bg-color: @info-color-deprecated-bg; +@alert-info-icon-color: @info-color; +@alert-warning-border-color: @warning-color-deprecated-border; +@alert-warning-bg-color: @warning-color-deprecated-bg; +@alert-warning-icon-color: @warning-color; +@alert-error-border-color: @error-color-deprecated-border; +@alert-error-bg-color: @error-color-deprecated-bg; +@alert-error-icon-color: @error-color; +@alert-message-color: @heading-color; +@alert-text-color: @text-color; +@alert-close-color: @text-color-secondary; +@alert-close-hover-color: @icon-color-hover; +@alert-padding-vertical: @padding-xs; +@alert-padding-horizontal: @padding-md - 1px; +@alert-no-icon-padding-vertical: @padding-xs; +@alert-with-description-no-icon-padding-vertical: @padding-md - 1px; +@alert-with-description-padding-vertical: @padding-md - 1px; +@alert-with-description-padding: @alert-with-description-padding-vertical 15px + @alert-with-description-no-icon-padding-vertical @alert-with-description-icon-size; +@alert-icon-top: 8px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2); +@alert-with-description-icon-size: 24px; + +// List +// --- +@list-header-background: transparent; +@list-footer-background: transparent; +@list-empty-text-padding: @padding-md; +@list-item-padding: @padding-sm 0; +@list-item-padding-sm: @padding-xs @padding-md; +@list-item-padding-lg: 16px 24px; +@list-item-meta-margin-bottom: @padding-md; +@list-item-meta-avatar-margin-right: @padding-md; +@list-item-meta-title-margin-bottom: @padding-sm; +@list-customize-card-bg: @component-background; +@list-item-meta-description-font-size: @font-size-base; + +// Statistic +// --- +@statistic-title-font-size: @font-size-base; +@statistic-content-font-size: 24px; +@statistic-unit-font-size: 24px; +@statistic-font-family: @font-family; + +// Drawer +// --- +@drawer-header-padding: @padding-md @padding-lg; +@drawer-body-padding: @padding-lg; +@drawer-bg: @component-background; +@drawer-footer-padding-vertical: @modal-footer-padding-vertical; +@drawer-footer-padding-horizontal: @modal-footer-padding-horizontal; +@drawer-header-close-size: 56px; +@drawer-title-font-size: @font-size-lg; +@drawer-title-line-height: 22px; + +// Timeline +// --- +@timeline-width: 2px; +@timeline-color: @border-color-split; +@timeline-dot-border-width: 2px; +@timeline-dot-color: @primary-color; +@timeline-dot-bg: @component-background; +@timeline-item-padding-bottom: 20px; + +// Typography +// --- +@typography-title-font-weight: 600; +@typography-title-margin-top: 1.2em; +@typography-title-margin-bottom: 0.5em; + +// Upload +// --- +@upload-actions-color: @text-color-secondary; + +// Steps +// --- +@process-tail-color: @border-color-split; +@steps-nav-arrow-color: fade(@black, 25%); +@steps-background: @component-background; +@steps-icon-size: 32px; +@steps-icon-custom-size: @steps-icon-size; +@steps-icon-custom-top: 0px; +@steps-icon-custom-font-size: 24px; +@steps-icon-top: -0.5px; +@steps-icon-font-size: @font-size-lg; +@steps-icon-margin: 0 8px 0 0; +@steps-title-line-height: @height-base; +@steps-small-icon-size: 24px; +@steps-small-icon-margin: 0 8px 0 0; +@steps-dot-size: 8px; +@steps-dot-top: 2px; +@steps-current-dot-size: 10px; +@steps-description-max-width: 140px; +@steps-nav-content-max-width: auto; +@steps-vertical-icon-width: 16px; +@steps-vertical-tail-width: 16px; +@steps-vertical-tail-width-sm: 12px; + +// Notification +// --- +@notification-bg: @component-background; +@notification-padding-vertical: 16px; +@notification-padding-horizontal: 24px; + +// Result +// --- +@result-title-font-size: 24px; +@result-subtitle-font-size: @font-size-base; +@result-icon-font-size: 72px; +@result-extra-margin: 24px 0 0 0; + +// Image +// --- +@image-size-base: 48px; +@image-font-size-base: 24px; +@image-bg: #f5f5f5; +@image-color: #fff; +@image-mask-font-size: 16px; +@image-preview-operation-size: 18px; +@image-preview-operation-color: @text-color-dark; +@image-preview-operation-disabled-color: fade(@image-preview-operation-color, 25%); + +// Segmented +// --- +@segmented-bg: fade(@black, 4%); +@segmented-hover-bg: fade(@black, 6%); +@segmented-selected-bg: @white; +@segmented-label-color: fade(@black, 65%); +@segmented-label-hover-color: #262626; diff --git a/src/styles/variable.less b/src/styles/variable.less new file mode 100644 index 0000000..6c70293 --- /dev/null +++ b/src/styles/variable.less @@ -0,0 +1,4 @@ +@root-entry-name: variable; + +@import './themes/variable.less'; +@import './core/index'; diff --git a/src/testData/02.json b/src/testData/02.json new file mode 100644 index 0000000..67d59f1 --- /dev/null +++ b/src/testData/02.json @@ -0,0 +1,147 @@ +{ + "objects": [ + { + "type": "rect", + "version": "4.6.0", + "originX": "left", + "originY": "top", + "left": 796.72, + "top": 455.28, + "width": 400, + "height": 400, + "fill": "#F57274", + "stroke": null, + "strokeWidth": 1, + "strokeDashArray": null, + "strokeLineCap": "butt", + "strokeDashOffset": 0, + "strokeLineJoin": "miter", + "strokeUniform": false, + "strokeMiterLimit": 4, + "scaleX": 1, + "scaleY": 1, + "angle": 0, + "flipX": false, + "flipY": false, + "opacity": 1, + "shadow": "", + "visible": true, + "backgroundColor": "", + "fillRule": "nonzero", + "paintFirst": "fill", + "globalCompositeOperation": "source-over", + "skewX": 0, + "skewY": 0, + "rx": 0, + "ry": 0, + "id": "21fe0d8f-70b8-4e35-a716-8f93e0f58d73", + "link": { + "enabled": false, + "type": "resource", + "state": "new", + "dashboard": {} + }, + "tooltip": { + "enabled": true, + "type": "resource", + "template": "<div>{{message.name}}</div>" + }, + "animation": { + "type": "flash", + "loop": true, + "autoplay": true, + "duration": 1000, + "delay": 0, + "fill": "rgba(139,87,42,1)", + "stroke": null + }, + "userProperty": {}, + "trigger": { + "enabled": false, + "type": "alarm", + "script": "return message.value > 0;", + "effect": "style" + }, + "editable": true + }, + { + "type": "textbox", + "version": "4.6.0", + "originX": "left", + "originY": "top", + "left": 834.88, + "top": 610.08, + "width": 330.98, + "height": 195.26, + "fill": "rgba(77,148,132,1)", + "strokeWidth": 1, + "strokeDashArray": null, + "strokeLineCap": "butt", + "strokeDashOffset": 0, + "strokeLineJoin": "miter", + "strokeUniform": false, + "strokeMiterLimit": 4, + "scaleX": 1, + "scaleY": 1, + "angle": 0, + "flipX": false, + "flipY": false, + "opacity": 1, + "shadow": "", + "visible": true, + "backgroundColor": "", + "fillRule": "nonzero", + "paintFirst": "fill", + "globalCompositeOperation": "source-over", + "skewX": 0, + "skewY": 0, + "fontFamily": "arial", + "fontWeight": "normal", + "fontSize": 80, + "text": "诸事顺11遂", + "underline": false, + "overline": false, + "linethrough": false, + "textAlign": "left", + "fontStyle": "normal", + "lineHeight": 1.16, + "textBackgroundColor": "", + "charSpacing": 0, + "styles": [], + "direction": "ltr", + "path": null, + "pathStartOffset": 0, + "pathSide": "left", + "minWidth": 20, + "splitByGrapheme": true, + "id": "37cad86f-f251-49a1-abe5-fbc838c2e20c", + "link": { + "enabled": false, + "type": "resource", + "state": "new", + "dashboard": {} + }, + "tooltip": { + "enabled": true, + "type": "resource", + "template": "<div>{{message.name}}</div>" + }, + "animation": { + "type": "flash", + "loop": true, + "autoplay": true, + "duration": 1000, + "delay": 0, + "fill": "rgba(74,74,74,1)" + }, + "userProperty": {}, + "trigger": { + "enabled": false, + "type": "alarm", + "script": "return message.value > 0;", + "effect": "style" + }, + "editable": true + } + ] +} \ No newline at end of file diff --git a/src/testData/SettingAIgorithm.tsx b/src/testData/SettingAIgorithm.tsx new file mode 100644 index 0000000..54c91c3 --- /dev/null +++ b/src/testData/SettingAIgorithm.tsx @@ -0,0 +1,41 @@ +/* + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-07 10:57:28 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-07 10:57:32 + * @FilePath: \general-ai-platform-web\src\testData\SettingAIgorithm.ts + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +const data = [ + '苏胜天人物识别算法', + '苏胜天交警识别识别', + '苏胜天车牌识别算法', + '苏胜天语音识别算法', + '苏胜天轨迹识别算法', + ].map((item) => ({ + title: '苏胜天算法模型', + subTitle: <Tag color="#5BD8A6">经典算法</Tag>, + actions: [<a key="run">模型版本选择</a>], + avatar: 'https://gw.alipayobjects.com/zos/antfincdn/UCSiy1j6jx/xingzhuang.svg', + content: ( + <div + style={{ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + width: '100%', + }} + > + <div style={{ fontSize: '24px', fontWeight: 'bold' }}>{item}</div> + <div> + <img src="/images/model.png" alt="" style={{ width: '160px' }} /> + </div> + <div> + 版本:<span style={{ fontSize: 18, fontWeight: 'bold' }}>V1.2.4</span> + </div> + <div> + 更新时间:<span style={{ fontSize: 18, fontWeight: 'bold' }}>2022-12-12</span> + </div> + </div> + ), + })); \ No newline at end of file diff --git a/src/testData/fabricGroup1.ts b/src/testData/fabricGroup1.ts new file mode 100644 index 0000000..dec8eca --- /dev/null +++ b/src/testData/fabricGroup1.ts @@ -0,0 +1,617 @@ +const currJson0: Record<string, any> = { + version: '5.3.0', + objects: [ + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 778.0535, + top: 172.6152, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: 'f772494d-01de-4a9e-b21d-67faed778e60', + selectable: true, + hasControls: true, + userProperty: { + modelId: '121', + status: '0', + id: '2', + label: '正常', + des: '卧室B', + }, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(44,246,72,0.99)', + stroke: 'rgba(45,240,230,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: true, + hasControls: true, + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -16.7824, + top: -8.9323, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '正常', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: true, + hasControls: true, + }, + ], + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 384.136, + top: 153.6373, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: '3fea9335-b7a3-4b01-bf7b-7d15b4ca6b62', + selectable: true, + hasControls: true, + userProperty: { + modelId: '120', + status: '1', + id: '1', + label: '异常', + des: '卧室A', + }, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(248,9,3,0.94)', + stroke: 'rgba(255,243,47,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: true, + hasControls: true, + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -15.8708, + top: -8.9298, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '警告', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: true, + hasControls: true, + }, + ], + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 409.6953, + top: 437.8391, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: '16c614ab-6172-4d06-b787-75e8ddc33c68', + selectable: true, + hasControls: true, + userProperty: { + modelId: '122', + status: '0', + id: '3', + label: '正常', + des: '客厅1', + }, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(44,246,72,0.99)', + stroke: 'rgba(45,240,230,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: true, + hasControls: true, + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -16.7824, + top: -8.9323, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '正常', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: true, + hasControls: true, + }, + ], + }, + { + type: 'group', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 384.136, + top: 706.1746, + width: 48.205, + height: 48.205, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + id: '6217576c-4b4a-4916-948a-e99fe9f03bbc', + selectable: true, + hasControls: true, + userProperty: { + modelId: '124', + status: '1', + id: '4', + label: '异常', + des: '卧室C', + }, + objects: [ + { + type: 'circle', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -24.1025, + top: -24.1025, + width: 300, + height: 300, + fill: 'rgba(248,9,3,0.94)', + stroke: 'rgba(255,243,47,1)', + strokeWidth: 10, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1555, + scaleY: 0.1555, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + radius: 150, + startAngle: 0, + endAngle: 360, + selectable: true, + hasControls: true, + }, + { + type: 'i-text', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: -15.8708, + top: -8.9298, + width: 160, + height: 90.4, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 0.1954, + scaleY: 0.1954, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: '', + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + fontFamily: 'arial', + fontWeight: 'normal', + fontSize: 80, + text: '警告', + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + fontStyle: 'normal', + lineHeight: 1.16, + textBackgroundColor: '', + charSpacing: 0, + styles: [], + direction: 'ltr', + path: null, + pathStartOffset: 0, + pathSide: 'left', + pathAlign: 'baseline', + selectable: true, + hasControls: true, + }, + ], + }, + ], + clipPath: { + type: 'rect', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0, + top: 0, + width: 1200, + height: 900, + fill: 'rgba(255,255,255,1)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + selectable: true, + hasControls: true, + }, +}; +let currJson00: Record<string, any> = { + ...currJson0, + // objects: [], +}; + +// 生成100到1100之间的随机整数 +// function generateRandomNumber(minNum, maxNum) { +// // 生成0到1之间的随机小数 +// const randomFraction = Math.random(); + +// // 将随机小数映射到100到1100之间的范围 +// const randomNumber = Math.floor(randomFraction * (maxNum - minNum + 1) + minNum); + +// return randomNumber; +// } +// let startTime = new Date().getTime() +// let endTime = new Date().getTime() + +// for (let i = 0; i < 2; i++) { +// let currObjects = JSON.parse(JSON.stringify(currJson0.objects)) +// currObjects = currObjects.map(item=>{ +// item.left = generateRandomNumber(100, 1100) +// item.top = generateRandomNumber(100, 800) +// return item +// }) +// currJson00.objects = currJson00.objects.concat(currObjects) +// } +// endTime = new Date().getTime() +// console.log(currJson00,'currJson00', endTime-startTime) + +export const currJson1 = currJson00; diff --git a/src/testData/shapeWithText.json b/src/testData/shapeWithText.json new file mode 100644 index 0000000..3f82b84 --- /dev/null +++ b/src/testData/shapeWithText.json @@ -0,0 +1,253 @@ +{ + "objects": [ + { + "type": "image", + "version": "4.6.0", + "originX": "left", + "originY": "top", + "left": 660, + "top": 376.66, + "width": 600, + "height": 400, + "fill": "rgb(0,0,0)", + "stroke": null, + "strokeWidth": 0, + "strokeDashArray": null, + "strokeLineCap": "butt", + "strokeDashOffset": 0, + "strokeLineJoin": "miter", + "strokeUniform": false, + "strokeMiterLimit": 4, + "scaleX": 1, + "scaleY": 1, + "angle": 0, + "flipX": false, + "flipY": false, + "opacity": 1, + "shadow": null, + "visible": true, + "backgroundColor": "#fff", + "fillRule": "nonzero", + "paintFirst": "fill", + "globalCompositeOperation": "source-over", + "skewX": 0, + "skewY": 0, + "cropX": 0, + "cropY": 0, + "id": "workarea", + "name": "", + "link": {}, + "tooltip": { + "enabled": false + }, + "layout": "fixed", + "workareaWidth": 600, + "workareaHeight": 400, + "src": "", + "crossOrigin": null, + "filters": [] + }, + { + "type": "rect", + "version": "4.6.0", + "originX": "left", + "originY": "top", + "left": -34, + "top": -4, + "width": 900, + "height": 1200, + "fill": "rgba(255,255,255,1)", + "stroke": null, + "strokeWidth": 0, + "strokeDashArray": null, + "strokeLineCap": "butt", + "strokeDashOffset": 0, + "strokeLineJoin": "miter", + "strokeUniform": false, + "strokeMiterLimit": 4, + "scaleX": 1, + "scaleY": 1, + "angle": 0, + "flipX": false, + "flipY": false, + "opacity": 1, + "shadow": null, + "visible": true, + "backgroundColor": "", + "fillRule": "nonzero", + "paintFirst": "fill", + "globalCompositeOperation": "source-over", + "skewX": 0, + "skewY": 0, + "rx": 0, + "ry": 0, + "id": "workspace", + "link": { + "enabled": false, + "type": "resource", + "state": "new", + "dashboard": {} + }, + "tooltip": { + "enabled": true, + "type": "resource", + "template": "<div>{{message.name}}</div>" + }, + "animation": { + "type": "none", + "loop": true, + "autoplay": true, + "duration": 1000 + }, + "userProperty": {}, + "trigger": { + "enabled": false, + "type": "alarm", + "script": "return message.value > 0;", + "effect": "style" + }, + "editable": true + }, + { + "type": "rect", + "version": "4.6.0", + "originX": "left", + "originY": "top", + "left": 237.13, + "top": 377.89, + "width": 400, + "height": 400, + "fill": "rgba(243,113,115,1)", + "strokeWidth": 1, + "strokeDashArray": null, + "strokeLineCap": "butt", + "strokeDashOffset": 0, + "strokeLineJoin": "miter", + "strokeUniform": false, + "strokeMiterLimit": 4, + "scaleX": 0.71, + "scaleY": 0.71, + "angle": 0, + "flipX": false, + "flipY": false, + "opacity": 1, + "shadow": "", + "visible": true, + "backgroundColor": "", + "fillRule": "nonzero", + "paintFirst": "fill", + "globalCompositeOperation": "source-over", + "skewX": 0, + "skewY": 0, + "rx": 0, + "ry": 0, + "id": "21fe0d8f-70b8-4e35-a716-8f93e0f58d73", + "link": { + "enabled": false, + "type": "resource", + "state": "new", + "dashboard": {} + }, + "tooltip": { + "enabled": true, + "type": "resource", + "template": "<div>{{message.name}}</div>" + }, + "animation": { + "type": "flash", + "loop": true, + "autoplay": true, + "duration": 1000, + "delay": 0, + "fill": "rgba(0,0,0,1)", + "stroke": null + }, + "userProperty": {}, + "trigger": { + "enabled": false, + "type": "alarm", + "script": "return message.value > 0;", + "effect": "style" + }, + "editable": true + }, + { + "type": "textbox", + "version": "4.6.0", + "originX": "left", + "originY": "top", + "left": 281.03, + "top": 482.85, + "width": 330.98, + "height": 90.4, + "fill": "rgba(246,237,237,1)", + "stroke": null, + "strokeWidth": 1, + "strokeDashArray": null, + "strokeLineCap": "butt", + "strokeDashOffset": 0, + "strokeLineJoin": "miter", + "strokeUniform": false, + "strokeMiterLimit": 4, + "scaleX": 0.65, + "scaleY": 0.65, + "angle": 0, + "flipX": false, + "flipY": false, + "opacity": 1, + "shadow": "", + "visible": true, + "backgroundColor": "", + "fillRule": "nonzero", + "paintFirst": "fill", + "globalCompositeOperation": "source-over", + "skewX": 0, + "skewY": 0, + "fontFamily": "arial", + "fontWeight": "normal", + "fontSize": 80, + "text": "诸事顺遂", + "underline": false, + "overline": false, + "linethrough": false, + "textAlign": "left", + "fontStyle": "normal", + "lineHeight": 1.16, + "textBackgroundColor": "", + "charSpacing": 0, + "styles": [], + "direction": "ltr", + "path": null, + "pathStartOffset": 0, + "pathSide": "left", + "minWidth": 20, + "splitByGrapheme": true, + "id": "37cad86f-f251-49a1-abe5-fbc838c2e20c", + "link": { + "enabled": false, + "type": "resource", + "state": "new", + "dashboard": {} + }, + "tooltip": { + "enabled": true, + "type": "resource", + "template": "<div>{{message.name}}</div>" + }, + "animation": { + "type": "none", + "loop": true, + "autoplay": true, + "duration": 1000 + }, + "userProperty": {}, + "trigger": { + "enabled": false, + "type": "alarm", + "script": "return message.value > 0;", + "effect": "style" + }, + "editable": true + } + ] +} \ No newline at end of file diff --git a/src/testData/testData.md b/src/testData/testData.md new file mode 100644 index 0000000..3684c11 --- /dev/null +++ b/src/testData/testData.md @@ -0,0 +1,11 @@ +<!-- + * @Author: zhoux zhouxia@supervision.ltd + * @Date: 2023-11-07 10:55:31 + * @LastEditors: zhoux zhouxia@supervision.ltd + * @LastEditTime: 2023-11-07 10:55:42 + * @FilePath: \general-ai-platform-web\src\testData\testData.md + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE +--> +### 测试数据 + + diff --git a/src/testData/testSvg.ts b/src/testData/testSvg.ts new file mode 100644 index 0000000..c2c5a8e --- /dev/null +++ b/src/testData/testSvg.ts @@ -0,0 +1,40 @@ +export const bgImageData = { + type: 'image', + version: '5.3.0', + originX: 'left', + originY: 'top', + left: 0.7463, + top: 0, + width: 1200, + height: 900, + fill: 'rgb(0,0,0)', + stroke: null, + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'miter', + strokeUniform: false, + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + skewX: 0, + skewY: 0, + cropX: 0, + cropY: 0, + selectable: false, + hasControls: true, + src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAIAAAA+D1+tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0xMS0yOVQxNjowNjozNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjMWE2ZTE4MC1iMTc1LTQ2NGMtYjBlZS0zYjgxYTcwNjY4MTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4YjQzZmIyYy1hYmVmLWYzNGItODVlZC1k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oizn60n1OZ3O5cuXnzp16vXXX588efKcOXO459vFixc3btw4YMCAFStWiJuo6jcYDIFAID8//4EHHvjwww937drF/YR5AyI5hwDEL2FGQyIJciYS7EmBUwAQgSAEIFbwer293QTQ59Bm3lOE+EBygCwoKHjsscco08zBgwdTU1PHjRv3y1/+kuYzIBFCsz+rPCr5LsS99HovROW6yTUhdRnpwNesWZOamjphwgQWQmUxjcsor5ObQ81m82233fbpp5+uWbNm2bJlUogEqqSZRddTlSyUZXnw4MFf+9rXPvroo9dee+2uu+5ijH322WelpaXz5s2jCSq41BQFOVVFNV+6dGnv3r3Hjh1TqUEA+ji9/kYCIBaAIASgRwnjNka2mg6NQeJLBjoJH4ZQ2s6Mp7SGApIgYYzl5+e/9NJL//Vf/zV58uTnn39eVIMqX1Mm3Jm9622ldfJkgsuooplej+x47777bmNj47333muxWPh50K1K6zIq2kgVRbFYLHPmzFm/fv2mTZtuuukmHk+oKizWo42cpGLp6ekrV67cvn37n//855aWlmHDht1///1ms5m1ika+U1XWGc6FCxfghgCA1DqVC/2bYHY/AKIDMYQA9DRSW/j6TsYQdmkbQfwR3c0Qam4uMaCOMeb1er/88suZM2du3Ljx8ccfv3btWlVVFWuNjuMSS3tXM01mzp5Ed7/iSuoaKkIKlnfffbe2tnbZsmUOh4Np3EpF6FRrH1uVX6jVal2+fPm1a9fee+891nrGdKvS3QVrmw9j0KBBFRUVhw4d6tevH6lBJgRqai2E4pGaTCaLxSLWDAAAADBYCAHoMXTDqMS+KZ9zrPP1AxAhuiYjlUYqLS194403JkyYsHTpUirwxRdf/Pa3vx06dOjXv/51KkOztGtj5KgqlVmsOw9IH1WTxMkDg8Egzf/OGHvzzTcbGhpuv/12mp6B6+FQIYhhhJwozCRJuv3221evXr1u3brFixdrNaHf7xclHP8rXgWXy/XKK6/4fL7/+3//L2Ns8+bN/9//9//dddddhYWFBoOBTjI57jK9uToURamtreX+on6/n2y8AAAAAAQhAD1Hu9nMeqwlABBcGol2MC5CmpqatmzZUldXt2rVqmHDhjHGAoGAwWCYOHFifn7+tm3bnnrqqRkzZkycONFoNIoKRAylUykT0SW1d+95ahupQb/fv27dusrKyhUrVnA1yIupMuUQ2nw5TOPnya2jSUlJN91007vvvvvFF19MnDiRWyYpZFElLMXTSMuff/75zp07Bw8efP3119NP8+bNS05O/uCDDwoKChYsWEDTrFFqH63TKdHY2Ch6CGt3BwBQgacD9BEgCAHoUUQTiqqvTNOFmc1mSjmo22MzGo0ej0e7HoDo4IJQ1D+kBsvKyg4cONDY2Dh//vzc3FxehjRhbm7uHXfc8dFHH33yySdXrlyZP38+eTBqY+q00zywjs8r3YXwPCt0pNQGmkLjzjvvzMzMZBq3T7HN/ABJ0YXRtFz00o6KiooWL168YcMGWZZp2kZuniX7Kt+Qp3hljLW0tOzYsWP//v0TJ0688cYbecyhwWCYOnVqdnb2xx9//N57782ePTs9PZ1MhbqtkmXZ4XAEg8GGhgaGKSgAAAAIQBAC0JuIvUDy4HK73bohRrTQ3Nys3RCAqBF9FEX3yD179mzdunXWrFmLFy/mJUnYcMlhNBpvueWWQYMG/e1vfzt+/PgDDzyQlZXFbV+s1dKoaNKxaNf0FnTIa9euvXbt2sqVK8k2SHJLJau0ElFqnRderJAX4/ZPnu5FkqQBAwbMnTv3k08+8fl8U6ZMoTk8mDB7IWs7xUVDQ8Pq1atramruueee/v37MyGekBxEi4uLv/GNb6xdu/bll1++4447BgwYwFvIM82Iu6CV4mwZDL4JIEHRHdDpKAn8dMTISxjECBCEAPQoKiOD2MukJBZ+vz8jI6O6upoKFBQUXL16lSwJVqvVZrPV1tay1uT4CfytAp0h8i+9qNxoTW1t7fr169PT0x999FGbzaYqpnVHHDJkyH//939v3rz5f/7nf2bNmrV06VIeVcjrFFPXqPKddGunRHcvor3d5/Nt2bLl6tWry5Yt040bDONaqfWGFX8Sz5XSOq2FLMvDhw9XFGXLli0+n2/mzJlUgIu3YDBoNBpp+c0339y7d+/ixYtnzZol1sPPKt/77bfffuHChbVr16akpKxatcpms2ndcQOBwPnz5/mFgIUQ9CnC3PDQRQAwZBkFIBaQJMntdrtcrgsXLiiKUlVVpSjK559/HggEysrKfD5feXl5VVWVy+Wqqan5+OOPGWPknocvGdDSobuiqamJtWqMmpqaXbt27dixY+zYsTfddJNKDfKaudThkzcwxm688cZHHnmkoqLiL3/5y6lTpxhjZP7yer2BQICWRVWpTUbaHejuqLm5ma/Ztm3bJ598cscdd2RnZ/Mj0lWPWn2o6w0r5nRRrQ8GgzSyM2LEiOuvv37//v2lpaX0a0tLC10Ik8kkSdLVq1dfffXVmpqau+66i9SguCPxoLjBsKio6K677srKynr77bfF8y+SlpZmt9tpGbOeAsDB+AgAsBAC0KOoYgj5eortGThwIGs1F5jN5paWlqSkJMaY3++nwELGWGpqKmvt7cWO6x2IHTp0V+Tn59NCS0tLaWlpS0vLmDFjioqKaKXf7xd1hVbkcPdRmjw9Ozv7lVdeWb169bJly0aMGMEYs9lsNpstlPzolbvX4XDQ7AuXL18+dOjQsmXLcnJyWOgJ6FX6UJTHRqMxjCFRdSGMRmMgEKBTOmrUKKvV+sorr+Tm5mZmZvbr148UKWOsoqJizZo1kiTdddddaWlpjDGPx2M2myUhT4+4I0mSqM6cnJyFCxdu27Zt+/btLpdrzJgx4lE4nc6SkpKamprz58+rLgfeISDx6Cr3GdUj3yV1AhCDQBAC0Atou+yU6OLUqVOZmZmyLLtcroMHDzqdzqSkJI/Hs2fPnmHDhlFij+PHj0+YMIFv1QutB7FNh+4K0kKXLl3atm3b2LFjScUFg0HKa0K3pWglE7ODin99Pp8kSSkpKd/5znf27t37l7/8ZcKECQ888ABrtWaz1tQp7TavS3py4l54m8khMysriyZR/PTTT8eNGzd58mSy3YmWN/GvtnlKa25S1mpboLDDUMeitJ14w+v1mkymkpKSfv367d27d9asWQMHDuzXrx9jbP369bt27Zo/f/7cuXMZYz6fj2bFIFdPVatEC63P51MUxWw2z549e+TIka+++uqFCxduueUWrucbGhrKysqamppIDYpzTsDzHIBQJHC0LfoPQASCEIAehdsTuKlQDOJyuVxUwO/3u91uXtjj8fCEhI2Njb3WepBA0I23YcOGhx9+ODk5ecGCBRRExxiTZTnUfJihlJJoSJwyZcqUKVM++OCD7du3T506ddCgQUOHDmWM8VnRw9Pl3RTeZjooj8fzu9/9bvDgwcuXLyddRAb5DtXGGCPrPTlhhj+0UEf0yCOPkJvu9u3bZ8yYEQgEqqurv//973NrYXRTBWZkZHzrW986fvz4lStXKBUNb4YqrJGvT7CeLgDdgfi9xiMDEgwIQgB6Dt1c9vwnv9/Po7bMZjPvYcuybDAYeAc96pnrARChu3HdunV/+tOf7r33XkmSGhoaqqqq3G43TSpIVimfzyfLMp+ngYxdUmvKSrE2RVFo24yMjMzMzAEDBvz7v//7Bx98wBh7/vnn77zzzsOHD9OdzGfnI7T/alsbSlPpdsuosDj/OxkJjUZjfn7+f/zHfxw4cOBvf/vb17/+davVev78eXLIjGR3hN1ub2xsPH369N///vdDhw7Z7XaPx9PU1ETnTbcxqmff4/GYTKbU1FRZlv/whz98+OGHTz755Ny5c3/xi1/4fL5Tp05dvnxZkiSDwWA2m3nWU9b6+PPcrdQxpckzZFkmO2FycrLNZrNareXl5YWFhbwZgUCAJ5XRPV70cQFQwd0i+L+qBQASAwhCAHoI3X6h+CtpQvr2BAIB8hZjrfkkeC9ZTNhIoBsHOB3qptBdV15eXl9fX15eTlmLWGvMKjmOksYgLUH3J01awGUha1V0fr/fZDKRi2NqampJScmFCxdoR3/+85+Tk5MPHTrEWtOriP6WrK0I1L2fQ2V9CDU+QmF14tkgs2d6evqgQYMyMjImTpxI+UVbWlrsdjs5UmoTsei2xGw2k5fpuHHjjEbjv/71L/pXnGNDlKOsbWpQcjcNBALBYHD+/PmzZ8/+8MMPGWOffPLJL3/5y48++ujChQvkwkrnk7VmHyXtRzVzEchDGXmqUoPBkJmZmZOTo7JbihNphBHSAAARPBegLwBBCEBPE6q/q8piz+cKIzXIdWAChzSAzhPGCq2C1OCoUaN+97vf1dbWZmZmpqSkdGFL1q9f/93vfrekpOTAgQPf//73ZVletWpVF9afMMydO7eoqMhut1N+0a985StdUu3Zs2f9fv/Ro0cpLpTcYi0Wi8vlEuNCAUhIuirjWpiJZwBIJCAIAehRtF8UMSZBNJjwf3kuR/qJpxvVrQ2ACKH76oEHHpAkyWw2l5aWZmVlDRo0iH4Vs5iI5fmyWBVPNErrjx07tnfv3rS0tK9//esGg+HatWt1dXXp6el+vz9M5hXdmrsE3jVU2cd4TF0UDdAmXI2uYYwxWZaTkpKWLl3KGPvggw9ee+21GTNmUKJXfhXa9ZilBX56P/zwQ6fTOWHCBB4bGQgErly5wt8eGFcCfY3o5pbARxb0ERCMBEBMwC2Eoj7kKQoDgQA6baA7qKurY4xZrdaUlJQvv/xyx44d1dXVjDGeRVOVe1MrTsSsm263+/3333/ttdcCgcDUqVNJnxw4cODcuXNh2iAJdMcximE/BDleatdH3gCpLdE1jJw8vV7vhx9+ePHiRcbY1KlT7Xb7Cy+88MEHH/Czqnr2ldb5D3kYIbWHzvbVq1dXr1598eLF4uJiVaYc0SHW4/HoHkt0BwJAjICbGYDogIUQgJiAQoB4z498RLXikGEKXdClVFZWMsaMRuPw4cPz8vK2b9/+6quvzp49e9y4cRSQFggEuHbSpqakaECSIhcuXHjxxRcVRfnmN7/Jpzf0+/2BQIAScooarHdRhMkzpLZJIyLZlumFBEfurMuh88Y9ORlj6enpS5YsGTZs2N///veKiop7772XVJx4FcRd0CXghsE9e/Zs2rRp7ty5NJ29SGZm5ogRI6qrq8+cOeN2u8VQZDjFgYShy2/mBB6KxcMORCAIAYgVRNUnepCqksqIk49F0QcFiU1Hbwma2IDyWKakpCxcuNDlcr333ntffPHFzTffnJ+fT/ktyZalkiJkwmKMBYPB55577uLFi3feeeeECRNISfp8PsqJYrVaRU/R3rppw4jACMWhaJHTWu34VuHlpfbwA4GAxWKhNV6v12w2Dx069Gc/+9mbb775wx/+cOXKlWRr5fJbVRud25qamtWrV8uy/Mgjj9CsFXT+ecmqqqpTp041Nja63W4Wep6MBO7+AhAFEiamB30DCEIAehMxBIgrPak1p7/YxeSbiBZC3QKgz9J590XGmM1mu+222/bt27dt27bCwsJJkyaRXBFjXEkc0r6OHj26efNmi8Xy9a9/ffDgwUwIKWR6E3bFSKdKFIEd2jDMsxaJpVG3gNI6yQcJP0mSrFbrnXfeWVRUtH///oqKipkzZ2ZkZEhCglaCTvJnn3125syZoqKiadOmZWRkhGqJy+WiZKpMiDYM1SQAAIEHBPQFIAgB6AXEnBYqq6C4zCWiaDzUBV8s0BlUt6Ldbp8zZ86pU6c++OCDq1ev3nTTTU6nk0LvRN9Fn8+3devWTz/9tLi4+L777qOINZovQZwNQpz+jnVd9r/oEHcdarmj9bCOT1StFclihaT6bDbb7Nmz+/fv/69//evs2bP33XdfRkYGnxOSFJ3f79+8efOePXtuvPHGmTNn8sq1QwOSJJHjLmlCDCGBxKZ33zMAxB0QhADECqJfqEoEqsILe6d9oM9A1sLBgwcPHjx406ZNTzzxxJw5c2644QapdYY9xtjx48f//Oc/5+Tk/OAHP0hPT2etKTF55pJQ9rd23SnbLRYdKr9QvgvVyjAtD9XgUEa/UM1Q7ZoJD7Uo5EgWFhcX/+QnP9m4ceNvfvObJUuWzJ49mxv3ysvL//nPf2ZmZj722GMOh4NvEmq/PJWOoiiRzLgIAGDCcwqFCRIYfBIA6AV0e8najBHaNSyCKbwBiK7jwlUKz2Mky/KCBQuGDx/+8ccf/+///u8DDzyQmprKGHvjjTcOHjy4bNmy66+/nrZVWmdQaLfz1K6tW4yP7Vp03URVyypZqFsJaysFtXWGdysNUy0TYonFq3DzzTfn5eV99NFH5eXld999N2Ns//79mzZtmjFjxpw5c2hDPksN0zOPBIPBurq6pqYmqjxUUhkAgIj4dCTYkwJ9C0QgCAHoZXjXTRUcKP4byiqIFzroWlRShG7OwsLCZcuWnTx58oMPPvD5fMFgMC0t7cEHHywuLuab8Owm7faZwtvTOmokjKSLpk3E0u4m4XfXrtaNxIM0TBlePzmIksF2zJgxAwYM2LRp04svvtjc3JyRkXHvvff279+ftUYgtxtB6vf7dR0N8BoBIBQd9QYHIE6BIAQgJtBaRbibKHX14CkKegCuDSRJogQnlKzS6XROmjRp+/btP/jBD5xOZ3V1Nfkcer1eg8GgmtNPzOfZ0f1G3eDOl4/QU7RdG2OEDWvX8kA1GAyGQCDg9/uNRqPT6bzpppu+//3vHzp06E9/+pOoBsUkMbpIkpSent7U1EQzT+J9AkCEYMQE9AUwMT0AsYLofibGAqlSC6InB7oJVc5bshDS1AVVVVUvv/zygAEDrly5Qu6j+/fvZ4yZzWZuGBQD4XrpCDpF5M1WQiAW6OjuVIqOew2Q2DMajYFA4K9//euLL7743HPPffHFF9euXfvjH/94+fJlku7izKW6GAwGu92umqoeAAAAYLAQAhA7qESg+FOc9rBBfKEKYyO7n8/n27lz59GjRwcOHHjjjTcajcbc3FxFUT788MMdO3YsWbKkqKiINvT7/axzU19ER+Tqi7tnazeJIjGMbvl2QxAjgeoPBAI8X+uRI0d27Nhhs9lWrlxJUwjedNNNn3766fr164cPHz5r1iwqxnPAan0KrFZrUlKSx+Ohf30+X7uHCUBc0yUvogR+OtCvACIQhAD0AtrEG9owQtWymIBUWw8AIpF/6UOlQiGDVVNT0/bt20+ePDl16tRp06ax1gSkkydPTk9PX7169RtvvHHbbbeNGDFCkiSahp4JaWl6rMMRfkehdJooDkM5bXYowaCu2lSdYfHMiCVJTosN5o64+/bt27RpU1FR0V133WU0GskY63Q6Fy9e/Pnnn2/durWpqen666+32+1kKtRtrcvlamxsdLlc9K9oKkS/ECQAqke7qz6OoXIRA5BgQBAC0AtE2ANr1zu0h7vdIPbp6P2gGmiQhIkljhw58v777xcWFn73u9+lMn6/n1xJLRbLoEGDfvKTn2zfvv2ZZ54ZPnz4Qw89ZDKZ+ESFursQd0SEstepiCQrjEpl6SbbVPXn+K+iaVRc1m4SCVLb+S1Um+vqT25W1WboefXVVw8cOPDVr3511KhRrPVkyrJMynzSpElDhgx57bXXnnvuufvuuy8rK4sSvWrbHAgEKMso/SteI/RxQQLQ7vhOdGAEFvQRIAgBiG+gBoFIR+8HshSJ9ijGWHV19ccff+z3+++7775+/frRSlIpJCS4cJo1a9aMGTPeeOON//zP/5w3b97NN9/MJ0xvN+1KFG1W2k65HqH61QpFsUJtVaK2jM4Dtt3UMqHy7tCFoJO8ZcuWDRs2zJw584knnlAVYMJgkNPpfPjhhw8cOPCvf/2ruLj41ltvpXw/2splWeaRiqGuCLq8IE7RfcA7D76woI8AQQhAHIPeG9Al8k6M1+tljHE16HK5ysrKDh48mJaWNnHiRJpxXnSb5EqJuzUaDIY77rgjOTn58OHD9fX1c+bMyc3NpSQovKS4xwjj90JtoiuiqGEq2yDTm3gwlD+naCoU/3btIyaFmOdQURSK7qMDaWho2L1796FDh+bOnXvTTTfxMqojpXwztHL8+PF2u33Xrl3vv//++PHjCwsLybmUH6Asy2azmS63du9deIwA9CJaB4QurDDBgNYFIhCEAMQE2q+OmGNGtb5HWgT6BKL4qays/OKLL8rLy6dMmTJmzBgqoDvBHd+K7kaLxbJw4cIJEya89NJLx48fX758+YgRI8gYRX6k4TtV0XW5dC1sosDTtRhorWGi3FUZ7lQOpR0lzHGpGh8MBlNSUhhjBoPB6/W+9tprFRUVDz30UG5uLmsNLyS7n1gtP7E0NcjQoUOHDh26bt26d999d8mSJYWFhWLLg8Ggz+fjkYrhbbYAxDvdIeTwpIAEBoIQgF5G9xvToQ8PvlKA09FukMPhYIx5PJ5Dhw6dOHFi+PDhN998M/3k8/lEexQL4W+ptM5VmJeX99Of/vSLL7549tlns7KyHnzwQXI3lSSJ5zLRrScKuOFR5fOp8vbU9czUBhbq1tB5woQ+8sZLkkSm1MzMTMbYpk2bPv7442nTpj300EOSJPn9fp44lLxwdeuUJIlMf2azefHixefPn3/zzTeHDx8+f/58LiMZYy6Xi2cZxbgSSGy66SkGIFGBIAQgVgjVRQvzQcK3Cqjo6C2Rk5PDGPP5fKmpqatWrRL1A81AGAniVhMnThwzZsyhQ4e2b9++dOlSs9k8Y8YMUjvRtVAXlepjmgRL4r8q509dK6JKQHatMhT3q/VENZvNo0eP9nq9iqJcvnz5kUceGThwIP1kNBrFcxshAwYMePDBB0tLS+vq6sQz7/V6dV1GAQAA9HEgCAGIA0K5j6JXB3SJRMnQzfPjH//4nnvuocEI0h48lahogqN/6T4UrVtUlTjbhNFodDgc6enpp06d+vWvf11eXt7Q0MAD4bob0UIoHmaox0crIFUysvtaKLJ58+avfvWrM2fO/O///u+srKz6+vpr1675/X6LxcLHichBlGcH5cZbyuxqMBh4PGFaWposy7m5uRUVFVlZWbx8Wlqa0WhsbGxkeHUA0HES7KnBgDIQgSAEAIC+CGkJr9f7X//1X48//nhTU9PGjRtJh7BWR9BAIBAMBr1eL02STkKRVkqSRAWMRiOPM/T5fMFg0Gw2FxUVjRs37gc/+MGVK1cYY3/961+770BEayELO+0EP3BtJCELHUMYHWH6jtr6X331VcbYzp07jUbja6+9dvz48UAg4PV6LRYL5YZhQuIfSkMqSRL/SyrRbDYHAgG/32+32zMyMoqLi5OSkqh+g8GQlpaWl5dXU1Pjcrn8fn+CdW0B4HTJ86utTVshHiKQSEAQAgBAX4SnhLn++utNJtOQIUPGjx/f1NTU0tJisVjI6BQIBEj+0SY80SUpQB7exlrnmfB4PLIsZ2ZmJiUlHTx4cOrUqe+8887w4cOTk5O7sOWiogtjABTLqw481L+6tsEO5S2MrvBvf/vbq1evDhgwoLq6+qGHHgq/VYRcuHDB4/E8+eST//Zv/xYIBKqqqkwmU1NTEwl+q9Wq22YA4hStM3aXo3q6YWEDiQQEIQAA9F1WrVq1atWq8+fPnzt3btq0aUlJSdys1Bk+++yzffv2/exnP1u7du1TTz116dKl/Px8+qnzeeFFP0+m0YS6CWNC7ShMDCHfUKs/I2we05gfQ21it9t///vfS5L07rvvfvDBBzNnznQ6ne3uKAz79u1jjI0ePfrRRx/97ne/S7tubm7m2X0ok02oZgMQp3ToUY26cgASD7m3GwAAaAfkAwTdAXVubrjhBsaY0+l0u91Hjhxxu930qxhJyGHCDIQiNKUB33Dnzp1bt24dNmzY+PHjaU11dbW4X05XHYtuqzihdiS2IVTeUXEXqsZrUbVHW61ueZ/Pd/LkSfKtnTp16qlTp/74xz9++eWX9CslGg22B59PwuVyrV27dteuXampqWQG5EeRlJRkt9tpWXyrwNYBEo+uuqW7430FQAwCCyEAAPRdDh48yBhLT0+fPXv2tm3bSktLx44dO2zYMEowQ06h4WsIBoOyLFNK0vLy8qeeekqSpEcffZRMgsFgsKKiwmaziZv0sI9iu7tTCT9dn1Kp7cSGusu6vqa0YZg2GAwGq9VaXV2dl5eXm5v7b//2b/v27Xv11VdPnTp15513ihdCVT/P8SNJEhU7derUu+++O2bMmO9+97uqvRiNRovF4vV6jUaj3+9v97ICENeEGQkCAGiBIAQAgL6LmMRy1qxZFy5cOHny5Jdffjljxoz+/fsbDAYqwIWHKIHoL01AX19f/84775w6dWrOnDnz5s2zWCxUbaAVvsdYjliT2uZQ5Qer0oQs9MTuoggMtQtep1gbKTSa0XHy5Mn9+/d/++23f/3rXy9btmzYsGGUQVTXOZY2bGxsXLduXV1d3cKFC4cNG8YY8/v94pQVfr+/rKyMGxJFC6HWiTeWrxEAunTTrdt5F3cA4gIIQgDiGHyfQCcxm82MMT5vwcCBA7Ozs/fs2bNjx46BAwdOmTKFm5JECUFWQdaqRk6ePLlr166ampqFCxdOmzaNylCdsiwbjUYSjSIxdetqO5Gi16hoG2zXThgeUctxd1aaT4JOkSzLdG5zc3OXLVv28ccff/DBB42NjaNHj7ZarSpLo9I6C0VZWdmOHTtkWb711luLi4tDNcZgMHBByBfaPRUAxAU9cOsm2NMRUy9h0OtAEAIAQN+Fd3H41BFJSUnz5s07c+bMW2+9dfXq1QULFlAoGpc93HpGaz799NO33357ypQpP/jBD3hVSttELDE+yh7G1VMKOxeFalnRzIIoLmvlHFd0ijDBoCzLZCfMycm5++67v/jii7///e8TJ0689957DQaDJElkbqVlxthnn322bt2666677tZbb6UaaI4Q1UElJSWVlJTU1dVdunSJZgfRPYoE6/KCPkV3vFuktmmlAEhUIAgBiGPQewO6dLT7wvUD6QRZlgcNGvSjH/1o+/btv/71rxcsWHDdddeRIcvj8ZhMJjJnXb169bnnnrPZbL/4xS/S0tL45tzqxdr6XnYfuoIzahWqsuOFUoahNtRGJHKP03Z3SvWbTCYS1QaDYeLEiRMnTvznP//5q1/9auHChRMnTuTm1pqamtdffz0YDH7/+9+nCehJ1VMBVR7RlpaWxsbGpqYmSv+jtdmqjh2AuKZrVZw2RxQACQYEIQAAAMYEl0je+5k1a1Z+fv5nn3322muvXXfddf379ydrodvt3rFjx6lTp2bPnj1+/HhSg1q/StbqAxlqj90xoqFbZ4f8OZngKRrmL9PrJqoMifTX6/WePXu2ubmZJpGvqqqqrKy0WCwGg2Hx4sVML+aQNiS3W8bY3XffvX379k8//fTatWu33HILY+zo0aMfffTRwIED58yZQ3NUqPxXVZ1Xs9lss9k8Hk+75wEAwNG19icG0LdABIIQAADA/0OVWGXgwIEOh2PDhg27du265ZZbnE6noigHDhw4cuTI1KlTKWJQURRKXKmbu1LVi4rZTlUoi6LKX1Q8ObwMT/jJowEDgYDP5/N4PJcvXz558mRZWVlLSwtFVHq9Xpr+4Zlnnhk7dmxRUZHNZlNleeEGW5/PZzQaZVmeM2fOwIEDP/roo40bNwYCgcrKylmzZk2YMIE20XUTFfH7/aKnqHilYvaKABBThHcQACCugSAEAADQBm5lIp2Tk5Pz1a9+9cyZM6+//vqhQ4cyMzOnTJnCJzYQp53QrcpsNsfXULRu2hiVJhQ9PHk0ID/Ma9eubdu2bd++fdeuXTMYDGPGjJk9e3ZeXp7P55NluV+/flTsxIkTLS0tTDPXKK+cBw0Gg0GTydS/f/+777773nvv3b9//z//+U9Sg6TGKX+P9kB4k/x+f1VVVXNzM/1LyYQAAJEDNQgSGAhCAADou4Saj06VWIUxlpGRUVZW9tFHH40ePXru3LlUTKVkdKPsVMlUOKqMnSyC/lYYYRndtuG30rUNqnxiSQqSVfDKlStr164tLS212WyjR4++4447Bg8e7HQ6eQIYvpXX6zWbzZQ4lDHm8/m0zaOfgsEgJYBljG3cuPH06dO///3vrVbrjh07Xnvttfnz52dkZJhMJtHRN9Th0BT2tCxGGMaXXAegJ8HTAfoIEIQAAABCQorxwIED165du+eee77+9a97vV6a52D48OEZGRlMyCUj2s1oc9JL4V1JQ6my6DLBdIhQKjFUKlHt5vRreXn5559/Xlpaarfbb7311n79+hUVFWVmZupWqwiTTJClLtQuePbRq1evbtmypaKiYtasWQMGDGCMTZ8+/cMPP3z99dfnzJkzcuRIXV9WsVpZlp1OpyRJtbW1MHQAAAAQgSAEAADQBnFGBMbY9u3bP/744+uuu27o0KG0xmAwvPPOO8ePH1++fHlKSgpljqGtVElNpFbE+rXpW3SXu/ko20E3mQTXXWS4Y4wFAoHdu3dv2LChsrJy3rx5d955pzgdvDgDh8reKK5RhS9ycx9dgosXL/7rX/+yWq3f+MY3kpOTqdr8/PyvfvWrmzZtWrt2bUtLy+TJk1UJgbS5fDweT6jpBwEAAPRlIAgBiGPgzQK6EFGWkBQ5ffr022+/PXDgwB//+McWi4UxRlPkDRw48Ac/+MHevXt//etfT548efny5VSemwp5PSoHS9W+QknBUDk8ex6VXysXvaQGt2/f/sc//nHQoEFLly6dOXMmbRIIBHhIIRfV2rjEUFDoJp8W4vXXX9+9e/eyZctmzZolNoBCNxcsWDBq1Kh//vOfn3322f3335+SkqIrBRljwWCwqqoKghAAAIAWCEIA4hiVwQH0cTp/P/AN3W73pk2b6urqbrnlltGjR/P6ZVmmhJayLE+ZMmXgwIEffPDBU089NW/evBEjRujKQkqSqd2F9l/tcu/aCVW+r6TE6FgqKirWr19fW1v72GOPjR071uFwMGEWR5V6ZO1dEW6PJZlHavDIkSMbN27Mzc392c9+lp6ezkuqKs/Pz//Od76zf//+V199dcyYMTRjJNM7dU6ns6Wlxe12s7YxhL1ujAWgO+iSz2ICPx3oNgARCEIA4hi80IFIFPeDGHgmJsncuXOnx+O54YYb+vfvz4SMo7wMSZfMzMw77rhjw4YNW7dubWxsHDlyZFJSEvcgJWuVymVU1zYoOpqqnE7FrTqJ1vAYplrV3sW2HT9+/IMPPmCMLVmyZMiQIVRGO/GG7i50r5EkSU1NTbQsy7LP5zt69OimTZv69eu3ePFichNVFCUQCHC1KcsyrTEajQ6HY9asWUaj8ejRoy6Xa9q0acnJyaq4TZvNlpub29DQcPnyZZrNIvLzBgAAILGBIAQgjkngwUvQGSJXhhTwxh0UXS7X8ePHd+zYMXPmTD7HHYk6XoZDt5/D4Vi+fPmFCxdWr169d+9eclyUZZkLJJIuUR+LKr4ufAEVkjCVvKqkbrW6hbkTJkmsLVu2rFmzZtq0affddx8TtCIPHeSVqHxlw7jO8jyiVMmaNWs+//zzr371qyNHjmRCKldSg7wSfm7JwDh9+vQJEyasXr36X//614oVK9LS0sQduVwut9vt8XioNjHQUbdhAAAA+g4QhADEMbGTgQPEAlFYCBsbG/nygQMHzp49m5aW9sgjj9C8gqJ9L9Q9RqbCoqKiH/3oRzt37nziiScmTpy4ZMkSkhwul0t3kj0WNp0M36lugTAHrk1Lo5tyU4QnYhG3EmtWhDkGX3zxxcuXL3/rW9/iUo07kWor0bZZ9S/3FJVlOT8/nzH22WefvfvuuyNGjHj88cdTU1MZY16vl+9dpdzEE0sTV1gslgceeODzzz9/8cUXp02bRmGHHI/H4/V6aVl3Ynp4HIAEoGu/hhguAX0ECEIAEgH05EB0jBkzhjHmcrkuXLjg9XonTJhQXFzM2sa/hUdMuzJz5szs7OzS0tIPPvhg/Pjxubm5NpstPz8/VC6TUD0t3bwy2vaoNJhWUqrq1zqLqtxZtYfGbYM+n+/tt9/2+/133313SUkJa6uWWQgHUe0B6krEkpISh8NBnqK33377lClTeIEIZ5AX7beTJk3Kzc29ePFiVVWVOPWFKAg7amsFoG+idSXAYwISEghCAADouxw7dowxdunSpbq6ujFjxtjtdlofXinpQjJs8ODBJSUl77333ubNmxcsWJCVlRUMBp1Op1hMrD9UKlGV/FN1xXTtfqE0YfgD0Q0pFPUkGdPeeOONq1evfutb37LZbEyjBsV26toYdXdNkZaMsSNHjuTk5CxatOjRRx8lNeh2u4PBoN/vN5vNvIUUnMnbRsuKohiNRioTCAQMBoPZbC4oKDAYDOXl5XPnzuXNMJvNXq/X5XKFORsAgFBACoIEBoIQgFhHd1JvAr5eQKRD9wMV/tvf/nbXXXcVFRUNGzbMarX6/X6fz2cwGCiVKJcipD2YoJR46Jqozbxer8lkslgst9566759+/7whz/U1tYyxlauXMn0RJRuTB3XZrp2Qu3RhU9Lo2tpZBEM9otq8IUXXvB6vQ8++KDNZlMlmGnXL1R3DYcU+G9/+1vG2KuvvvrYY48999xzx48fd7lcNpvN5/PxCEyj0Uj1kI8uQSqR/2WM2Ww2g8GQmZlZUlLi8/lKS0tZqxq0WCw+n89oNPr9/lCNRJcXxDVdfhtHMqgEQAIAQQhAHIOvFBCJ4n5wu90jRozgsxrwPJliihQeZUf+k36/3+/32+12r9fr9XoVRXG5XIFAIDk5mTwSjUajwWCYOHFiS0vLmjVr0tPTk5KSeJ3cCTOSGMII4Zurem9hXEZZW/2sLUlyNxgMvvnmm1arddmyZdzOyYMGO/kASpLU0tLCGHv88cc/+uijWbNmVVVV3XfffQ6Hg0IHVaeCxxzyZVEzixNXBIPBCxcu+P3+JUuWvPvuu4qieDyec+fO8V2L8YdaSywAcU3X3sZ4KEBfAIIQAAD6Ijzxydtvv52bm3vy5Mmmpiav10uKwu12B1ohz0aldRJCn8/n8/ny8vIKCwszMzPr6uoyMjKMRmNFRUVqampNTc2lS5cKCgqmTJlis9kCgcArr7wyderUhQsXNjU18UkpdJskju5rQ3dUy6II5P+Kf0PZA8PbG7n9k/TVpk2bjhw58r3vfY80M29VqPDFDkE2VcbY2LFjf/GLX8iyvGbNmhMnTkyYMCHC0EHtUVCzL168WFNTM2LEiHfeeYf/ZLVaaRJCAAAAQASCEAAA+iLcLLZu3brU1NRz584ZDAay/pHpj+aN8Pl8gUCANJLH4zEYDBkZGX6//9VXX+VVZWRkWCyWy5cv2+122pwxlp6e7vV6aXq9RYsWUcmLFy/279+fNCeL2HtTpN08MSo9qQ0OVEnNMBVu3rx579699913H6lB0bYp1sCi1YTkyckY279///Tp0/Pz80ePHr127dqtW7cuX768oKCACVlGVUpY1exgMMh9Srdu3bpr166bb76Zwh2JtLS0MWPGVFdXnz17tqWlRZyYHoDEA36eAHQICEIA4oB2Z3JD5A9gUbk2TZ06dd26dbRMlkAKMAsGgzxukEfNmUymYDBosVj4viggrampqb6+njHm9XrT0tK8Xm99fb3Vaq2pqaGaDQaD3W5vbGz81a9+9Ze//EXl68jayjbR7sf3rl3PD1ll8eNoH4pQ22oh292+fftGjBgxePBgFtVkGGJLdNvJD02W5fr6+vz8/CFDhvzoRz/avHnzk08+uXTp0hkzZlBSGX4J+KtA9B1VFIWmCamqqnrrrbecTuf3v/99q9UqtqGurq68vLyuro6cVAFIbKAGAegQEIQAxAqhkse0m/cCAEJlFgsPSZSbbrqJtSoWugO1E9Cr8Pv9RqPxl7/85U9/+lPaUUFBwbVr1xobG/1+f3Z2dlpa2pEjRyorK6l8bm5uVlbW4cOHGWOimOQSS9dGF+ZAtPqKL2vPgEqzqVw9xVPBV9J5+OMf/zhw4MDly5czIR2O9omLRBPqSlnGmMlk4vMQ0hqfz2cymW688cacnJwtW7YcO3bslltuycvLk1rTinLjKvfjJcNgMBjcunXrkSNHxo4dO2XKFIvFQhlH+b4MBgMPEAUARE6H3qsAxCkQhAD0MrodSig90DOQVyHpkAg3cbvdSUlJw4YNow1Hjx5dUlLy7rvv0q9Op3PlypVvvfVWaWlpdXU1Y2zo0KHFxcWNjY3nz5+fOnUqr0eMfwuTYEZbUru5qs5Qnqi661WVk2Tas2dPY2MjebqKyVE7ZJDURbdPGQwGyXeUpJ0sy6NHj7bZbB988MHmzZtnz549YMAASZIMBoPKXkqSr7a2du/evefPn7/uuuvGjRvHBNujuAtFyEkTSiQDkDB0iX7THUJKDKBvgQgEIQAxgfbVHMpNVBzjxwsddJLm5mbGmMFg0CoEVY4WrtMoWejWrVsZY8nJyY899tizzz7L88RcvHjx4sWLHo9nzpw5W7ZsqaurO3XqVENDQ1lZGWNMldQkVPyeNkwuTEnd41LpvTDpakTbIO332LFjr7766s9+9jO73R7KjMk0sXxRPIwUnMmEh532Rfq8pKTk0Ucf3bFjx5NPPjl16lSaukOSJJoRhFt0Dx48+MYbb4wfP/7hhx/mDeOGRE4wGGxpaeH+oqL+x2sEgFDg6QB9BAhCAOKYBBuwBF1FZzoxujlLtJWPHDmSMRYIBGjGdsaY3W4nT8WPPvqopKREluXGxkaqkGan0DZM206t/tTVb7rmQe2BqJa19kMVJKL27t2bkpKSmZmpu1OlbXZTbSMjR9eBkyyBPIHNddddN3bs2NWrVz/11FOLFy8uKirijqBut3v9+vVVVVUPPfTQgAEDmDCZhO7ReTweyvfDEtruAQDR5RbCBANaF4ggnAAAAPoupElULprh+0BUOD8/nzFWUlJy9OjRsrKyjIyMVatWjR492mAwlJeX79y5c9++fVRPcXHx0KFDc3JyGGNiphOeK4UJ1jn+r67QUskYcVvtsliMW/kUITeMeETkUckYO3jwYF1d3YoVK8KcB5VRUXU44dE9mXxaefFfMvQxxpKTk++9997CwsL33nvvwIEDtOG1a9def/11r9e7aNEiUoP80LjxUNydLMspKSkpKSkIIwQAAKACFkIAYhd03UB3024KGULRRLp6vd709PT09PSLFy/Ksmw2m0+cOHHq1Cm3252Zmelyufx+PwmSlpaWhoYGbpviqOyQ2swr2p2qNlctqMqHsd1praCKotCpeOedd4qLi0ePHh0IBFQ6TWsn1O6uQ/BNRP9wXrMo6mw225IlS44ePbpz507y7z1y5EhRUdH111/Pt2IaYa/C5XK5XC4SmZ1sOQB9hPDPFAAJAwQhAL0A/7SoPjahFCDiBkE3Id5aYcxxfA2//YLBYE1NzZEjR+rq6oqLi2VZ3rlzJ2NMkqRhw4Z95zvf2bRpE81V+OWXXzqdTpqXoq6ujukpPVUwnqLJK6NtCWvrzCmaFsWV4ZUPL8yzs3g8HsrLonVe1T0bopDTllHtWlWVKDi1F4KX9Pl8kiQZjcYRI0YUFxc/8sgjpaWlzzzzDGXo4SGF4d8MwWDwypUruqcCPV2QkMBlFIDIgSAEoBcIFb+kcvHiy6G6pBCHoJNoxxpUwky1nv96+vRpxlhjY+OUKVP8fr/H4/nVr3518eLFN9988/Tp0y+//HJLS4vFYvF4PBMmTBg6dOiWLVuuXr1KM7yLewylA7sW7YGwtsMxtPz666/feOONY8eOZa35XVStDb8cvu+o/VWcVFD1K3dwVVrnGGSMnThx4ssvv/zWt75lNBrLy8t37949efJkyvEj+qPqBlhKktS/f//Gxsba2lrGmM/nU+0rTMsBiC9wSwPQUSAIAeg1VN1flfucaHkQe+1hTDoAEJHLKpITRLsWQnE95QvNzc3Nzc11OBy//e1vCwoKGGOPPfbYzTfffOHCBZfLJcuy3W4fM2bMwIEDyZvU4XCwtuYy3WXVUYTp3oUSP7pHoV0WS9bU1OzcufO+++4TS0ZiAIz6MeSPtmghVB0Irfd4PHv27Dlx4sTQoUPJMJienv7xxx9fuXJl7ty5aWlpkibdjor09PSioqKqqqrm5mae40fcEYtsTkUAYhncwwBEBwQhAL1GeKMfdycLE0mILx/oJOGD9ESrILfg0Sb9+/d3Op1DhgxZt27dP/7xj4KCgqamJpPJNHjw4EWLFu3atYuMUS0tLV9++eXZs2ePHTvW1NQUyveykw1WuZiGiR7UrYHWnD17trCwkCSrtlj4OttFd8NQAz008yGXi263+/XXX3e73XfeeWdGRgaVKS4u/sY3vrF+/fpXXnnl9ttv79+/vyRJPD5QK6Grq6tPnz7d2NhIwZyRaGYA4hHcwwBEAQQhADEB9fxCaT9ViBEAXYVoIdRqKhXiSovFkpWV5ff7GWP0V5Zli8XCGNuzZ8++ffumTp06YcKEnTt3pqWl5efnnzx5MhAIcLnFNAqT75ppTIKRKJZQZXStjlojZE1NzcmTJydNmiRWoj0hXTsEw49dluVAIEArA4GA3++3WCz00759+7Zs2TJt2rQ5c+ZQAVH1LVq0qKys7MMPP3Q6ncuXL6e3BK9KhdVq9fl8TU1NLPQ8hOhMg7gmjP82vqEAhAGCEIBeQOvcpU1QwcOKVLFb+KqB7iZM8hW+cOnSpTNnzuTm5v7yl7/Mzc1tbm4msffEE0989tlnZrN51KhRx44dY60KJxgMulwuyt0i6qtQeV+6XHqFWkkNqK6urqqqWrx4sW6xbpJJ4nz0PBSQ6+orV67s3bvX6/WuWLGiuLiYCe8NqXVSClmW+/fvv2zZss8+++ytt96aMGHCwIEDDQaD0jplhYjf79fVilr9DECcEt2jiq8qABCEAPQO2o6vLMvUQSR7oBg6SD/1TkNBQhPJtBO6IoEmo9+5c+eGDRvWrl07fPjwH/3oRzt27Fi9ejVj7NZbb62pqfniiy8YYyaTKRgMGo1Gk8mkqkqVGrSTbpntHoUoqFhbG2B5eXkwGBQn9BPTtHQf9FwbDAaSarxJV65c+fDDD30+3x133EGZeMRzxdqq2dTU1JtvvvmTTz7Ztm1bc3PzqFGj6FdSjOIZ0G0DLIQgYYhiRAP3PAAMghCAXkH70aLeJ++9iRZCVUSQrjLEJw2wqDpD2hnMVYjWbLF+slkxxvr37z9z5kzG2He+8x2Hw1FYWFhYWOj3+/fs2ePxeOx2u9VqNZvNVqvVZDKp9KfKNqj15OwqtOpOpa+uXr2amZnJ2jpkdvdjxZ9lMqKyVg/eXbt27dy586abbqIJMKjxqhQ7vIX81TF37tz6+vq1a9eePXv2tttuE52B+REZDAZZlrXGQ7FY9xwrAHEJngjQR4AgBCAmIKsgJZNgrRllxMSDorWQbwUdCEQ6L6i0d5SkSV9JC4MHD2aM9evXz263m0ym4uJig8EwZsyYvLy848ePnzx5kkRgS0vLiRMnnE5nWVmZ1+tV2cFUtkFxL4FAoLm5WWVUjCSFIM/IwhhraWlJTU01Go3hbY9er7e6unr48OFMyPwZYc7VjqLSwLSvlJSUoqIixtjFixe3bdtmNBq/8pWvZGVlMWGaQb6JyoecVgYCAYPBkJKS8sADD+zZs+ef//znddddV1JSIra/qqqqpaWFNiT9yX9CrxckGF11V4dP3gtAwgBBCEBMQN1Qs9nMu8gGg4GLQ55xVAW+Un0c3ckDOgRXaGFq0PXzdDqdjLGUlBQKIKysrExPT6+vr3c6ncnJyR6Px2KxWK1Wt9udnZ2dkZFx/vz5qqoqj8cj1qkyPNLN39TUVFRUNHTo0OLi4oqKCpPJxB8Ko9Ho9/vD2+640czj8WRnZ1+7ds1ms61du9Zut4tGeEmSSDpKknT06FGHw0GCUJSOPfB8cWF29erVtLS0PXv25OXlzZ49WwwpDOXSKZ437m0uSdK0adOSk5OvXbuWkpJCqpJITk5WFKWlpYV1m9wFIDbpZLLuhHxA0H8AIhCEAPQ0up8W3u2jsB+pFdbaS1ZZCLs12grEKVFYCPPz8xljpLLa3ZBuRZ/PZ7FYyO3w9OnTZrM5PT3dZDLZbLZLly6ZTKbs7Ozc3Fyz2exyuVwu1/Tp00eMGFFbW3vy5EkK0iMVpN0X1fzFF1/U1NTMnDlz9uzZp0+ftlqtok2Mj5LotpA0Hj1ELS0tJSUl77zzzssvv3zkyJHJkyf7fD4xuyZlXjEajZWVlZmZmeQyqlVf3ddtMhqNSUlJjDGHw/H0008XFxdPmDBh2rRp9CsZ/VSbhFfsPGhw5MiR9fX1Fy9efO+99+in9PT04cOHV1VVHT9+3Ofz4dUB+hq6OdtUPwHQZ4EgBKBH0fqx0KdIlmWVE5fRaOQ/iT5jyC4DupBBgwYxxrTRfWGgHJiHDx+m5bKysvnz59966621tbWjR4/+9NNPX3vttaSkpGHDhrlcrqtXr54+fTo5OfnKlStut5sEIdUQquY5c+bMmjXrd7/7XVccH1uyZMn69evHjx8fZr9ZWVlkN+P0zIBLdnY2WfCcTufevXvHjBkzYsSIqqoqn89HUYU8KSslDuXutWQCNRqNPp+PJ6OiN4bP57NarYwxk8k0fPjw5557jvbl8Xjq6+tra2t9Ph9rDZUUDxaARELX+123ZPhPKp4O0EeAIASgh9Adj1QN7YvZRPkydQd1P1r4VoGooZvwZz/72fvvvx+5GmStU9g98cQTjDGv15ucnFxfX//yyy9v3rw5GAwWFxfX1NScOHFi3759drs9JSUlPz/farUWFBQkJyf/6le/+tGPfmSz2XRrpqfg/vvv3759e1ccImOMeTye6urqpUuXvvfee5WVlSSiKDDP6/XKslxfX//2228vWbKEHLZZCDXYtc8at2G++uqrI0aMePDBBwcPHmy320+cOHH58uW6ujqz2Ww2m8mhl4aEfD5fXV1dXV1dRkYGOdaazWYShIwxmuPRYDB4vV7K5ZORkZGZmXny5EnGmNFobG5u9ng8pAaZXicYRhKQ2IS6w1XrQwVoAJDYQBAC0HOE+cwoikL9bDH5IffiEy2EHeq7AxAKutM2bNhAwas8ui8SeBSfz+erqKh45ZVX3G43/XT16lWKf2toaGhoaGCMvfLKK5IkNTc3y7K8f//+X/ziFxHuoqNHFIb3338/fIUrVqxgjAWDQf58qbK/dGFjKAeM0Wj89NNP33jjDVpZWVm5a9eu8Bvm5ubm5eUdO3bMbDb369evqamJpxL1+/11dXUWiyUtLU1RlKamJr/fn5aWlpSUZDKZSAfW19dzw6BoIdTGJUIcgnhH9cxS2IXocC7e5GJ+7zDhtRCKIIGBIASgRxFtg+K3h0s+6o9SRhkuCMXhfAhC0LVQ/pWObiIuczVId7Xo/MwYq6+vj7xmMXS2q/IEhpJ29GQ5HI7a2tqMjAzGmNfrNZvN2pJdC50xi8Vy7NgxxlhSUpLL5VIdr9Y+GQwGKysrBw8eTJGZWVlZ1dXVJpOJHEQNBkNTUxOZDQOBQENDg8FgaGlpaWlpmTBhgizLpaWlLS0tZBol/1LtOel8lloAYhYxhlD1VeWIY69hakgM8JgDEQhCAHoB/iKW2k4wyDNeGAwGs9lM2k+SJIvFwvupYlYMAGKKzneYoqghup3y2RfoYezXrx9jLJQva5eTkpLCGMvLyzt8+LDH4yHXUN3sqaIXq8VioRZyG6PRaOTvCpPJRDlySPWR4dftdtfU1BgMhsbGRpPJxHNpaC2EsA2CxEDSzJTDwgYKqmZy0o7FqIZxu7i5AMQGEIQA9CiqXhdfMBgMPp/P7/f7/X6j0UhD+2RpcblctbW13AijMr8wTCMGEosuz/4XSYUvvvji3XffTd6YvFNICzxzKZdSYugvf6JFrzOeCpgEmJg3mNJHGQyG0aNHb9q0ibXO/BHJwaampubk5DDGnE5nVlaW3++XZdlut1PAYVVVlSRJaWlpHo+HhGJWVlZTUxOfasJms0mS5Pf7STFq6xfTGkd6cgGIPbQ3sDg1CxNC9FXlVetZN8cSAxA7QBACEBPQeH9OTg4N8KelpRUWFlJKeqfTOWLEiNTUVCpZXFwsbogByz5IuxcdvZbIoZP5z3/+c9SoUbt27SLTWSAQUBSF/pIUFAUhd+8U7WziTICiIORrJEmi7FA+n6+kpKRDnrS0a0oYwxhzu91ut5scXD0ej8FgcLvdPp8vGAx6vV7yKTUajcFgkMSn2WwmIRrKJZWvxJ0DEhIxVQw9qqpZKMTCKsdyntq3x1oLQM8DQQhAjxLKO8vv91ssFkrKT56iU6dOpbgmSZImTpzIY3769+8vbosOXN+k3UAX3BgRQga6V199NT8/n88B2DMUFBSUl5dHUpKuaXV19ZkzZxhjHo/n0qVLNTU1sixbrVar1WoymVwuF2OsvLzc5/ORSjQajR6PJxgMklZUTa3Bwa0CEgndcQ1uridpp0roLZbUOpfiAQF9AQhCAGICu92enJz8pz/9acaMGdOmTdu/f/+rr746Y8aMu+6669ChQ++//77ZbF61alVubu5zzz33v//7v6optkEfQev9qBpc4H0XrWtxKMhypc2m0H3doC6pWRzg9/v9orGO78VoNKqm8RR/JaxWa1VVFZ+8oWeSNjU3NzscjpqaGsZYSkqKx+PRBi8R1H6y77lcroqKClpPmwSDQbfbLR47radjqa2tpZ+8Xq+hFavVWltbe+7cOcpHiqElkGCEcofmpnt6psQ7X/T3Vm3e5R7ssQMeeSACQQhAj6LtvlOfjHrkP/7xj8XCTz/99N13383/feyxx2iBBCEtJ9gnqq8RpvMRqkyYrzhPSxuqKl20eUHjEVmWVZpQURT+mIShqamJMeZ0OpleSonugFK/MMbuvPPOf/zjH7W1tZFvyy2K1GzyayXbICEeMg88ZowFAgGyhVLh7Oxs1pFbC4B4QddFggQhtxDSB1f8lRa4s7f2JwASGwhCAHqOUL58YjxSdnY27+pRtJIkTKBks9mqq6sZY3yeAHyuEonwV5OPXmttgyoRGAwG6+vrqdMffnfUN/roo4+GDh0aDAYpI6Xf76fbj4fPiVorTDiNqiOlSmUp1kP/sta8LHw6BFXDxPAeWYAKmEwmm8125cqVm266SSsIGWNLlix54YUXzp07RymaKJ+nx+Px+/3kRVlZWSnL8syZMx0OB2ud7oV1kdutthIeZEh2yGefffbWW289fPiw3W63Wq3cpMlhQpYLOmSaVUJRFKvV6nK5KAUOXS/GGOlMfvm8Xq8YA2k2m5uamtxu90033VRQUKBtW+cPGYBeR/ceNhqN3FNAtBbyf2k5TBgtImxBYgNBCEAPEaqjyfvB1J2tq6vzer2hKuE/ZWdnB4NBnkSeoSeX6Ggz0zI9MyCJK4PBMHjwYFqjlUliYUVRpkyZMnfuXFpDOiG+GDlyZKif3nnnHcZYVlZWJPXQA0XLqqe1o31Bpe2MgqLW5ZowEAjY7faVK1euXLky8pq7EMo3g5wZIMHQ/SaKqk/lRq6KJ9TNMqrrdg5AIgFBCEBPEyqNdXJycrvbUudeajupPdMYiEBcwK+aakGL+JNuD57LDNYaCDd16tS9e/eysIJQtKo1NDSQkarn+z1h7tswJ4S1OoWScU/rIcardblcZGxUbc7NBaL/WEcNZbqaXFzQLUBDOTxhaSRPbhTXJVQDeFwiXwNNCBIJ7cNCAbS0TH4H/F9usWdtX6ShqgIgIYEgBKBHCfN1of5ZmO47/Wqz2SgKKExPFMQpkaQ04MEwobalW2jFihV79+5NSUkJM70Bld+9ezdjzGazkVdVlx1Mj8B7ckajkYfPkdqhqDk+b7tqQy4pw2hgrQgPU0aLysVXrIoJ01SEryQMWjukuNyuutPuVKWKAYgv+G2vHdYRTX8kDsWnWxSHqtdgAj8Lcfe2B90KBCEAvUCoqPdItuVeo6pKEOEQp6gMSroFVJ0S7aWnBbI4+Xw+q9V66tQpxpjRaLRarVozFKkgq9XK5aJqjLyrjq5bEZvqcDi8Xi+fLdBkMvEJ33nKHK79xAVVheKC1oTLS0Z4inS31f2pa0P4VBdRVzqK+2WCjIyXqw8SmOhkmO7dSytpClDVGvpX5SCget/icQB9BAhCAGIFSgjR0c9P+IgyELNEYY1RSQuyBJL7kyhvyPeYlB6lIAoFpSb67ne/yyLQpTFCqKDZqqoqWqDuHfX2mpubnU6nxWJR1UB5WSQhXRPr4OMTeWGtNgtfSSSSLLxtMMy+QnV8pbZRjhEdGACxhDh8ox1eMZlMopuAyWTStRDKsgwLIeibQBACECvwqefDEyoEsbeI8HvZ6+2MHbQWofAnR3vFtXkOaNrxlpaW+vr6K1euWK3W2267zefzlZWV+Xy+AQMGVFRU7Nq1a+DAgb/97W9vu+02yrRJ+WwLCwvD7zGWoTOwZs2aX/ziF83NzWfOnCHDIFkFt23bNmrUqIaGBrPZnJqaam1FNIeqTqbKNqjaUYQGNFUloc6nSpKpNu8kuo3XNoBptCIeVdCLRH3zq2zdql9VLqNaD1Ja1r6Q8TiAPgIEIQCxQnSCsNfB97KjiFaaUD6KYZZpK3G0u7a29sKFC0ePHr18+XJdXZ3Vah05cuTtt99+7733hmqD1WpljGVkZIh7D9PUzhBhSFskhDJk3XHHHXfccQdj7MiRI2LS0d27d+/evdvn81VVVbnd7tTU1JSUlEmTJg0dOpRXyBijSS9Uikgl1bTOn+Fdy8K4gOr6AOuaNbTobqhdltpmHgplitT9N9beMAB0iFAWQjGHcKikMhRD2Ef8bvDtBiIQhADECqps16AvEEkAIROkoOjiWFFRsXnz5s8//9ztdpeUlIwZM+b666/Py8vj2waDQb/fHwgEfD6fxWJxuVy7d+8eMmTIoEGDPB4Pd1HWtqFrOwqRWEE7WhtHaZ1wz+PxpKSkHDx4MCcnJzMz0+fzmUym6dOnT58+nUoGg8Hy8vLDhw+vW7fu7NmzJpNp/PjxCxcuzMrK4t1BntJJZTDUNkAbk6lbhmnkJdOTXhGqQW1tocprjSShWghjCOgBelJW6e5LpQDFF6lqqgnxlcjwUIA+AwQhAL2GqgsYp4IwzJcen9JICKUK+LLKp/HEiROHDh0qKyvzeDxZWVmPPPJITk6O1Wq1WCxatWA2mxljNpuNMeZyuRobGylFrdFopO6RVjnEV1oROi0Wi4VsnlVVVaLFTCwmy3JhYWFhYeHcuXNbWlrKysquXLny+uuvBwKBvLy8CRMmDBo0iJ5BCjIUNaHKnzNCiau9dqFsv7x8R4+dtydC27LuyYlQiwIQNb1+d6n8Qo1Gozj3oOhwIeaYAaDvAEEIQK+h+urwDnqHKuldh5YwPeMwoVN9Ga0tSLePzksSsiz7fL76+vrDhw/v3bu3pqamf//+kydPHj16dGpqKt9EN75UFayomoBB19ExLi6c7l3ncrlI8ZIFQNcj12632+32zMzMMWPGHDp06MCBA6WlpRcvXhw7duzQoUPT0tKSkpIMBoNoLdTuLsIuYyjtJxLF2dbeReFlvK7shBkE9B1U6aOktvNw4v4HAIIQgF5At5sYnYWwF79kqhA4Xfmh+rUvI2otlQiU9GaZJ2dIPlz9+uuvb9q0KScnZ+nSpVOmTCHTH2OMEmaqkiLonnAyfIWf6DLeL1MgEND28/j5FC9BMBg0Go3jx48fP348Y+yLL75Ys2bNX/7ylwEDBnz7298eMGCAOC+oKMB4PbpaWrue6em3MMsREnmdYaQjbIMgluEjYp2sxGg0OhwOcpRgjJlMJofDQT4FjDG73e5wOBhjwWBQluWUlJRONhuAeASCEIBeIFSQQ7sb6vbyWVuF2TOEsg1q/R4jMZL0BXSPXTTX8FNEeTK5j9OuXbvefPPNoUOHPvHEE9nZ2VSe5CL5CoqD3xxdX1Caq121smsOr/cQD5MfoO4TwW9aMrrSOWSMGQyGiRMnTpw4kTH26aef/uEPfxg2bNi9997rdDplWeaaUKwkVGwhR1ugO051JNkvwkvHvvxIgp5HURS/3+/1en0+n2pwSnUrBoNBu93OVVwnGTJkCK/KYDCMGjXKbrfTvwUFBWPGjGGtn+AJEyZ01U4BiCMgCAHoBXQ7YRFaCEO5BUYY19TlqEKYdA0RqkCmHm5hjKOyLAWDwWAwaDKZGGMXL17cvHlzeXn53Llz586dSxMM8k3EpHmi8KbLQSPr2j5WTx1WD6E6QJXcVZXhpkL+sPCgQV7s+uuvz8jI2L9//zPPPDN+/PgFCxaQdOS+u5FosPCt1Y3u61A9YSrXot1FZw4BgKiRJMnv95tMJnq/RcKLL744YsQIst3x51f16tN+OmlYTZIkn8+XkpJy7dq1v/zlL2lpaUuWLHE4HEeOHFm3bl1BQcE999xjMpn+/Oc/r1+//uc//3n//v2fe+65kydPXr58mVeVwA8IBoOACAQhALFCdC6jqiipHvt6hbEwaA0RSl9NZij6GYY/alEeUG/p0KFD69evb25uvu+++4YPH85arYLa+0QRJhhgmrPNCQaDWgthgl0LcqDl/0oh5l3gK1XnjTqXo0ePHj169FtvvbV+/fqmpqZFixaRg66oscM/aKEs+bpKTPcS6NYf3ggZapMEu8QgrvF6veKk8D3MCy+8IP7717/+lS//8Ic/5MsnT54cMmSIONYJQMIDQQhArBDdh6d3HTJVgkdlgdGl571bewXRO1FXqvFTJ67ho92bN29+880377jjjgULFtCvfr9f1TsJ4woYKshNG5CTABdC12WUUIkufviiUBQ1Ib9esizfeeedN9544zPPPLNx48b/+Z//ycjIIPdRlUUi/EMXyenVVYZhqu3QJUuA6wsSBu4PzxizWCxms9nr9eqW5I+n9pUVBdpHTDtGSf4CSUlJ1dXVO3bsIEHI2n7jOtmMWANaF4hAEAIQK3Rm2gnxzd5N3612Q+CY3iGEGmTtU5+iUAerEoeMMVmW3W73k08+KcvyD3/4w0GDBjHGKFZQlR2U6fVUwisKRVFUBrQwbYtTtBZC1tahOszTIV4OssSmpqb+n//zf/bu3fv0009PmTLllltu4ZpQrLDd4Q9ebSTF2qULH/YEu/og9uF3rMfj8Xq9saayyKmep+xiiLYFfQYIQgB6ga416Kn0QPd9t7RdbdY2Lqtdx8g+i9I20lJcKd4MNTU177zzjizLq1atKigoCLWhrrBRrdQ1HmoFYax1yKJAZSHUdcvUPXW6p5FfFO6+O3PmTL/f/9FHH/l8vsWLF/OQQtZqWOhCC0YPkwBXH8QRse+BSU9EmLl8EokYvxagh4EgBKAX6NoXcfjIou7bUaiVuh6Mffzbo/UU5f9yF8TKysqXX345Kyvrscceo1/9fr8sy6pEJtrTG7mrodKaVzOS8jGO7n1O5rvwG4onTeXZy88GXRFyQDWbzXPmzCkpKVm9evXGjRtvvvlmqTX9D4tYE8bveQagrxHqfQtAAhO9ixoAoGuJOqmMKtBC6jb4HlV71zZJd1nV4CgONvZRHZoYCcPaTsJB+Hw+uu6HDh365S9/mZeX95WvfIUxRhMGGo1G1V0hCaZCVVUq1a17hkNdr3gk1PkP34ELX5UiWBQVRZFl2WQykfDLz89/+OGHDx8+/MMf/vD8+fO61wIAEAniswMAiAUgCAGIb1RqrWf2KO5aXBnKVKVa7uEG9yTaQwt1vLSGglVOnDjx3nvvrVixYtWqVax1fmRxtgO+Cf+X96jE+sPrJd2fFCEcLk4RD4cm7Wj3AonbSsLhq64Oa52agjJhJCUlPfzww2PHjv3oo48uX74stR0i0dYQqpEA9HHEID0AQCwAl1EA4hulbZrE3moDX5b0fERFw0sPty0WUCk6Jkg7SZKOHTv2j3/847bbbrvuuusYYz6fz2AwSBGkilGdTJU+YXpXQdG4jDLBjNkFh9obqI4xQvWl6GV8DVVMkiRKl+90Ou+55541a9a89NJLP/zhDy0WS6irwOL5lALQHfDBEW2KrJglgZ9iDFQBEQhCAGKF6D48sfBOD9OxFi0tPd+wXkSrTLRSgdxB165dO2DAAFKDlFCUT8EsFtaV/bpntUOnWlfAxy8qC2GYgwp/l2p1u8lk4n6kt956a11d3SuvvHLPPffYbDYeTMhCPMW6D0gCdzQBIEI9gEZjTHc+I3yHAJBIxPQzCQBoF60HYLfuTvV11BqXwgR3dWvDYhOtbZAjSZLf73/qqaeGDx9+++23M8YCgYAsy3zsXKWulRAz5jG9LouudZG17eioSrL4vEbaA2y3A6f7yEh6kzoqbdPA0nIgELDZbPfcc8+zzz773nvvLVu2jHxKZVnW9Q5Vuen22SES0McRR51i3EIovidDvUsBSDAgCAGIe0K5F3YHqq4tvpEc1SVQnShRbFCIIGPs2WefZYzddtttTEhZqU1zor2+KkNTKCGnVe/awqH8UWOfSKya4SVueMt2KO1Nl89qtT7yyCO///3v33jjjVWrVhkMBtKiuteLRXCxAEhgVB+LGBeEItF5pAMQd0AQAhD39GQXU9dCCEJpY5U4DAQC5BHKGNu8efPFixd/9atfmc1mmiwhVJpZRchNysLKmKiJx45OKJtedO5eWiOe6pxzY7jBYCB7oM1mW7Ro0erVq8eOHTt8+HCas54uolZmK8J8kgD0cUgQ6rrB9y709qivr9f9Fc8vSGAgCAFIHGLt49p3CGN2EwkEAiaTiTG2efPmnTt3PvbYY5SVhEsFRTNVPWs1K2nr1JoT221D+Ayc8UUoERuFCNQadcP464ozQ44bN85oNP71r3997LHHcnJyRAuhroYP1QAAEhjdd1eEG4ZyfhFHbUJVG36/ovWe+3vbbLbKyspQghCABAaCEIDEAeOXvUWodC8qt0OePvTDDz+cOHFiTk6Obm1iLhNeg1b/hJcTum6QTHOTiPW3c5CxR7s2Ul3HXd1iuieHabqkojj3+Xwmk2nUqFETJ078+9///vDDD6ekpPBgQq7z4z1KE4BOohV1EU66G+bZ6aZHqampiTE2a9Ys1geSP6HDAEQgCAGIexL+uxX7qLwWdQPJgsEgOUr9+c9/Hj9+/NKlS1lrEhSVMZBprH9d4ltFNSSSkVBLmKMLE9UZyjaou6yN8Fy1atX3vve9jRs3rly50mAwiDeAyk00Bn3kAOgZQo25hCqsKMqKFStef/11WtPc3MwY8/v9iqIEAoFgMBgIBHhcNHndk0++3++nWF/xLUoFaHO/3x8IBAKBAF/w+Xw+n0+SpDNnzjgcjgkTJqgajMcWJDwQhADEPfEYAJaoiNdCFexHavDMmTN79+596qmnLBYLT4mpEpCqNbxfojKIRXHRQ/lQJeotFOagdJ3HItmcKz2j0civyL333rtx48aDBw+OGzeOMeb3+8k3mIW2wSbkCQegS6CnjKtBxpjD4ejJBmjfxj25dwB6HghCAOIbfKhiEK1lj7oU5eXla9as+eY3v5mSksI0dkWmGY1W+Sh2U1PjOtlJ+JMT4anTyniVIOf/qtbwMpMmTTp16tTf//73cePGac2A2jZoVWL8XgIAOkq7dzsVqKyszMrKcrvdZrNZd8N2/bH56zfUVtqVciudGXoDIO6AIAQgVujkVwcfrdhB6yXIM4vW1NRMnz6dhfVBCuOv2MmGaXca77dN+PZH7p8WYTFdJ95AIGAwGG655ZaKior333//tttuM5vNum6o3XFNAYg7dB2wtZw+fTorK8toNIaKOeyZx0c7apMYHqR4+QARCEIAYoXE+MYAjmhWkiTp1KlTDQ0Ny5YtY21DBzskEjpzk1C1EaZzSCTCnzRdm4NqpcpaqOrOUtLR1NTUlStX/vjHPx43blx+fn544yQCkwBoF/K71npSdJRQT2K7/gWhaoCUAokHBCEAsUJ0PfUwHy0QC/BcMqtXrx4yZMjkyZNZ67yFkQsV7XKEHSNtXyqUu1QC3zyqkxCJAgxfm9ZOSFe5X79+ubm5paWl+fn5fGoKFkJGJvAJB6BL8Hg8TDP7SxfW365/QbeO0PU6eAUBEQhCAOIbvNN7jMiTgmhVuqIo586du/XWW1nr9PTaoDXWtusTvjHtXnfdGhLePNjuAYZKq6P6N5TZVuySiuGXJP8kSVq+fPkHH3yQl5c3evRoUomRXKl2RwcAiF+i/kj5fD7Vml55TPBsgr4ABCEAAEREGL+jUOV59ODRo0fz8vLy8/NZq3kw1ObtZhmJZJg88qH0+LUNRmhn08p43esVXVyf1gY4ceLE1157bd++faNHjw61d9364/QqABAJ0VnFA4FAJ2sAAEQIBCEAAERJqD6Kyojk9Xo3bNiwYMGC7OxspmdrCrV5FL+GgfLmqWxoUkcmB4spok4YE/60a69pJOsJMgmWlJTU1tYyxmhOwq46EADilzB2+DB4vd5QNfQ8iWcn7PVTCmKKBHcfAgCAbkL0GOQRYnxZXNPc3Lx///6pU6fKsizOnC4W48td8pHWrYTMlVqDpNjUBKCTx8JtfdrrqN2R7k9jxoxhjJ0/f16sk28ixhMC0DeJ8P7Xuoz2IlLC0dtnFMQWEIQAANBhRPmnXcnapvQ8evRov379dKfS4h/mLv9Ca1UHqUFtlF0i9QwkjQk0ukq03SZa5qJdtV7c9dSpU4uKijZs2MAiSKwPQB8kwodCHD4DAHQrEIQAxDfobvY8KkmgMhWytg5RZWVlpaWlixYtosJa9RWJGSoKdKvSWgjjl+44kFBnMvwFEhfIa3TYsGGlpaWqAvyuwPA86ONEeP+LLqMAgG4FMYQAxApR9xETposfXyiahJO0LK5kjB0+fPjatWv3338/05gQRfUoVttNDSYdojWgcc0TZsNualIYIjkP2hOoUrzRnUytWU/3YqkutDgKkJ+fb7PZTp06NXjwYN4k3YapbokoWgtAzKK9vcXHpF20SWVE8LwA0IVAEAIQK0Tdee3yloDwiL153r/R7eIzxqqrq9PT0202m24BriV0xWGXN1s7C0LM3j/RNUyWZVHxRn102g1DOX/qGortdvuQIUOOHTtWUFBAl163wujaBkC8oL3J6fHk4jD8V8/v94epCgDQhcBlFIBYgaYv7ygwD/YkqgHv8B0auqDV1dUOh4MJ2k8VN6g1LbJOeIpq3R05lGU0lM9qJ89MjNCZYwl/9liIrBJMcx0ZYxaLZdKkSYcPH25sbGRtRxAS6WwDEB0kC9t9EFQpuLq3TQD0bSAIAYgVIvngwc7Qu+iebX7hRJ8oorm5WZKkoqIiXiCUctMa7roEbZ26SWXi5S6KRPRGnVQm/NmLpGF8mTE2bNiwioqK6upq1vYOiaJyABIG0ngRZouBhRCAHgMuowDEE1rRiHHTHkZq6yIorlSEBCQkSz7//POMjIyRI0cyPbnYw0iSpHUZjSOUEEGbIlJvZ/XkDXA4HIFAoKqqSrdYqPYDkJAognd9h7bqthYBANoAQQhAfINuZe+i6uWQHuAXZd++fVOmTKH56EV6QA/oWh1DZZRpV2ixHu+cSW0daMVlsbWqkp2xEHYG1UmjRubm5l67do21zlAvilU8tqBPobrhI3xIRQshAKBbgSAEIL7BGGoPo7UKhurcBwKBysrKwsJCxlgwGOySZCdRtFNcYzAYVKGqKimoOiilbcxk97a4LSqxpxW3uluFyjKqK9i0e1Sp0E4e8pQpU8rKyi5dupSfn69qBiyEoC8Q6gUS4WdLG0OIpwaAbgIxhAAkCAhM6hlEv1BxjXbZ6/UGg8HU1FSm1wEK3yWKXOeLoXSqrVT/6kav8W1FBSgJWU97K+ZNt6mqZSojrjcYDCrhHXXjO3/Io0eP9ng8p06don9VQY/ai9VuhCQA8UUnXyCiIMQHDoBuBRZCAOKbCC0noGvhFp4ww94mk8lsNtOyrrbpEgdCcdt26zEajdobhoSH1ngVm1as8E2KsMGh4g+jbFMI7Ha73+9vaGgIta9ITnVsXgUAooNeehEmlWm3HtAZ8GIBIhCEAMQK0cU+4bvY86hi2FiIXCZGo9FkMoWvod1ddAat9lMZ0LQ6UKUPY+ru0nVnVRkJVTGEPexmphJvzc3NjDGadCRUSV2zZ6jlnrwcUo/MjQkSG62TQoc2b3faCdycAHQVEIQAxDe6X0RYFXoGlTJU/et2u8WYvd7qXvOevbYBKiOnriaMhRspciEUCAQ6ZDLtWlRnzGazmc3mdhNjRGLzVLmPhnGmDbU5/7fdwrxOfieEbz8AoQhj9+6qqgAAXQIEIQDxh9H4/57cLpEZnfQY1N2812m3VbpHGr6kbgFtVBgVOH36dFZWlsViYZqkMj2D2DCDwWA0Gq1WKxktReEkLoiasIdb2y68bfSveEWCwaAkSbIsm0ymQCDAGKM1vdJI3tT09HSLxXLq1KkFCxbQSlXOG9VWTGOXE5e1dmkR3fszlE9y+MJimRh5lgEAAHQrEIQAxAqRC4Z2bSAd7cah28dp93xqC4Ty67NYLJMmTaIwQlHD9xiqpiYlJY0dO5YyXvLgRkJRlEAgQLMUxngMoa6zJTfDTp8+vaCggK/vFXus+O+oUaMOHDjANCa+SLbVonWXVXmc6g7rMD0xGUdRoyDx6HwMIQCga4EgBCD+UKmLML5kUaMNbdKia0kL82/PoHV7U/3bhb1elQFHdbxXrlzZsmWLw+EoLi5uaGgQrVsdQhsUx4T5FehX1a6Tk5ONRmNDQ4Pf7yfDlCzLx44de+edd/Ly8h588MGamhq/319TUyPL8tixY7XheTGoENpVO4yxiooK+pc/I83NzSR0uc1QXGYaW6JYrEMRUGJhWZa9Xq/T6dywYQNNRRjJoWkfH91APq0XaKhGqs6Y9mrqVhs7VxwAAEDPAEEIQPyhEoRd24HTuoq1W7/Wi687GtZRtIegOrRQzY688vDHm5SUVF5e/s4774wcObKxsVEV3hYhXPXxnjotkw7kFfICwWAwKSlp8ODBK1asOHTokG6d3/3ud8V/Z8+evXXrVlmWdbV07PiOimGNqlYtXrx4/fr1tPyNb3yDFpYtW/b444+73W6Px8P9SLlLJ3c05X9ZWwOa3+8XHzQq1qFoxuzs7NWrV8+YMYNFNQkbEYlXc6hfO+T/HINXHCQY4vuqo9vituxyMPQDRCAIAUhw8B3teahvPWHChBdffJEx5vP5oo4h1DUAstaANP4vV0qBQEBRFJPJNGTIkEOHDqWnp9fX12ttSiT/TCaTx+PZtm0b08jjmL1txHbyRq5fvz4lJYWMgcFgMBgMBgKBNWvWKIrym9/85vLlyx6Ph7VGG+pqQv4rVUhlfD6f+G+HUBSlpqbmZz/72bRp07SHoGtL13XsZKFHLsIYMCPp6mkDF7XbwmAIOg/uIgBiHwhCAOIPipJyuVzc6NQZYxfoQkSxIUkSOStSQpfOVBjqsqqUA+20sbExLS3t4Ycffuutt+gmCVU5ySRtndy7NUZuJ22eFaaRQ1artb6+nlJ6yrJss9lcLtdXv/rVoUOHDho0SOV+ScJP5TuqqtBgMPh8vs6cAVmWjUYj1+26Zj1dqc/L6zqR8n+lCGII20WrKsVtY+QGAHGN9i6KIoYQtyIA3QoEIQDxx6VLlxhjTqeztxsCup0oukFpaWmMsb179zLBxtUuuvGWHd11LyLO7qAoCh34woULWScy+nRhKiDtydR15mRtdW94J9VQYYSh9q76q7IK8lGMiI4HgO4HuWcA6DEgCAGIFSL38mpoaHjttdccDselS5e8Xq/L5fL5fIFAwOv1ejwet9vt8/m8Xi/99fv9fr8/GAxSfhEeTMVCfG5VOTaoj0imSN6D5BuKC7SVGIulDbsK9YFv152S6lEFzoWHh9WJ3pW0wP81GAwq30ttS1Rt5gdF6B4UL9P5qSa0LRcXtPj9/pycnOzs7P/+7/9mjIUxD6oIE6EXI3DTpSiWeLN1b62qqqrMzEyfz8fTkPYwoTS2aiGMm267obCsrVFXVZJOUSAQ4L6ykiSJdksAep4In0cMTwDQY0AQAhBnUCfv7rvv7u2GgFgnOmkXyieT9Xj/LJS7LNc54kpR+vJNuE9sb6lc3VjByDfRXdY9Lbol6Zzoyj8aITIajSqDZIeaCkCH4MMWEZr+Qj0LoEuA3gYiEIQAxBlK6ywC3FymG2Gl2qSHW9iTu9Olb37qxBAyMgp1ppJeR9USrXQJ01+kf2nSRSb0ROOIUB6hkR8If0s899xzBoPBYDB8+eWXFovl8ccfdzqd4a00cXe6QBxht9sjKdbRPEkAgKiBIAQg/qA8ir3dCpCYxIKe1xI+uU4ojh07Nnz4cJPJ1D2N6l463wMmNZienl5bWyuu/93vfqcoCvlL8ywyqhjC2LwNQFzDhy9101mFJ1QiXABAlwBBCAAAINZRWcLDw/uOjz766He+851jx45lZGSYzeba2lqqh1LOUFQtzVGhtE5BoSiK1+u1WCzZ2dmlpaU7d+7s37//zTff7HK5rly5YrfbKZ5WOyLDlZXf7zeZTH6/X5bl2tpaq9WakZHR0NAgSRLFtYZpuSzLLpcrKSkpOTnZ6/U+/fTTc+fOvfPOOw8dOuTz+SjJTSAQ4JOR8IBSSmZrMBhaWlqSkpJsNpvJZDpy5EhVVVVtbW1ycrLRaCTJZzabKysrt2zZcsMNN4TKIgM1CLqVK1eusE7cZrg/uwToaiACQQgAAOD/ESOBZKFCB0OV13UZXbVqVUVFxX/+539u2rRp/vz5Z8+eNZlMPLUSt4lRwhWeD8nr9ebk5OTk5MyYMaO0tLS0tPSFF17IzMw8evSo0+l0u93aDC58W8rA5HA4AoHA/v37X3/99YEDBz7yyCN+v7+mpkabtpQkIpeXsiw3NjYOHDjQaDQuWLCgurr6rbfeevPNN6dNm+Z2u71eL01lwVrVIB2CLMvBYJAknyzLeXl5Z86c+fnPf75mzZonn3xyzZo1jY2Nqv0mJyeLJ03RTGihe1YBiA7V45ycnNzQ0BBdPbgnAegOIAgBiEt0Y6IUzcwBPduouCfMGYu7wdQuufqxdtRhMqnorr///vt9Pt+bb76ZkZHBGBs4cGCHdnfLLbfs3r07JyfHbrdbLJbx48d3aPP8/PzKysrhw4fn5uay1ulDI2fo0KF79+6dOXMmY6yoqKhD2xYWFubk5Dz88MOPPvroP//5T5qDZOjQoc3NzZcvXw4Gg+np6dqttDbYWLsBQGJAgrBD6k6boRcA0IVAEAIQf5Dvme76rtpF+O90An+SE0wThmozn5ZAnI2gRxsXFZFbCIlgMOhwOH7xi18cPXo0Nzc3Pz+fbIPamRt4DRRcxxh76623RowYcfr06bKysrVr186fP7+goIBOV7spaoLBoMFgCAQCGRkZFMFIHqRhtqK9BwIBk8lUUVGxZcuWe+655/HHHz958uTatWsXLFhgt9vJu5Wapx36IUujyWSqq6vbtWvXzTffPGDAAMZYWVkZFRs7duyJEyeqqqrcbrfb7eabqxRgHN0PIE6JIgYetyUA3QoEIQCxQuRjpdznrbdIYNsjed+Ja1SzDsYX7drQODy8LV4OMxLzQnV1db9+/UaPHu12u48dO5aXl0eZVEiwaQUzV4OHDh1qbGwcOXJkcnJyenp6U1PT4cOHbTZbRkYGxRCGbwCN1wSDQfLzZK1hfu0eDqnHrVu3lpeXr1q1auvWrU6ns1+/fq+++uoDDzxgNptp76qEq7wltPmbb76Zm5u7aNGi3bt3NzU1UbwWY+ytt97i97aYaCfM5BYAdCH8EdD6TuuivQlxW3YhUNdABIIQgPgjLS3thRdeyMvLO3z4MIU8Ub/T5/O5XC6/3+9yuZKTkysqKioqKlpaWni2DL/fbzAY+BRkPIBKuwvaxO/3s9ZeMqWyoPQbFCVVVFTU3Nx87do1ym4vRmEpimI0Gr1er7Z++je8hZNn+OjQQLKqTnFKd91Z3fkCZeMoKCh48cUXuW2HtZ3vbs6cOWPGjDlw4EBSUhKdBDo6fkLo0Hh53nGJLh+seCw8IaTqLykBnlCEVvr9/vT09P79+//pT39ijI0YMSI1NbWxsZGMS4FAwOv1KoridrtNJtOlS5doF9zuJBI73QXdXmAkXcOmpia32+3z+WbOnHn06NG33npr+fLl4mXlmlCs7dChQxs3bnzooYdkWT5+/LgkSQsXLnz33XffeOONb37zm6KkZHpnSbz0Xq83jE1StQld9C+++KK6unrFihWSJJ06dWrKlCmDBw9+7bXXdu/ePWfOHEpXQ1efV0hph6mTffz4ca/XO2fOHMZYc3Mzv8QOh8NsNtfV1dHuOprmMXZuBhBf6D6nzc3NkWyLuw6AHgOCEID44/Tp0xQCNH369PAlGxsbHQ4HiQHqB5PQUn1oRdESKp8El5TJyclXr17lvnCJxD333DN37lyTyaQywK5ateq1117rrVZFxz333DN58uSPPvooLy+vvr6eJARX442Njbm5uYcPH3700UfLy8sbGhrS0tJowxjshIXXUdpljtVqZYzV1tZmZGRMmDDh8OHDNBEFjYawtnc7qWu/379r166xY8empqa63e4vv/xy9OjRjLHrr7/+6aefLi0tHTVqFJ1Jrsr4rlVhTjzvqG7Lxfke+CYtLS3vvPPOihUrKGjw6tWrpBIfeuih119/PSUlZdy4cTxfqNh4UoO1tbVvv/32vffe63Q6GWNNTU0DBgwwGo1+vz8tLc1isTQ1NfEMq+2eXvHEwjIDOkN0bxXxrovB9xIAiQQEIQDxx7Vr19LT0xsaGmh6X9F1LRgM+nw+h8Px/PPPP/zwwykpKbNmzWppaWlqauLFSBXoikBeCS3wNPes1Wbo8/lSU1NPnTpVUVExadKkrVu32u32xsZGi8Wia/TrKIowJRqZOjtZYbupd6hMU1NT//79aXfcVsYbc/r0acbY1atXU1NTuXUxZnG73UlJSaSF7rvvvqqqKm4eJGNmIBCor68fNGjQF198wRj7+te/ztUgCz0feozQIWViMpn4OIgsy0uXLn3jjTeSkpL69++vElRK6xQOL730EmNswYIFjLH6+nqr1UoKKiUlZcWKFX/6059++9vfOhwOrV1RtUwFjEZjeO840VDZ0tLyj3/8Y8KECcOHD2eMeTyeYDDY0tLCGMvNzXU6nRs2bBg3bhzT6EmqxOv1bt++vaSkpLCwkDEWCATcbrfFYhkwYMDp06fLy8stFgsdC2vNMqo9CgC6FvEW5WORSUlJNTU17W6rcpTovkb2TWLzDQ96CwhCAOIJ+rg2NTUxxqxWq25fk/TM1q1bf/CDHzzxxBPd1JL6+vrU1NTz58+PGDHCZrNFGBPSLtRxp2Wz2UyKtwcgRUTCz2QykR+mJElms7mlpeXQoUOMMafTSSorxrHZbIwxs9n84Ycf3nTTTeELf/rpp06n0+PxWCwW1U8x3gOLJIaQ1C/Z/cxmc0pKitPpPHbsWP/+/bmTM/WK6KkpLy9vbGxcvHgxbe73+y0WC+82DR48eMiQIZs3b7711ltNJhO/V0WHT9bWDVUbeqoIOWl4Mdr2yJEjpaWlDz74IDXGbDaToKUNV65c+eabb7711lt33nmnKuCTym/ZsuX06dM/+MEP+PlxOByMsYsXL9IanpaGcs906EwCEB1R+3urEO3tuF0B6HIgCAGIP8hoEMYVjTFWVlb2zW9+kzFG/b92c1qEQZXPkKKVUlJSGGMXL14cMWKEbhtUFhim50EXyqHO5/MdPHgwLS3NarX6/f6oW66aB1zsstNP1CSj0eh2uwcMGPDUU08xxijOiiDPuiFDhjDBcsg0JhrV3zCHFgUdqooXbmxszMrKYiHiAznZ2dkul6t3cxRFR+SdQvHmX7Zs2TvvvLNz586ZM2eKQaqSJLnd7r/97W+LFi2iy830HrFvfetbv/71r2022/z587U3OVdWfH0Ye7LSOmkh6cOysrIdO3asWrVKzHZjMBhoc6/Xa7fbr7/++j//+c/XX399ZmamqOIkSaqqqjp//vz8+fNZ6xWXZTk5OfncuXO8WCAQ8Pv99G9SUlIUZxKALiHMGykUcF0GoFuBIAQgVog8+4gq/EkXq9X6k5/8ZOvWrZQxpQvaxxgTZrw4ePAgYyw7O5sJSk+0foRpfLsWiePHjz/zzDO33HKL2+32eDwqXdfRBvNlMc0MN8tQGb/fn5eX9+///u+///3vKZkHY2zgwIG1tbVTpkx5/vnnWasDrfYYQ3mlaiPEIkF3K60mVGls7V6am5vr6uq4h6F2L3T4p0+fbtfsGSOeRdFZFegwpdbkK0ajcdSoUZs2bZo2bRo9Fzwdy4EDB2w2G50xyrpEilFMlWQymaZPn15aWjplypTU1FT6SVSGqntbayEUxwuU1okiGGNr1qxJSUm57rrrWOusFWJttKOioqKlS5e+/vrrd999d1pamjjQ8/LLL0+fPn3UqFHivux2+8GDB2lbg8FgMpnMZjOlk1FFZ6GfDXoG7t7c2w0BALQBghCA+EPMW6iF1i9evPjRRx/t7q48TXTWrhtPeF2k/amurm7s2LErVqzo6va2z8MPP0wLjY2NFGfFCaVLQ1nwdBVCu/CqxAVtDapi2jLauB1dKMgtfFRkXKgF3Uby+CXRt3PYsGG1tbVvvvkmmePoaTp48ODu3bu/9rWvsdZwWdZ24ICsebIsL1iwoK6u7rnnnvuP//gPfkvoXqMwtkG+QGpw165dJpPp+uuvZ4zRXngxng6XbrMZM2Z88MEHu3fvvvXWW/lAz9GjR5OSkshWzxvPWi89HWBOTk5JSQljrLm5+fDhw19++eW8efPCnDoAuo/q6upO1hAjo1QAJAwQhADECpFbCLXDq1pN8p3vfOdrX/vatWvXxIQiok1MuztVDbyAOPUZQXMb9OvXj7u3ReEtGaaM2WxOTU3V3XX3oShKIBDweDxJSUllZWVlZWUzZsxoaGiwWCxcMoUx2bVrF42iPZHUoBWQBLkKq1qr1d6KonA3Qt16YlAtiFchfPPkVri4olMxderUnTt3UsZRmohl//79w4YNo+S9ornPZDLxXdAclbIsz5kz58SJExcvXiwsLKRHKdRIh9ZlVBsH5fF4Vq9e/e1vf3vgwIFMkJG0L/EAac23vvWtd99998svvxw7dixjrKysbMOGDV/5ylcoDlZsicvlmjx5clZWVmVlJc1GaLfbLRZLSkpKZmam9nwC0DNYLJbOTHzS7oMPIgEPPhCBIAQg/ghvL6KPpSRJdrudLHjd3Rjezw5ThnUkFo5yqDLGSHB2VVPbxWAwUEaWc+fOHT9+fMaMGZRPUtUXieQowlyjDm3YrsYOpeW4r2NHlaqqwhjsNHToltD2HemOXbp06bZt2/Lz851O57p169LS0m6++WamsbCphlFoITc3d+XKlS+++OKjjz6alZXFi2l3FOrmEe2W69atmzp16tChQ5neyecjEdwI2a9fv+Li4q1bt5IgPH78eF5eHgk8ih7klQQCAbvdThZCRVEaGxtpYkav15uRkRHd+QQgavjjwN/wkYO7FIBuBYIQgPhDtBDqmqoUDV3bALGrKprOVD3gUGJDVUAVVcUYo0gnnsWxZzSJ1BpmxhhLSkqiDI2s9QCVtqGPYpO0mq0zDQ7jfRp5edaaYLPdwmQ61h4OEYOdsPA3mLawoii6MbQlJSXl5eWfffbZDTfcUF9fv3jxYjIAqkQ10zOomkymoUOH5uTk7N69e/Hixbr+oqw1mU0oxU7Lmzdv3rt37+9+9zvt4YhThnK1SQ/FpEmTbDZbWVnZ8ePHHQ4H+ZpqXwUWi6W8vJzy+0uSlJaW5vF4qCOOIC7Qi2hzGgMAehcIQgDij3ZzQnKHt+5uCbdGsraRUWIztJu0W63H49E6FInBWqKHatQtVwk8sUKPx8N7zFo3S9a2893JlnQTossoR2vCIsSSWtffGJGFUTSGxLyYSlSUVZS08xvf+Mbp06fNZjMXYOIFVaXnpXEQKvC1r33t+eef/+STT+bOnasaCxDvK9WMLPyRkSSppqbm7NmzS5YsUW3CLeqU2IYJT7SiKIFAICMjY/bs2bfccktqauqzzz5Lc2CIxkzC7XbPmDGD79ftdpMLazAYJOdY1R4B6CZUb0gxyW10NQAAuhYIQgDiD5oLgQglunrSqhZ+ud1NtErSZDLx1BosAodJrTbTdbxU7UVsgGoXwWBQdZJ1ZWGEh9wr+P1+Pgs5R2tbI89S3QOJNZ2ge+HCb6K6cNryXq+3rKzMbDYzPZHPrXNihdxibLPZpk+fvnPnzvHjx1PIK89NygubTCbxRuKVUyUvv/zyyJEjKbMo09xC1AbRQK2q58iRI8XFxTQBjK4jAM1Pk5qaSjOpUAIhp9MZCATEeQi1uwagm6C79NixY73dEABAG8JllgMA9CSRJ5XRdjFV9GT3TpRzYq9U67Maif8qtdxisaSmplIaDF6b6CuobUP4fr92DXesDVUmkqn5VJtHfpjdga71T1tG9xqpLIS9dQjh4TeA9tqFgqbj4y6jKjteWVnZwIEDN2/evHPnTq/XS9F34o0kSZLBYFCNJoj32JQpU6ZMmfLCCy/Qr6pHmDbns5Xwv9SejRs3OhwOPs+E7vHyvfOd8hkpzp8//9xzzz388MMnTpygOrVPh91uZ63eoU6nMzs7W5KkpKSklJSUjqb0AKALoaGKdh/h8NmPAQBdCB42AOIJ6vOFEYSiLOnJJrHW/rrYaw+1RtVacSUtOJ3OrKysL7/8kgldc93jUtUpduhVe9eKHG3L+U/aADxVgVAmNdVOewB+RKo9hoohVJ1tfgm0ZWIN7YHongfdQxbL0JpgMPjJJ59MmjRp3rx558+fp3k1RaM0a/UXlTR2bFpJa6ZOnRoMBktLS5kmMorOrSonDf2trq7evHnzypUrHQ6HEsIALgmCkLec1OC+ffs++eSTW2+99a677iorK9uzZw9jjNKlijVkZ2evW7eOOt8pKSnBYNDtdtPuXC6X7ukCoAegJ0X3tgcA9AoQhADECpFbCMMYr3j/NY6+tSqRpihKUlLS0KFDjx49ygeSRTUohRCHWntdGEuX1qCn2lx1khU9WFudqVum+2DtOdNGYuSk2LN2i8UpFC+n+9OaNWsGDRqUn5/PGFu4cOGZM2dOnz5NP/FzQgJMlZNGEjxpFUUxGo1f//rXP/7447KyMtbWMEvGSe7zSfl7GGNNTU1bt25dtGgROZqytklEOVSV1JrrSGoNbgwGg+fOnaM5KiRJ6t+//4EDB3g9Yg0+n2/QoEGDBw9mjJWVlV2+fNlisZjNZq3LKAA9A92iQ4YM6e2GAADaAEEIQPwhWgh7WIR0lPAHojW/sFa5O2DAgHPnzpG3WyhLl3ZNV9mgeN+9a+vvWljYjKDaQ2B6ZlJFUVSasN2r1rtIbc19kRTmiWGUVn1VXl5eX18/bdo0xlggEEhJSSksLNy5cyfT2H51ndZUJz8zM7OgoGDHjh1MSAdKGI1GrieVVmvhJ598Ul1dPWfOHNY60ya/KOLVkdrKUb75mjVrnE4nbc4YGzZs2JgxYz799FOmEcDNzc0jR44cP348/RsIBPx+PwnCyIefAOhC6KnJyclhEXiEwmUUgB4DDxsAoBsJIxRDKUZamZGRoShKdXU1rRS74OKGWnnTJdpVCWFea1eEKL1kKmQa65AkSdpOvygmWasa1G4Y/hhjhEjaSYJKpSFramr2799/xx13iKa/qVOnFhQUkKziU/lJehZC1d7pJC9ZskSW5ffee48JmpD0JG2utMq5K1eu1NTUzJ07l7Wd85DpOfSazWZVn7i2traqqoo0Hp9qcvr06cePH79w4QJrq0jpV7qTnU5nRkZGS0tLMBg0m82URweAXoGmQmkXCEIAegxkGQUgVoi8I95uUpnYRxIMg6EESXp6enl5+aBBg8QeuaSZDJCLIrEzHQVK2ySTWpdR1UKYeqJuQ3ToakK/369tiXaNVjeKZWJQHIY6vdr1JMZohgm6uHQjnTlzxuFw0LwL3EBnNBqnTZv297//ffLkyXwKSl4J/1d13/J/jUbjlClTNm/e3NLSYrfb+XmjaR74MmPsnXfemTVrVklJCdOcXkUzFYo4ZYUkSV6vd/369YsWLSIDi2j2vPHGG8+fP5+RkZGUlMRroAOprKxkjAWDwYyMjLq6uitXriQlJYnTTvT8HQv6Jvz2vnjxIuvg60X3YwEA6Cow+gJA/BHjXfZIUEKY9ZgwKjxmzJjz5883NTVxoweV0doJxa551EY2lZqKd586XQuhFq2FUCTq89l98KNr987nSk8sfOrUKY/HM2/ePDp2HuPHGHM4HLNnz/7kk088Hg+JQFmWjUajykyhtL1b+EJxcfGsWbPWrFmjtN6isixzEx9Ju8OHD6elpQ0fPpwJs94rrVlqVJ6okiSZTCZqCYX8lZaWWiyWgoICpsm7W1JSYjAYPv/8cyZYOG02W0NDA1kOZ82adcMNNzDG/H6/tvEA9AxSa9owFsHtp7UQ9uarJ+HopksM4hQIQgDij3jXKirE3rAiGEmuv/76mpoamrFKO3O6yvWxk1841eZSjE3BF4ZQ0ijybDHaklIMQy2M5HIbDAYeL8c3PH78OCVZEVdKrZd71KhRHo+H0tuytllhwkObDxs2zOv1HjlyhFaSWyZ3zrx8+fKuXbuWLl1KGo8fjhQiCy5rO5nEyZMnz58/v3z5cqax6dG/kyZNYoxdvXqVr7dYLM3NzWQhLCsrq6+vJ9OoeBrbPTQAupxhw4ZFUgwuowD0GHAZBSD+0E531lst6TxhuqSZmZmSJO3Zs2fy5MmqY+S6UbW+q06Frkbqkpq7CW3zlLazC6qKKaGNzHF0pEpbO7OqJM0BGAgEuM/n4cOHR4wYwf0tpbZjEIqiyLI8d+7cL774oqKiIicnx2QyiRPN8wbo3rRUz5133rl169asrKycnBxJksSkMhcuXBgzZozVatVtrep+Vlp9XJOSkmjNmTNniouLKW2M7uW2Wq0TJkzYtm3bwoULpVYTpd1uT09Pb2lpKS0tdTqdeXl5p0+f9vl82lMatTiM8RsGdBVKW5fmyBHvEFomg3mH7hzcZgB0Kxh9ASD+SCQLodb4QwsUwpeTk1NfX89CCB5VP6MLewxaNdVlbjrdQ6hzG/4wpcjcSuMUg8FAIYI06Vlzc3NTU1NRUZGqGDfT0UJ6enpBQcHJkycZYxaLJSUlRZtURtUtFs9zSkpKXl4ez++SnJxM3p7Hjx8PBAKTJ09mIfylmabfTILQZrMxxvbv35+ZmcnzhYqFxa2cTuegQYP4/BlGo/HKlSs022FRUdHo0aODwWBlZWVdXZ32dEVlr+3Khw7EOOKTEvUdQi8cchmNcI8AgB4AghCAWCHyrrnKf7J7mtNzKBr/N6k13f+kSZNSUlJ27Nghdiz4sm7HustllbjTmEX3rGrvKNWRhrI1xQuhrhQtBAIBj8ejKIrFYrl8+XJZWdngwYPJNKG0hqSSKVhVVUlJSXJy8okTJ2pqapKSknTzzUoasyFfHjlypM1mKy0tbW5uzs3NDQQCbrf72rVrxcXF4t6ZJg5QVVsgEEhPT6+trW1pabl27drQoUNDXSZx/dChQysrK8lx1OfzFRUVjRo1KhAIFBYWFhcXh0qVBEBPQpN2tgtcRgHoMfCwARB/iB193puM376d1OqwxzvH/FgGDx48bNiwtWvXiuUVwZwiLnetrAplIezGExEtUbdNkiQ+dUFcoCt9Q2E0Gu12u8lkampqqqqqysvLy8zMZEI2F0mSaIpCUUMqimIymcaOHWs0GisrKyVJIhdT+okLSE5QgOSWzWYbOXJkMBisra212WyBQKCysnL8+PH5+flMEOG0X37hxNpowkCDwZCfn3/16lWPxzNz5kyn06koCtk8+dkQG09tk2V59OjRgUCgvr4+OTnZZrMpiuJ2uxsaGmpra5OSkrKzs6klrHXiis6p8lh8IkD30e79QDeV3+93u90ul8vtdrvdbo/H4/F4vF4vuSvT6EaHHmcAQLeCGEIA4g/d72icflwVTRwghyYMGDx48F//+le32221WpVW0aha6IFWxfLpjbxt2uGDMBaqGERp1f+R6JDU1FTGmCzLLpdrzJgxfH2Yuea5d6gkSYMGDbpy5Yrf76d6xBkgtBuqkGV5zJgxPp9v//79Y8eOpbhB3b2Hv82ys7NdLldaWhr/NcykiHzbpKSkpKQkn8+XkpLCGPN6vRaLJS8vr7a2VlGUUaNGUZpT1pq8tDP4fD5Ro/YwisbVFnQriqIYDIbwt43UGr+q+8jQnEk33njj888/3+5TDAshAD0GBCEAvUBc9GPCfK1VdjzdXyOsnPdltdYG+ik/P/+6667bvHnzbbfdRvNPKEJGmfAt6QxxZDfTJfx8EpxQpz02EY1jLMR15yvLy8s3bdqUmZn50EMPvfTSS+PGjSNbmWoWk0AgwDO10BhEIBAgKfWTn/xk9+7dzz///JQpUyRJamhooIkNVXsUu62KophMpuTkZMbY9773vWeeeWbUqFH79+83mUwul6u5uVlUdLpVUQ1ms9lgMEycODE9PX3nzp2MMXJ/9Xq9VIZsm0xjGKfOektLy5/+9Kfm5ubZs2f/7W9/83g8NBX4hQsXTCbTxYsXP/nkk7lz59JO3W43PVAk7eiv6ExLZh+pNeKUn6ja2tqSkpLOq0oQX5w+fZoeEPFWpNEKRVGSk5MlSaqoqHj88ccPHjy4ePHiO++889q1a5cuXZo3bx7Z23/+85+z1kBxAEAsAEEIQC+g2+eOOoaw+3rwoWpWCVqlbXbEjlYeStpR39RoNN5///3f+973MjMzp02bpquldfVkFIQ5k3HhGhfe65VFdhQqrR5TdOgqKIpy880307KYjqWjzJ49O+ptGWOlpaV85ono6MyF+M1vfkML+/fvNxgMbreb/qU5CQHobj7//POf//znDofD4/Fwv2v6qV1BCAshAD0GBCEAsULk3T5teFuHNg+DtsMtVq6VCiotJxbT9etTrdRuoto1rU9KSpo4ceLBgwenTZtGBhxVVe0ee+dPTgyqoyiIRLfH8pFq75B2yxN8HhEpdIJQbc2yLJMNpKPmYr457Y4b1jpUA+2dB3lqNw9/+Kpn1ufzqWabCL9hJD9JmiDMHoPvOoqrEzWdGRUK/8SR8ml37tBYeDZ5lKC4RlWAFsQbuLGxUVUPd/fo7gYDACIBghCAWCE6C6HYRejkx1Ur7VT160agaZ0/WXsaVVV5qJAw8kEi57SHH374iSee+Mtf/vLwww+TYxLfUOq2SEIQ7+j2OMVbNPwj08mMO7oDNx3aPJJ8wrp3fiRd7VAKM8yG2p/g9QdCobqBVZ+PSJ4sWAgB6DEgCAGIP3S7iV0+Tq+1DbYbsKe7ia5BRhRyijAzuLgJl3k0t/h111338ssvX7x4sbCwUBISk0ZyFBGSYC6j0RGJAa1X6JJLEBfXsUNEfUSJdypALIP7DYBYBoIQgF5At88duS1CNSrfhb12rW0wlBRU2QZVFol2paNoTtTaCVWakApMnjy5sbHxlVdeefjhh2n+AN3GhNpXRwmfDTKBidkjDe8zGbPNBgBEByyEAPQYeNgA6AV0rXmddxntPGFCqnTNcdy4J9agFYccsTbW1ndIjCdU2mapoTqNRuP8+fNLSko+/PDD5uZm1Y6k0HThyDQGuQEAAACQYEAQAtALcM0jSqyos4xGEg3VyUbypobShKwjPquq2sRhYP6TuGu+I8bYypUry8rK/vrXvzJNWgKlFV5Y+1N4eDP4zATiYeoefuwAsQoAAACAKIAgBKDXUImQyCUHze3L0RVpUdDRxquWeT2RKENd2SYuq6yFPJiQMbZq1aqWlpb33nuPtdWE4k5Vy6JkDYPYDK3LaHRntceI8KpFXjg2CdX+WNbqAIAogMsoAD0GYggBiBVUMi8MqhhCRbCD0UIUnWPez+bbcknGy0h6Mz0oGq/RSBAthKH+ajeh/kFRUdGqVateeeWVlJSUWbNm0UQUPP290jYhjWpZPN5QO2KtCdN12xzXqMyt8UgCXAUAQCTE72sKgLgDghCAXkPVtY3cZVSUjrr94yi+o+H72VpxGGovXJKFqZAXUPRyjYZpGC9QVFT04IMPPvvssy6Xa/78+QaDQasJWVsFG6rNKsXLV6raHxddky4RS3FxpFpgTAAAAACiA4IQgFgh6hjCLtm7rumPtZWC4rIo6jpkmdRWqNo2lBVLafUdDQaDkiTl5OTcf//9b7/9ts/nu+2222hywkAgQIZE0U6oK/nCrGEhLIQJQHi9HY/w9ifk9QKgL6Ny4+/FliQk8f7yB10LBCEAsUIkLqNiKF03oavuVIleOmobVJXX2htDaT8WQjpSgYEDB95+++3vvPNOU1PTwoULHQ4Hl4ViVpjIbX2iKNVtcyyjajDZSzu6FYuHI+WIjTcYDL3YEgBAlxP5ICkAoJNAEALQa6ikDgnC8OOg9KvX6+2xtqkaqYTIGaMrurRGv1Dlw/yqrVkSZqUfNGjQfffd96c//amysvKrX/2qw+EgEyLJA21gpMoXVDe8kCWEhTCSAXVFkzsnfklKSnK5XIqixFQnsjNhvR3aS8LYT/jrpfviXdv1ae+SXegOeEVxUNqUVxE2IMJ3bI/dOdxrI7o9xtFAFQDxCAQhAL2A7rct8qQyoiDsvs9kGK9OsX+jMh72TMO4pdRgMGRnZ//mN795++23n3766UWLFo0YMcJkMpFbqe4RqQ5N16FUkqS4szipjlf3/KuuIKnBeNSE2h72pUuXeq85oMtIGGWri8qmHQwGVXeyNv45kdQ+J5SbCQCgt4AgBCBW6EyW0S5UX2E8OTm6o8vh87V0Bm2eGK4/eS6ZJUuWbNiwYd26dZWVlTNmzDCZTKyt8AsvkLTr431AOsKTH6fdMlXved++fb/4xS9GjRplNpudTqfZbDaZTEaj0Ww2GwwGo9FoNBplWTYajYwxWlYUhRyMxSjEyB8lXeOquEZRlKSkpJdeeunw4cP33nvvyJEjg8Gg3+83mUyRnHPdyql5RqMxOTnZbre73W6DwVBXV7d+/fqPP/540qRJN9xwQ1lZmcVikVpT8nbGCKw7qqI1wOoWC1NAGwLtcrmSkpJSU1NfeumlmpqaX/3qV/379/f7/XSBGhsbPR4PPea0LVVIZyO8QZjK0KvVYDCYTKYzZ858+umn165du/3220eMGNHY2GixWPiLQrc2fgLpEnD3AVkD7S4jI6OysnL58uXnz5/v37//TTfdlJube+7cuerq6vHjx//P//zPxo0bb7nlFrPZnJGR0dzcnJ6e3tDQ0NLS4nA4+KExxpqbm9PS0n7+85+vWLGCblq6hfx+P19gjNG/pC19Pl9ycvL69es3bNjwve99b8CAAc3NzaE8/MXL4fV6PR6PIkwqq71Y2nMiHrvRaKRnjZatVqvJZDKbzWazmdbQT3SYEb52dKPlISa7inj/xoGuBYIQgJ4j/Ic5EkFIfQKyEPLxY9almrBDgWehCnetU5YqN4zoyMqFgcFgWLRoUVJS0vr16y9cuLB06VKn00mKkbV2X0RjpjjuLq7na0J1o7tWfncfkXi9Uu82VO8qlntdvNtKjZw0adL69et7u1E6TJ48ubKyMisrq1v3MmXKlEWLFuXn5+fn57vdbqvV2q276w6am5sdDsfAgQP79etXUFDQfTuaM2fO1772NZfLZbPZum8vRUVF586dC/XrzTffzBgrLi6eNm2a2+2+/vrrd+/effbs2UGDBgWDQYvF4vf7vV5vWVnZT3/60xtuuKGje//2t7/97W9/u1MH0G3Y7XZa6Kiu6xn3EwD6LBCEAPQoYb5kosALX8bj8Wgr5EKlBxRLu/Xrumu2u5Xq2HVDEJUQiW2CwaAsy3Pnzp0xY8azzz770EMP3XnnnXfeeSf3/KQEpKo6VU6k4q7DqKkYUUq60ZWqNapNdFuuSj8TI0cXHvFgSdtrTRm922sMBoMmk6mmpubkyZNZWVmic2An6/T5fAcPHiwtLS0uLmaMBQKB5ubmXbt2nTt3rr6+3ufzjRw50mazud1uraE7CmshN7IZjUZa9nq9ZOds147Ef1U1g5eXJMnhcJw7d+7YsWMjRoyw2WzDhw+fMmVKIBCgka+GhoZVq1aR7avzXtz0XF++fLmiomL8+PFKa17iTlbL4W+nLVu23HjjjS0tLX6/Pzk5mSzDjDGy11ksFsZYUVFRdna2y+XKz89PSUlJSkpyOp02m81sNtM1bWlpuXbtGmOM5GtTU1NSUpLuHun+Jwun0Wg8c+bMhx9+uHjx4pycHHo6VNedXxGj0VhXV+dyubKzs41Go9vt5pP3RH1aQvnqK4ri8XgcDkfkVXVHPm3Aga4GIhCEAPQQWu2hUjWNjY2MsbS0tJaWFuo+iiXpO221Wmtqag4cOKCtlhObb/lIWhW5t55WE0qt01FYLJbvfe97Z86c2b17909/+tOBAwfOmjWrpKRE7E3yc6uVhbRsNBqpA6faL9MzJ8YI2q6/tvev9fXVWghj7bjCw02FsRkJ6fF4mpqaOuO3KUKVXL58+dq1a3PmzCkuLvZ6veSnt3jx4s7XHzu4XC6TyRQIBJ566qn6+vqUlBRyOOxMnVw7eTyelpYW1hoq3OWC0O12nzx5ctKkSampqYyx2traY8eOGY1Gp9Pp8Xj69+9Puu6zzz47duyYx+O5fPnywYMHq6qqTpw4QS0k9Xvx4sXx48czxsiYeeDAga1bt5pMJlL7siwHAoFAIECylt5dgUDAZDK5XK6qqqqjR4/a7XaSiNQ8lTKXZbm+vj4pKWnEiBGTJk0aPHhwd9uWOyrqYipBFACJDQQhAD1BeP1APyUnJzPGqqqqwtRD/ZjZs2czoSvctU2NcaS2MYRaTUjKedCgQRkZGampqSdPnnzvvfcGDRo0cuTI7Oxsm81GXcBQDkt0Pn0+H8/co2uojP3THqFk7Sqt0mNwWR7LFgPRdObxeCjtrXYMoqN3EV3T5uZmk8k0cOBAxhjZmhIPkkBGo5FCJVNSUsRfOzMcQ3LL5/N1fkyHK0z+l1ZardYHH3zw448/Tk5OHjJkSF1d3aBBg+itlZSURO95Orp+/frV1tbabDan0+n3+0UDoMlkqqiooGezurq6pqbG4/HMmDEjJyfHaDRSUCVFGfCwQzKrKoricDiSk5MbGhpcLhc1iSsr0Q+FXoP19fUtLS179uwJBAJjxoxhMTnaxeLhlQtAXANBCEDPoeoRqkyFBoNh/vz506dPnz59+qZNm956660lS5bceuutP/nJTzwez9e+9rVBgwYdOHBg48aN9913H2v7gYyLzrGWSGxTWrucqAlVG1K3mzZJTU1duHAhY+zAgQOffPLJpk2b8vPzx40bN2TIkEGDBml3Rz0qn89H/TOn08kY83q9lBQh/IHEIJKQViRUy6mM6irE8r3EEZ8dpokyjR14ChCVgVq1EB7Vfe50Oi9durRp06apU6cGg0GeYiqUP7B2ZeQnSlEUSgdCypaWSWDozoYq3mkRmncoLpq16hY6UV6vNysr69KlS6dPn1adOpVVP0JE2zg1XuV1HOZAVIT3xKZDIDveddddN2PGjA0bNqgELTFu3Li777773Llzs2fP3rp165UrV4YOHcoHDmRZ3rZtW15eXktLS1NT0549e4YPHz5x4sQOHXWEHDt27He/+11qaioJwlCH2Rmie3nCQghAjwFBCEC3E+bLynuxLperqalp7dq1FHO/YMGCH/3oRzk5OYyx+fPn8y7R0qVLH3nkkcrKSqYxksRmh5h1sPfZ7k8qTSiuFG1H/FdZlsePH0+eV6dOnfriiy/WrFlD0Tj5+fmDBw8eNmwYaT9Jkqi/yxgbOXIkDeTzzBOiBI3N88za9rq40gvfFePeyLqVxDIxaMfQ3h7BYNDn83UygFB1pP369RsxYsSRI0d27NghSRJFwXHhJzoDqyrhLdTmU9VtHlmPLRYLzePi9XopuSX3TdAO6LQbTBjmGFVDPwaDIRAIzJkzJz09nbW9LaMYBRCLia+OSMprEU2Cqq3oXV1dXW2326urqy0Wy/79+2kTr9ebnZ1dUlJCnpmnTp1au3ZtbW1tc3Pz/v37r169euHCBfHldubMmXnz5lH2TqvV2q9fP8YYJV+N5JDbhfZiMBioSdXV1aEOvEMPWvjvHV+I5MIhhrBbibX3J+hdIAgB6AnELpSqa8KXm5qaqqqqCgsLfT6fyWQ6ffp0UlKSw+EoKysLBoMDBw4ka1VlZSU5joo1s97+Xob6tGglaxgzYIQVck2ou7muGZb+HTx4cGFhYWNjo9vtrq+vr66uLi8vP3fuXEpKiizLJpPJarVmZmYOHjz4lVdeOXjw4J///OfKysrMzEyVi2lcfEd1Ywi151mlBkMVi01CPUq9hVaBBwIB8usL3wPWKknxuVZdIIPBMGnSpFGjRilChmGak1OJzAE4QltiMBi02+3nz58vLS0tLCwcPHiwy+UqLS3NycnJz88X588Qk8S0u3fVLviG5O8t/kSmNt37U2U1jUSE8NPFJ2wQy0R+/7QrpJuamp599tmf/OQnVHL69OlHjx5NTU1NT09vampyuVwVFRWMMYvFUldXR+3x+Xwej4ciA81mczAYpNeUxWIJBAJut5vHAapefeIJ0f0byVEwxqxWq0quiye2Mw9XZ96WYpPi4q0LQPwCQQhAD6Hohb1xKEPA8ePHqadVXV29d+/e/v37OxyOkydPNjc35+XlWa3W5ubmI0eOkOWQV8vaCs5e/3BG3gsJtT7CIfwwR8pPCK+NylssFgq7otT2NTU1Fy5cqK+vb2xsLCkpmTdv3vnz53klzzzzDC1s3rx53rx5gUCAumWiKTJ8I3sYVVc1VFIZ0bKqaGaeiLWD6ii9eP+LCo3WkEmtXUOHdmWoq0CVGwyGDmVr7Az9+vX717/+NWjQIIfD4XA4nE5nfn4+GdV7DHEspqP3qu659fv9Ud/z7RYOBAI0ikT/Go3GvLy8zMxMxpjBYGhsbLx8+TJjzOFwpKWleb3etLS0tLS0pqamlJQUSZLMZrOiKEajsaGhwefzkVT2+Xxut1u3MaobPpQpVbc8LTc3Nzc0NKiOq6veA7rjaLAQxgK93lUAMQUEIQA9hygktJY9WZbtdju5AyUnJ6ekpJBnUXJyMqWbZ4w5HI6kpCQ+Wsw08UUx8ooPZQaMpHntFtO1B6q6HaHW859oRvv09HRySCNmzZp1/vz5nJycxsZGkkkmk6muru7GG29UFIULQt0D7JUzr3sjEar0ieJ5kAT3WiomSscYFLoR0us3v7YBPM9H1OZllYkmCkUUNZSy8syZM2+99VZycvLIkSP9fv+xY8esVuuwYcMiMUN1Eq2HYef3SAGEugGQHWqY1veBNzglJeWBBx44cOBATk5OcnLygQMHampq6AVuMBjGjRs3ffp0xlhDQwPNLVFdXV1XV9fY2NjQ0ECDVn6/n0RaQ0MD2fApC47YBnFYR7VeV/4pbT3eVfchJdpRHWNnTlGXoDq0WGgSAIkKBCEAPUS7PTnqNZLflL8V1jrrIJWnlWJvRldk9ha6Uo1pNJ72J/GvqiqVqAtlYGnXc0yslsxikuDB29jYmJKSkp2dzRijXhqVF8N1dIerVV3VSNrQeSLx5iKxJ5ZnbSMhCX4e+BpVT7er2971hOoZ9yKihVDVz2ada6fq6nTTBaK9cA1z11135eXlsdbEmHa7XbQ/d18zeGO6UBiQwU1lIYyiSdp/6e1Nxj2bzfbxxx//n//zfxhjly5dorNHLxB+3mg+Eia4bSuKIqbFMhqN9Kqneepp83bdIsKvF50mxPZ7vV6tm0bE56N9tBI6kq1Unr2x84AnBnHxegc9BgQhAD1HqHFljvivqPqCwaDYG9AVk7rre5J2TZQqY2aorcIUY5ozIPZvtCcnfD+SS1BuIhOthQSddppPLEw9Yf7tPsLvSOymq+wqWlGhshB2Q2O7kVhusKIoom1H9xkJP5SjGj0J9VO79bTbTt1tDx486HK5br755kuXLjU3N3s8noaGhqtXrxYVFYlH1OVoR4h0iXDvqvNGr1Pt2zKUsV13v6GuC3+Ubrjhhscff9xut1++fJkEYWVlpcvlGjBgABWgGQh9Pl95eXljY2NzczNlCzObzT6fLxAIVFVVlZeX0yuITM3/P3tvHiZHVe//n9632ffJTJJJMknIQjYCSYBElggBIosCgoALV6+iXL3q9brw9UEvoojoVdGLuCCIKCCyb7IKsoQtCVnIPlkmmZlk9pme3qv798fnN+c5ObV09TLT1TPv1x/z1FRXnTqnuvrUeZ/Pcoxrq3e79GyG4g0Jh8PjYCHU7NsNQAwhAOMGBCEA4wTXHpoeOzRpzTP4pVIpSh7IRl+KfL/m3LalXpZ8zKEWIerJfiZIF2NFJ42qpWsxnbEO7SS7q6ahkqBhnLgOmHiMlNbPao5MmnfGZrOJrsV61ldqGqbe84h4q/k4XjRH2/Q9nNMWrmkwz0UKitVQc+DAgaqqqpkzZ6ZSqe3bt+/YsWPr1q21tbWLFi2ifMjjgPoWGfyQDQqhw7jLqN60WkaoT7Hb7UNDQ7///e+/9rWvLVu2jDH2zjvv3HnnnU1NTYFAoLe3l1YRZIx5vV5FUaLRKHXpPJSXLI3JZDIUCvX09PClJiVzmV59xL5UPefIj5H2U03Y8Q9VpndDE81Hy+TjqvaFAXmk4G8uYCkgCAEYb/jQUNKHopmLjQ4L2PEiUBxW8tL48dbp38UxhziGM7aEiPfEwHKoxiY4nYob4j3hN1MsSvqUxrjqATf5zunVpLB3Xu/q6gdDcyCothBi4JVfotGoWrGrH2zj227waS7fV9pHd8mSJWVlZaWlpUuWLNm1a1ckEqmsrHS5XGo/WJaJrM1vJTO6Ip9l0+xFs8Mm+BowxmgZiVAoRP3JySefPGfOnJKSEpp8URTl61//OmNs6tSpM2bMGB4eXrlypcPhcDgcLS0tNEdDC6KmUqnW1tbh4eFYLGa82qS6IZqzcuo60zYVnmNcpR65PBWiBtZrCAAgL0AQAjBOqHWR5uuN27L4u1AUNjSO0cu9Vtj3pTTGFUcbiqK43W7G2O7dux944IGDBw82NTWlUqmjR486HI4LL7xw3bp1NpuNzCkOh0O9Wrq6WPGikvnRWHlqQkO3FStWMGFgpCkIJVmlZ+HRq7+Zyhh8j3qXUFeAhpjSieqSaQCax8ExEKHcRfz26n2zkvHWZsJbcoyQrtvc3MztzHPmzJk+fbrL5YrFYtxsxYQ6q6erssNYNku/bjMCSTyGojq5/4WI+Zqrp4TE7cbGxltvvXXHjh2VlZU1NTV2u3337t1Op3PatGkHDx5sbm4+44wzfvGLX1CSKofDEYlEqM9JJpMejycajbpcLlp8IhqNkjGTXEiMa6v5ipFul9Rf8UKkXLh5weAxNvlsq42iuXxrAAADIAgBGA/SzpLyPAfiC5sbtUQRqLYQqu0PhUVdDRpTHjhw4P7776+pqTn99NOXLVtWWlq6a9euN9544/333x8YGLj00kudTmfatqhHeNKAgIxdfX19XV1diqL4/f5kMmmz2Vwul9Pp5PkbaJvGhbTcWUlJyWc+8xk2msVHLNl4bTdepbRDk9zHLpp6WBNxpXIx/4dUiNoSiwFW7tiOd1BU25yN4RMc6kkWcSivHtYz4esz7g1Sxzsj6NVNWmeF8h77fD6mek7y+NhoFqUpLcz/4sTWqX+qmVZecz6IoCmtKVOm/OY3v7n33nsvu+wyu91+1VVXlZeXv/vuu7FYbPHixRdffDFjrKurq6ysrLe3t6am5tixY4ODg11dXSkhr0x/f//Q0BD1imm7F+kVo/5+NY/hG/SgZnQTTJLL1JhaEBZqogSACQ8EIQBjjp4RSdpvs9nEOVru1EQb4ol66S7HtBUGaI4zRDcqu93+7LPP3nTTTf/1X/91ySWX8BPnzZs3b948RVE+8pGP7Nu374YbbuCaUK18NFuaOt43le7MN77xjdtuuy2PDZTW+RDbK26P81eglg3iTXM4HGT2VCes5zidTo/H43a7xbEgxlt5JCXAclBNxl+K5qcmxZKkFgxKEDWJnjtAHjGYRMvlcjQ5QgHb5LagdxWTNZQgs/zRo0eTyeSFF164aNGiSCRy4oknMsamTJki9iSRSCQWi9ECg+FwOBQKRSKRVCrl9XrpI7vd7nK56CrqoEc9eax+xagPlnRsKpWKx+N6SWtyQd1XZ3S6mSqhvwIgL0AQAjB+pJ3iNZjPFq2FWRReEEihUcV27Ngxa9YsUoOUO8c2muvF4XDcdtttd9xxxwsvvEAr/qVGUyxoDm40L0QbdK0//elPjLGqqqpoNGqz2QKBgM/nCwaD0WjU6/V6vV7yy0qlUmVlZVwOdXR09Pb22u120RhLXwS5jGYx8pCakNKK4tNri14hac+i8quqqkpLSxljZNXR4+STT+7p6ZEuZ3wtkBbxgeTTIqnj7f+aY3T1F60+TLOXMCghl/rnuD8viO3KvY28exEdqtNqLXUh4sHS6f39/XfeeecPfvAD+vf999//zW9+c+zYsUAgMH/+/PPOO4/20wL0NCPjcDjIfZSmz7hu5BlHNdOiSpi0FWuWM3YWQk1MfoOxWGysawIAICAIARgn9F6BfJ6eSz5SSqKFUDIJGg9HCoLmsJV20sArGAxecMEFjLF4PO50Oukjrr7mz5+/bNmy119/fe3atbTT2E4oCWbpU5r4nzVrVjQaTSaTdXV1jY2Nhw8f7unpKSkpmT59ut/v7+7uTiaTc+bMCQQCFKjzyiuv9Pb2SnPSTqdTyp8hDbmM73+mA+js3KuksyhuLRwOn3feed/97nfD4bDP5+PfCH/AHA7He++998ADD/z1r3+9+OKLrWBqnnjQOJt+wnqPinnLSX6lUVr4ozI+lxsfqG+Rlt3LtF02/eg4xtjg4OA777zT399fWVnJGFu8eHFlZWUkEqmtrd2zZ88HH3zQ1tbGGHO5XOFwmLKMRqPRaDQaj8dp7oB6JOq+7Ha72CWmrZj5Y3iBVPh4vkcyFYRZWBcBABkBQQhAAdAzEeh5ZImeP9LIQG0iGAcMvMskD0Zy0HryySdnzJixbt06JqzCzA9WFMXhcJx//vn333//li1bFi1apDYPiqhHctJ9mz59+uHDhzs7OxOJBFXAZrMdPnx4cHCwv7+/t7fX5/MlEomRkZF4PF5ZWUkatb+/X6+9ZCHUS7pg/ranHVVn9w1KT46iKC6Xi/Ttf/7nf6Y9/YorriBfNQP7FTCD+vebTCZdLpfH47Hb7fxplA5mOhMBhUXqWHJ/+AsOTYK43W6/309OktxlNCMLYUor/FI8oKWl5bvf/e7NN998zTXXLF68mDE2bdo0+mjmzJkk9hhjlEqUktyQ00QsFvN6vSQLKZI5HA5z210eHxLNiTYLPoTjabQEYJIDQQiAVRAtgeKULTcv0LZBNMg4v9ENzFziR4qiPPTQQ9/97nfLy8tpwlsqgeRffX396aef/tvf/vZXv/oVS+eUxS/Ejp/wpj2BQIAxdvjwYdo/ODjY09MTDodpdOV0Or1eL2XV8/v9w8PDoVDIZrNJnpMiUrpO9VBePek+1mj6ForexUNDQ4yxmpqagYEBdcVIllNaHZ5ER69kYBL1rXO73V6vl7KwiPFjYPyhnsfhcFRXV0sri2b0zGsezM3viUTC6XSecsop999//5IlS66//voPfehDPT09x44dczgc06ZNW7du3bnnnssYo5RXsVjM5XJ5vV6Hw+Hz+chrlFIEB4NBkqwUamimbzFpRZTm0VKjmL8JOQKXUQCsBt5PABQAzdG85AkmTsmLjlvSVD1XX+M5jjfWn5I985lnnjnxxBObm5ulT6UCbTbb/Pnz4/H43r17W1tb9WIIeVCWuih+DxctWvTcc8+5XC5K3DoyMjIyMsIPmzZt2v79+6nyO3fuNG4pTVHTUF5cyZBpWXjGc0QlXlH8y58QyigTDoc117M2mHq3oKGg6OCPYiQSeeONN+bOnTt79myXyxWNRo0z1hqT36+Gl2amSjb92EU1vI/Kb6eUS2l8qujgwYOPP/54IBDQjCHM1ANfPR9HxYbD4VNPPbW8vLy8vDwUCn3+859XV763tzcYDNLMVEdHR39//8jICF+nJJlMBoPBbdu2eb1el8ulPt18PaXpKs0TpcCEjMo3D69J2keOjjRw1we5g7k/IAJBCIBV0HPKEi2E6iPH3zZlgFhJkm0HDx58/fXXr7/+eo/Ho/YClcxrPp/v/PPP37BhQ21tbXl5eUqVkUV9xZTWeveUTEVz7Wyn0+n3+6urqwcHB2fOnHnw4MFIJEIfUaYZqTl00ZkzZzKtL8hSL1RJqc6ePZuleypsx2c6sVRzihdxtmL69OmLFy9+4YUXduzYUVVVFQqFchGEzJx4M19UykSWI0LykzR+VGxCqGp+6qrfPZrHZrNVVFRs3769p6fnjDPO4P6iLK8/ZJvNduzYsVtvvfVHP/rRpZdeGgwGn3rqqb6+vurq6kgk4vF4+LW8Xm9jY+Pw8HBdXV0oFFIUpaqqigyGpBKDwSCZyMixQp1y02Sfn/YwcZZtfDApCOEyCsC4AUEIQIFJCak+xDe32jtUc39BLIRMa5Bh00q00NHREYlEmpqa2GgMj2YJ/Nzzzz//Bz/4wbZt20477bSsJW5vby9jzO12Nzc3+/1+v9/f2tp66NChXbt2BYPBAwcOnHzyyT/4wQ8WLVr061//+sknn0ylUhdffPF//dd/ffWrX/35z3+ubmZnZycb1ZmWVU2irmaMHTx4kKUbRos2DZAvxEmKqVOnfv7zn9+1a9fw8DA5BGoabDMqPKPj8yUgKbsSyRJSLDkWmKnAy/13Ry6aNTU1tbW1CxYsYKPpl5i59L+a8CktseuLxWL9/f0UeBwIBOrq6n7zm9+Ew2Fan/CCCy5oaGhgjE2dOpVy/J500kkej6evr6+xsZGN+iOQMpw/f/7g4CBFEIy1BS9rwZkFafscupmDg4PqnYQVJkABmEhAEAJgRWhAacYkVRA1yAxT3ov7u7q6pk6dStvi2EtdIO2n5eO7urrEnUy/georMsYqKioYY2632+Px9Pb29vX1TZkyJR6Pd3d30wEvv/zyAw880NfX96c//am3t7ehoeH73/9+U1NTe3s7Y8zhcNDMNG/jv/71r6Ghof3793d3d1PcHaWCoIGaoii0ShjtVxSFPFQpiYjkPmdyHEzWG940WpGMp6e3jSJGHFEm/VQq5XA4zjnnnNtvv52Zm2KnwRkGWHmHnt7KysqVK1cWui5AA/q9sKx6UbXHOC+hubn5C1/4wl/+8pcVK1bMmjXrzDPPXLlyJU3TdHV1xePx1157jbZfe+01SjG6ZcuWYDDY1dVlG00bpijK4cOHTzrpJIfD4XK5YrGY9AvVnBbUrJ7BWcZtzO9rRbxcIBAYGRkhlat2UrDZbBRdGQ6HNU9XhxIAAHIEghAAa0FmtEynzwvl72dwUbvd3t7e3t/ff/LJJzOt8BV1TCB5RjU3N1NCFC4g1RflpWlOYweDQcZYOBw+cuTI8PBwVVWV3+/3+XwnnHDCT37yk/Xr12/duvVzn/vcAw88UFlZ2dTUNDg4GIvFfvvb35JVjYsoXr7H4ykpKamvryefUnEtAa4G6UTKmLpgwQKeyZDS2PAyM/qabDYbZX9xOBzhcJhS49DyZVwQEowx2lAUhfRwVVXV0aNHzVwOyU7GAptVMzcCEWlGyaRZjP+s1PNilFTm5JNPfumll/7yl7988pOfnDlzZiKRCAQCbrd79+7dTU1N1LNFo9Hh4WFFUWKxGBlgKQEpTQbxzKJcIuppOU2X70xfB+LiqxmdaBIpOoBn/NKDUmEtW7aMCXJds9VjUVsAJiEYBwBQAKQZZRG+R3xDG+hDMXJsnDWh5gBF3NnW1uZwOE488UTN0/VGMHPnzm1ra+vp6ampqdFUg+KGNESgnZQvtKKiIhKJVFVVzZw50+/3b9my5Yknnjj11FMZYyeeeOIdd9yxbNmyhQsXzps37/XXX/d4PB988IEUQ8g58cQT7XZ7Q0MD+XoZIKVRzQs0RjQf6UfufNddd92Xv/xlCMKCIHqNYsxqQdSzUVmYB/VEGs0KrVmz5sUXX7z//vvnzp17ySWXDA8Pt7e3V1ZWzp07l8IXnU5ndXV1IpFobGzs6uoaGRmprKwkCz85IAwNDfl8PoqFliYXxHhOpqMJjSsvHckfV/WR+WVgYOC///u/9+zZ8x//8R+pVOq73/2uy+X6xS9+kUqlfvrTn77yyiu//OUvm5qa7rrrrpdffvmTn/ykZrWlJuAnlh0wrgIRjAMAKAAGHbHmu03zbZ22qPFHqkxnZ2dpaSkZrKQDpHGY2OoZM2YcPnx43759NTU16ktIyS2kEuiv2+32+XwLFixoa2srKSmpqKhoa2vr6+sjvXfo0KEpU6YsXbqUjc5D0+ITyWRSynKeSqVotp5qMjIyQgtaiFeXWk3be/fu3bhxY01Njcvl8vv93PvXvOGXhCUZCkZGRsLh8JQpU5YvX27gGCaGMDmdTvLUNfN45F3BAla44F5gEtFTke8RD9D74sS4QX4k33Y6nfQzDwQCn/rUp6ZNm1ZaWrpkyRJ1OdQtOByOWCxG7uXxeJx85sPhMFkIY7GYbXRNQql6Uk+Y4+yDgY006wdYLVYVRenu7v7Upz41f/58OmbBggWpVIom2u6+++5t27bRyo0nn3xye3u7x+MhdW0c5ImfGAC5A0EIwMQho9FAfl+iaqFis9m2bdtGaRIoEY7e8It/RIeVl5d3dnaGw+EVK1aYrKqkzaqrq8Ph8AcffBAMBru7u/v7+xsbG6uqqmhcxReJZowlEolXXnmlq6tr5cqVt9xyyy233PLss88yYVTkdDppTCZdiF9Oc+b+7rvv9vl8ixcvfvTRRwcHB0tLS83LA16a3W4Ph8OhUOiiiy5SFOXHP/7xPffc4/f7paxCogOteDPJj9TMt0zZL0DekR4M40EtGFP0fDH0/BSydvflBR48eJAmnh599NGXX37Z6XQ6nc7Gxsbzzz+ffpu05kQikXC73UePHh0ZGaGuxuFwUE8VjUaPHTvm8/koblntdZ9dDTVvhUFROT6x4h0m0dve3j5z5kyv18sY27lzZyAQIEHY1dW1fft2EoSMsW3bts2ePbu6ulqqhtoQit9UdkBIAxEIQgCKAJOjE6v17z//+c/POuusL33pS/F4nJad4IYvURySwuF2KqfT+cQTTyiK8qlPfYr2iFPy6tGbOFCgbY/Hw0YNepSCJZlMXnLJJT/72c/+8Ic//OY3v7nvvvu+8pWvVFRUlJWVtba2Uh0CgYBe7kTaL/ptSgdI+0tLSykBDCU2DAQCNN9v0kJIPmMej8ftdvf398fj8UAgEAgERHdZyWlN77YYPzbqW8qs9xQVHXqeezAYWgS1UNf8SE1G393AwEB5eXlJSckll1zy/vvvu93uKVOmbNy4cf/+/Zs2bWKMUcpZRVEikQj1DGQNo06Seozu7m4STh6Ph0/ciL960QqX6aPFT/d6vdQ/Z3S6mfLVe2w22+Dg4ODgILXr6NGj3IVkaGiI5/0KhUJdXV3Tp09X20XNXAgAkCkQhAAUADMxhOIeLpYsOxWqGU4zMjLy3nvvMcZIEFIKFkqMSYdxw6ColNxu94svvqguVh23ozfy7uvrY4w5nc66urqSkpKenp6jR4+2t7dv3Lixt7f3oYceosMaGhpqamrOOeeckpKSm2+++XOf+9y2bdsM2ihVW6yAVJNTTz1127Zte/fuveSSS8rKykTda/JOUnJ/RVGGh4ePHDly4MCB9evXU6JCcSyoeSvoaTEfGYhlJ/KLsUM4Bq8FZ9xmQChJZiAQoNBlxtjw8HBZWRl5qldXV1dVVYXD4alTp8bj8cHBwaqqKnJTp4Pb2tqqq6uDwSCtSchFo5SCOBc3UepnGGMjIyPqCOoxujOUKplv8/6HcinzS9NcHr8bYo+nGQYJAMgFCEIACoDxkJE29CK7+GhAOquwb0e9qzc3N7NRyxipQcbY7t27586dyxj7+Mc/fv/991NLKTsfnTVr1izKFGpcONORZDQOI3/LaDR6+PBhSvVeX1/f1NRUWloaDAZHRkZohv4Pf/hDe3t7eXm53W53u91kDOR3WM9maDAiURQlGo1u37597ty58+bN079nZnG5XE888QQl3DNAqpJ5mYcYwnEDQ9gJiaYkI0fxYDD417/+de/eveFw2OfzVVZWfutb37r66quvu+66eDxOJsTm5ubu7u5QKFRRUcGzUtlsttra2mnTplEI8aFDhzo6Otio+0O+oF5iaGjoyJEjmq3IyxSk+NiTl6zo1sEzMCuKIva30kShXk0sO0lqfdAdAREIQgCsBR8NiFPFmseIjEXPbmDGNP5U3ENV5Svd0cZLL71En/7jH/84dOjQtGnTpBUmSkpK9FagUl9RLYbJGclms9EyEkQoFNq/f79U1e3bt6ubJjpi6c3BS6Y5yWOTFqXg9k91nU1CzwBfl8ygnkx1H8xbCKWbjwEWAOaRbFb85zNlypTnn3/+4MGDZWVlN910k9vtHhgYoJShJSUldMzbb78dj8f37t3b19eXTCaHh4dJEVGZ0Wj0z3/+8z333DM8PLxw4cJNmzbNmDGjpaUlHA7v2rVrZGSE3C5So2moqc8xXkCCeien0zlt2rSZM2eWlpbu2rXrzjvvnDdv3ooVK/icndS6XDDWmZI4lFZtpX5PfCeqZ+KgagDICxCEAFiULCyBxhLO4HhNJF9Nk5+KQyKeM50y75E7kN/vD4fDS5cupUCa1tbWM84447nnnuPZ+UKhUCQSocUq1LExYjglHzRIdaABBPmpLlq0aOfOncFgcPny5TU1NZ2dnVVVVQ6HIxKJlJaWejyehoaG3t7e11577T//8z9/+tOf0tp9fNihlnPqkZ80RrHb7U6n0+v18tXt2fGjRjOIMwLhcLi8vFwSeKIQ1TRXmrH72ZDjBIAckH564q8pmUz6/f7y8nKPxxOPx91ut5hvmTHG4+VomRzGWCgUUl/Cbrd3dXVddtllHo/nhhtu2L1790UXXbRs2bJQKDQyMsJGdRR1VqIglCKW+fxULBarrq7ev3//ypUrI5EIY2zXrl3t7e3BYPDQoUMtLS22sUyAZLPZ9CyE0jah9y7DBFbuQEsDEQhCAAqMZkiYCOUyoY/sdjtPbUKk9fOR3uvqfzVrJVnG1EY542QGtOfss8/eu3cvY8zj8XCPUDL9ke0ukUjE4/Hnn3+emkaz47t3745Go+eff766OaItzmCs0NfXd8YZZ7z88suanxqwZs2alStXejweqqRm+epIQom0Tr9qk4LxCIzm7NUWQs1accxbCKUjM9WuAEwq1J0h09KE7e3tp5xyymmnnXbXXXdde+21oVDok5/85GWXXcYYC4VCN9xww4033mic4PfGG29csGABY2zjxo2nn366z+e74IIL/vjHP65bt+7ss8/OsRV9fX2RSKS1tXXv3r1z5swpLS29//776XJiS3MMRlCfTiZN/i/PnsqO7+KSyWQikTCO9oSeASCPQBACYBUk/SAmkhG3JVdSzdGJ+Km0RxRXoupT25pExZI2fkOSjvR31apVR44c2bt3b2trqzhdXVpa+vbbb7e2tt5///2f/exnu7q6xDJ37txZUVGxcOFCqY3itaThl3QTBgcHh4eHGWNHjx71+XyUmUBy7OSFUMWCwWB9fX1ZWRnTEnLSHmOTKTtew6e9V0wl4DVLpsWsxZ287Zp2QvMxhMaPEABAxGAOTvwpDQ8PkwXv2muvvfbaa5988knKJcMYO3To0NKlS9Mu93LllVf29/czxmbOnLlx48bW1laaR6Nih4aGyMOTCyfen4s9G4fXzel0lpeX33nnnVQI7XzvvfdKS0u5eVBsVI4dQkqVb0x8oYhuoqKFUP3e0fSXyaViAIoaiEAQAlAA1KMH/vITLUXcKii+Gs2IE0IdaCGpQYP3gZ43pt4lNOduly5d+u6773Z1dbW2tnI984tf/OJvf/sbpUj5+Mc//s1vfnPOnDn0ER0TjUZnzpwprkqvdo9UX1HE7/eTO1ZlZaWko/Sgu0ojNnXJad0vpVtts9kcDkfas6QBnEHhYmpW9UVTqjhGlnkMIQAgUwx+ualUihzmKU/M8uXLt27d2tfXV1lZ6ff76efJvT2lcxVFcblcyWSSSrj44ou3b9/+6KOPVlZW/vSnPy0tLX388cfD4TCfHyRNxftGsUxJFtLxgUCA5OixY8e+8IUv/OUvf6mtrb3wwgudTqc4D5inmyTfFvG1IhoMRXFI+9O+gAAA+QKCEACrQO6gtC2O78nARR9pmp6Yfp4VtcFQ3E5rG2QmRgZqkyOnrq6utbX1wIED8+bN4+sLf+ELX/jjH/9IM9MjIyOhUOjjH/84fZRIJDZv3pxIJJYuXSp5SGoaNvXshDabjYY75l2e6BgpxShHkkwGJjVjfc7ryaN9aA8N6bjq07SFShY/A8OvWGczwykMuQDICMkix/eL25S1mDHW39//3nvv/epXvwoEAj6fb8WKFX6/nxIakyzU7NKpNDIGulyuhQsXplKp6urqysrK/v7+jo4Ocra0jQYNilms9Ho8+iiVSvn9/tNOO+3rX/+6zWbr6+vbv3//vHnz/H5//u6QEVLuUM0bSO0SjzTW3mNQTQAmFxCEABQATV/B1PFRZHyUQCJQVEFqb0A94WfeGzCttVCNJMPU0isej8+ePTsajX7pS1+qr6+vqKhwOp1z5sz57Gc/e/fdd7e3t3/0ox9dsmTJ73//+/379/v9/sOHD2/evPkb3/hGTU0N+UoZ1Ef8K7WLL+tspu1infUWmTC2oamtow6Hw+VySRZg9Vni90jiUPNWU2nGF1VjxkIo3kPzJQMARGxagdl2u53se9XV1bRyDGPsD3/4g8vlisfj3FeT+nnN3z4lXyG/UKfTuXTpUtpfWlo6bdq0fFW+qqqqqqqKtg0mEPMFKUDREii6jIrbJufyxqieAEw2IAgBKCSi1cg+ivgvG1UO4rbaF1RC/V7X9LQULVHikebfr6Ip0nZ81Ifdbu/p6Vm2bNlJJ5105ZVXUqBLLBYrKytzuVxf+tKXeCEjIyM0DiCB5Pf7d+7cuXXrVqZl+BKvpWe9VDsaGShh0d9ST0RlEUNot9vVup3fKyqwvb199erV55133m233RYIBMSU62ojbdpZAH6ucVuMay4WjmEWAJlis9loJdKGhoZUKkVmwDPPPJOWoCAr3JEjR9ra2mj5B7HLlabYuru7Dx48SIJQ8vzMsYbGn46pwU2a+dJzH2WqdQgBAGMKBCEABUAzTkPvXz6FzHSixZiWcNJzK1UUJRKJ+P1+KsfMG9fAKVS8HPd+5J9u27attraWMWbsjBQIBKQ9/f39lD5BbZozM4fNtZN5ScMn9TU/NV6bS9P6JzoAax6sKApN8//mN7/54he/eOKJJ+oNxcgD1nzsKGHeQqgnnuGIBYAeBn2L3W4fHBy88cYb+/r6fvvb35522mkul2vt2rX8AI/Hozmpp+5YHA4H+Z2Kc0NM55ebaf3V84BqO2fWE0N6J6rbKFkFxSMxJwXAuAFBCEABUOsoshqJ+x0OB+kQ0SqoaXrSE2xq2ZlIJN5666133nln5cqVK1as0PS6lMYc7PhXuNrAqB5DxGKxwcFBm822efPmsrKyFStW0EJb0pgmdXyqGC5QfT7f22+/vWPHjlAolEql3G43OUxSbgapyZoDCLfbTWvT5wspM42mAhT/paUINWUkb34oFKJwoMWLF8+cOZMfoy6cvvFMLX5IFQPA2KEXOkjdVHl5+ZEjRw4fPlxaWkrpYXgXZ7PZqqqqZsyYwX/R6i6U/tbX18diMc0DRNKqJkmb6U076u3MWnZq+neQ3U+0CkqfSkdqVhvkBehtIAJBCEAhkSIGuaQRRaDT6YzFYrzv5kJRKoFjIOQ2b968efPmN998s7+/f+7cuZWVlWZeCRm9iYPB4HPPPbd169bm5uZZs2YNDQ3dd999mgsuSzidTkqT4HQ6I5FIfX39I4880t7enkwmzz///CVLllC2VdHXiOkMWehI83UW66C5Xy9VqZ7JlAShgSRTFKW0tLSvr0/co/ddpC1NE2QZBWB8kCbdHA6H3+8/ePCgOkmYOCtEvqBMZxqI79dMEqM58af+iB3/FlCfJc6sjZs8kGqoF0MovhABAGMNBCEAhUTy2xGH5mKsIB/cS8cwnSlevSi7gYGBM844Y/Hixd3d3WShYvr5RcVLaFZebYFMJpMvvfRSU1PTunXryNYXj8cTiQTPp8eOH7iI2pWngUmlUuRSFYvFnE7nxo0bn3322RNPPJEGT8ajH8Llcnk8Hs06G6MnovRWDNOTnWQeNFiYntf/vvvuu+yyy9xuN/9m1XeVpgBgIQTA4thsNpfLJTnPq3/Rg4ODO3fuVCe+4lDf2NXVdejQoXg8Tv2DKOFs+vEF0h7xLSC9bphODyaJQz29auZupN1pELOQHEWzEBgMAcgvEIQAWAXSCfQyJi9BeneStODvb5fLJekTPScitSYsKytrbm5uaWnZu3cvz1Kj6X5p5nXLy+fb3d3dhw4dOvfcc7keM788uhqyy5166qmvvvpqLBbz+XzqNqq3GWOUqkFshclpZj0RpV4UnhnOqdvtdpfLJbZd7VPKGHv66aevvvrqF1988a677tK06/I96nUI1fpfOkvt0KuH8aIaAABN1La41PHpYaSP+L/xeFz80en5/KvlUFpvT/FIMzXRbEi+0HMZleojuYlKhei1Lm+1BAAwxiAIASgImmEbNptNVDLcjiT6iNq0spXoDQs08wT09PSQcmtoaBD3s8ynXdVDjUgkUldXRy/1RCKhqTQMXvBqVyJyHy0pKTFvH2OMORwOST0at4vfalLa6khFvRhCvdge+h6pHPIFVTtukV9ZZWXl0qVLU6mU2jeMH0bLTkizAOKXLil/W4ZZRiUw2ALAPJozU5rTOvyXVV5ePm3aNLFX0SyktrY2FouRyVHdeYqST+ph1D25ngOIKGLVB4/D3JDU6elNbElg0gqAvANBCEBhUL+D6QXMA0tEASDmm9Fcz8AkFM1PzpyagkE9VkgrpcR/7XY7z+aiJ1wNCtQ00NlsNr/fr55ElwZJ4vDF5XJlKofEong5/KKSA6rkeaVuEY3P6FYY1GTu3Ll33333vHnzpPGcRGlpKS3aof7IYNiXtcuopmEBAECoZ230JuPEAyTTn9vtTiaTvCcXJ3RoQs0mrMwudnqaVZLm/sSQAb1Kqn3vNbfVTc4UTYOkpiOoekJQUyumfSsBk0BXAxEIQgDGCekdJv1rF2DHewk6HA6ecYSsiGl9/NRzxoTX66VVkklgSIMAphIDxi8MejGLx0irsUtk/fqRmqweJUg30+12k4XQ/BVtQtydeBbdfBKEevZA9b8Oh6OioqKvr294eDgajYrDPvrrdDr7+/u3b9/e0tLS2dkZDAbnzJlDGQWl0hKJxLFjx2pqajT9hA2+qVwshMYCFYDJjJ7NinehaV0tBgYG2tra4vG4+KNWn9LT09PW1pZKpXiWLM1fpZ6FTZov0zvS+PTc0ewqxZ2aLqPGpkKThkQAgHkgCAEYPwyMPKlUSowVZIIfIzkN8vdoRvlF2PGT02VlZQMDA4cPH47H4zNmzEirrIyVoXonVU8tq7JD1MCZGiqlW5S2MjbBzVJ0GXW5XIqi0LjN/M1JJpMtLS319fXbtm0LhULcgzSRSCSTyWg0Wl5evm3btj179lx++eVbt249duzY2WefHYvFaK1q7iSmKMrw8PDcuXMXLlzY29ubtuF5AVIQAAP01IiehY33Y2KPMTIyolc+l3/RaFSyhqWVPZreCmnP1bMTmrxoWnKZJdQUrmrPCPRaAOQIBCEAY470Rtd8Q9PoX1xZgQs/0hJ8v7jAnaYkY1qDADq9srLyhhtu+L//+7+LL774rLPOYoIcZVqv1UzfsqTEDN7cmsUaH6O59KJe3bi3JM00mw+DoRPJEqg+RTPLqKZxlRgcHJwzZ05jY2N9fT1FQtJwkL47qtWqVavefPPNVCp18sknz5gxo7a2lo0aXROJBB2TTCbj8XhpaSlj7JlnnjHTEF4fKYrSAOPEFSYLAWDSIlnhbMfH9Kr7h4qKivnz52ua48RfX1NTE3m/09qGxi6gZmqoibHxsICWN9vx+WYM+iWYB7MD3TsQgSAEYDww0/PabLby8nI60ufz1dfXk6mqrKxMjAkpKyvz+/2MMS4gNcvnx9tsNkpq53A4jh49Wltb29zczA+j1Oc05sjltUp+TYFAoKamhqrNI0CycO8hXUQxNna7vbq62m63U1UNFC9jjFaqKC0tnT17Nv1r0lxJoZtNTU1S9WhEsnDhQirN6/Vqhu3xOjPGHA5HVVUVLemhVmUUF5RIJLxe7/Lly999990FCxaUl5fTUpPUXjHbBI/JrKqqYqPhN3oDNapDLBYLBAJlZWXMMKu7HhglAJAFeu6amkd6PB5xlUK19wF13eRWILlI5PcXatOJiDZuwlhjYOpkOjZYAEAuQBACME6IoVnqgD1SCHV1dfz4lpYWGtPX1dXx9YsZY7W1tWmzlRCiViHD1JYtW1atWrV8+fIDBw588MEH8+fPdzqd5NOYl2Xr/H5/XV0dVSyXBSdsx0f0TZkyRa9AaShAUnnGjBl0cCAQML4QV9pcyzHGEokEP4BU6MaNG9evX19RUWGy/noL2bNRgyfdIrfb/frrr8+ZM8f4FH4iG3XKNT6S7Jn9/f0snfYWLRgGBwAAskBPqAwMDOzevdtgHUKiu7u7ra1NXMSVk9EP07yhT88NPot+YKxFGrqm3IGQBiIQhAAUBqkvJjV44403XnXVVSeffPLLL7983333fexjH7vgggv+/Oc/x+PxK664oqGhoa+v7/7776+qqrrqqqvMXOX111+/8MILzz777GQy+fLLL9vt9lmzZjU1NXV0dHz1q1+dPn360qVLOzs7+/r6fvzjH3/kIx/JsVFbtmz57W9/e+211y5btizHojivvPLKH/7whx//+MeNjY0mT7npppsOHz781a9+Ne2RfBacnEW/9rWvMcZ4chc2amG78cYbh4eHm5qaduzY4Xa7FUVRFIUCAmmDDHcUAnrs2LGXXnqprq7u/PPP7+3tDYfDpOLoMMZYKpXyeDzxePydd94ZGBj41re+tW7dOu4syo5PEJpKpRoaGrZv375x48alS5cuWbJkeHiYXE/JqZivSOH3+6kOZWVlLS0tX/7yl5k5CyH8rwAYC/TMerFYrKurSzxMc2geDAZ7e3vTeuAbYDORKVqT3DuBHE2a6o4L/RIAYwoEIQDjBLcHShts1N8yEoncfvvtt99+Oz/lj3/8I9+W5M3VV19t/tJ/+9vf+HZPTw/f3rdv3759+2j7wgsvNF+gMb/+9a/zVRTn3nvvzfSUrKc/RUHITYi33XZbRoUcPXpU/PoMSCaTTz/9tJkjN23atGnTpoyqYcZCaGCpwBQyAFmj/vVRf+L3+5ubm6V5H/G9QNuVlZW1tbU8elDPWd3g6gWPB85axemFxwMAxggIQgAKDIXO20bXMW9oaBgaGqJIs7Q+RWYwM0PMhyC5vHQzHa+MRZl6WRxMXig1ivojzdhFTW2vdwlNQxw/13ykpXhRPdtCRmYBqQQMvADIC3o/pfLy8ubmZskRlP9g+dqDVVVVdJhBL5HF1ccTzTpkEdgsAlNhvrDCEwKsAwQhAOOEOPXLtPri8vJyxlhfX59ooRq3uo3zFYsOzXA7KaWNmRJMlmymnExP1CMv8w4AADXSxA39DYfDfX19tMaMwbmDg4N9fX2241ecH4c65520OU41MbN4PQAgX0AQAjCu6Jl02GiSGLzwwDgjJtFheAIByCvqH9SxY8d27NghTcRwyz9fNefw4cNtbW2RSESd3HjCYN5INVHvAAAWAYIQgHFCnSZb8myE/wYYZzQ9bPEcAjCmlJaWUnCg5qdc+VRVVVVUVNCCQFIMIf9XfJVYkLSdiWgGtB2/8GCmRQEAcgGCEIDxwExUW9plJAAYC+LxeKGrAMDERNMlpLKykhabIaRcoFzsTZkyJRaLud1uWpGV6SwfzyCWAAA5k4eVxwAAxmiGDkohhSy3hfsAyJocczwAAPTQlGqhUCgUCqXt8MPhcCwWczqduaw8YXEmWHMAKF4gCAEYP1IC/F/+KWIIwThDD5sUQwgAGFP6+vref/99MXmYTYDv3Lt375YtWyKRCK08wY9kOgtaWJaxv6MAgFyBixoA40Rarx69kBIAxghyTpOSW6SOD1Ua90oBUPSoVZD4U/J6vZWVlXpr1fD9ZWVlNTU1TJVYWBP8VAEAuQBBCIBVgCAEBYGve6b+CLP7AOSOFClQVVU1d+5c3uHrabmmpia32+3xeFKpFF+enpcjHmnx3+lYrEkLcgeTCEAEghAAq4AYQlAQhoeHxX8xSgBgjKAfl91uTyQSaX9oqVRqZGREvQ6hOkn1ZPjN6olhAEBegCAEoACktFLPZfFSNzhlMgwRQNaQdcLpdMbjcXIZ5faKlImMuACAtOh5Xx87dmzLli2XXXaZx+MRD5N+dAcOHNi3b5+iKA6HQ/pVck1YFOoIFkIArA8EIQCFQVMTZlFIFh8BQG6iBulk8PwAMEYoiuJ2u9PGCHg8HgNHbm4bxE8VAJA7EIQAFADN17zJdQgdDoeiKP/v//2/yy+/PBqNRiKRRCKRSqVisZiiKLFYLB6PJxKJRCLBN2w2WyKRSCaTtMYxiQFFUcSFgCfw2gN84MXjcHg2P/5FiMcYFCXepWQySaMx8TbS4Ix/lK8miLUV68ynFWiDvlOy+PHvOpFI0INBD0k0Go3H4/Tv9u3b3W73/fffz4QZCgwxARhTamtrTzjhBJfLRf/qzQzW1tbG43HJTVTKRIqfKgAgL0AQAlBk0GjgpptuKnRFwIQC61wDMD44nU6arzE+jEtBmmDiO8Upm8nzU508LQWgIEAQAlBk8PfiyMiIy+VSr14FQEZI9lLEEAIwRpCc6+3tPXjwYCKRcLvdBgf39vYeOHAgFot5vV7RQsj0VyO0FJNQtQJQvEAQAmAVTC47wV+ufr8fL1qQX8yseAYAyBRRyMXj8aNHj/KP9IRTKBQaHh6m7NN6+UUnz+908rR03MD4AYhAEAJQxOQlM824YbCOFkfyjMqxfDNjJh4HaP6KJhsijvN4fTK9FgBgIkHhu01NTWl7gMrKymnTpjkcDimsF10HACDvQBACMKGQtEqxa48xbYKmXMz9inS6mO5FVIM51zoNBjWXPsrX2icAAAOkX73b7T7llFM2bdrEs4jp/egaGhri8ThjLJlMUgYpdU9i2QQzee9JJptFFIBxBoIQgCJDXIoqre2LWW+Ir+cfRfs1l9vKqAnGvlWaFxUxf0X1nL3m1zHOSTvNL01pUjcCALJDs8+Jx+Mul2vXrl1qLwPpyL6+vs7OzlQqxaMJpMxPagdvzf7NvOODXglZkHeTJmKbARhTIAgBmLBYfGQ/btVTj2nGyP9KkoViPsCCiHNpUQqTx1v5mQGgiNCcgqG/O3fuVBSFjIR6v7jOzs729vZEIsFtiZLwkybO9MhlQiq7+ayxc+ggYCfMC+jqgQgEIQATCusvHqBXq3zVNos7kN3wwtgWp/ZEVe8fa59ek+NF9fEAgLyg/nXTv9OmTUt7ZGVlZXV1tbhAheaUk+ZFWVaTUJpuGtkxRhZCAMAYAUEIwATEOu9OPRcmaTUtveMzxWS0niTDcolO0WyCZuHi+IyHA4l/x59xdmcFYBKiKY1mzZpF6UPVH3Hq6uoSiQStOaFZiHFqK8mhVPKcT5u2NJeeASlwACg6IAgBKG6k17YF4wY1p6sN6mkmh6ea7Hyo1LE3aa8oHmngYKlnElRX1cxFxwioQQDGFHF6SPy59ff3p40AHBgYGBwczOXS6mLN7Mxvt5AvD4ixqBsAgANBCECRMdYul3knlywFWTRKc7Y77ZHZXTFtW6TBkIF/V6aXBgBYGW7819Rge/bsURTF5XIx/R/+0aNH+cL0xtdSlyC5HtiOX/nGeCfLZILMfJXyApwaABgjIAgBsArJZDKLs0QXxKJQFHmvpIHo0hsnZeccpWmM1TuMD1yk1DJqFVoU3xoAICMkFwDpZ15bW2schMwYq66uHhgY4BllmH5WZBE9d03zBkOxwvny4c+lELGofJUGAJCAIARgIlAs78i0MX5ZTACrfS81I2Q0q6FZSBYXSnu8ehvz3ABMbLi/qLp7OeGEE/Ryh3IaGhooEylfh9B8N8WjlNXxhwbx2+qOMUcLYR5fTMXyjgOgSIEgBKC40UxAZ6l3ZxY1zK7+euUblJb17dIcPGkWrlnJ7C4KACgu9H7mvb29Bl0BabaRkZFgMJid5wjT72oMpBrvQi3YTcFCCMCYAkEIQHEjzQcT1rQ+aSZXGKMLmT84l+GF+Qw0AADA2bBhQyQS8fv9TGfKjDF26NChrVu3rl+/3uv1mgmHZqoOJ+sYQnUJ2QELIQDFAgQhAFbB5Exw0SWVkRjreo7bfchdSRbLVwYAyAKDkL+SkhK73S7tlP51uVykGMWAZPEwPWd4dVFMx2BoEENIO3Ps5cYihhDkC7yAgAgEIQBWIZfeGT17cYHvC4AJj4Fb5jXXXKOXLYaftWzZsqlTp7rdbnUMoUl/dSmjlXhi2p1mMM6zld9eDn0mAGMKBCEAVkFRlEJXAQAAwJjjcDjEhek11Y7D4XC73TabjQQh01linums9afpBWpsJ9SriR7jKdLgVQHAmGIvdAUAAP8/Gb3qpCUT4E4DAADWh/rqu+++OxwO8z1qGGNvvfXW008/HQqFuC2R+3BKzpzqd4dtFM3C9bCy3MrRfxUAYAwshAAUAM3JzlzWIcSbEgAAioX+/n69GEJOJBIZHh4mNagZQ6g+xTizcXbomeb0ZiHVmcMQQ2hNMGwAIhCEABSA3MMFxy1jJwAAgLzAe/6VK1dyl1G9SLxp06bZ7XaXyyX19nqvDz0TX46mv7RlqoMbx+KtBPUCwJgCQQiAVcjIQsijSvCaBACA4qKpqcnAQkgSq7KyMhaLMa3VIySNJwownkiG/1UfnyNiwIJaFlrc9RQAoAliCAGwCtnNqsJCCAAAxcW7774bj8dpW4wbZEKXfuDAgW3btjHG7HY7Dwg0WHbIIE+M5hoV2UF1SHstvJgAKC5gIQTAKmRqIeTbePUCAID14dqpu7tbbw1ALt4GBgb6+vri8bjD4dA0ykmo845msZKEScbzWgCAcQCCEIACoBlwn5EgzHvIPgAAgPFh4cKFfFv0CBWPmTJlSiKREFen4BiscMiO9xpVe5Zm/b7QfOnoXYvptyvrq+NNB8DYAUEIQAHQzAdD6xCafOdpqkeYCgEAwFJodumzZs0SF5PQPKW+vt5ms7lcLkVRRCMh01JHXOypYwjzJcz4a8vMtXK/nBrxuvkteXICgQ1EEEMIQAHgiz6JPXIikTBzLp0iuYwiZgMAACyIuNAf37lp0yaaAWT6HXhHR8eePXtSqRRXg8ZWOL4EkZRRRjwrlRsZXYsJ6jF3bKPkpTQAgAQshAAUDMmBJ2uXUQJvSgAAsCxip33w4MG0hruenp6urq5YLObxeMQS9HSR+GlKyPnJdHxScmlC2mvl5XKal2Z42QEwBkAQAlAwpLeaSQshwdUjXo0AAGB9xL56zpw5krhSH1ZXVzc8POxyudRFaYpJKcUL04+7y+6tITqFmrlWfn078aYDYEyBIATAKmSdZRQAAEAR0draahBDSOKqqqoqEomw0VVnjcWV2jqnttTlJYZQnU1UfS3+L1QcAMUCBCEABUN6d5KFMO2UqhRDiNBBAAAoCnhvf+zYsUQiQZpQrw8fHh4+evQo05JVYn4XtV1O+qtZQo6tkF5eY3ctAMD4gKQyABQGdYh8LBYzf7raZRSvYQAAsCZSb79p0ya+MD0/QDrl0KFDO3bsCAaDogCzHb/su9j/6wUWjsWrgVeDasK38RoCoEiBhRCAAqD51jTpBWq326WDoQkBAKCImDVrFvXkHC75uKyqrq6ePn263+9nggDjmlA8SypBczsj0r5K1BbC8QR+MXkBAwYgAkEIQAFQv/vZqMYz+apDDCEAABQd1OF/7GMfCwQC4h7xAHoLLFmyZObMmU6nU1J9kjFQc0JQ2plSLRJojMGRajk6ProCIhCAMQWCEIACoPkKHxkZYYxVVlaGQiEuDsUDHA6HzWYrKysbGhoaHh5uaGgQj1G/m/EGBQAA6yDGEMZiMbfbzfSzjA4NDfX09JgpVvQg1bMT5gv1ayWteoQlCgDrA0EIQAHQfE/ThHHaEUAwGGSMkR+RVKAEXsMAAGApqK++9957zzvvPINjbDbbO++8s3///qVLlwYCAYPEnkzHNsjy8QowLsFY7I2R/RDvNQDGAghCAAqAZMejYBKbzXb22WevWbNm1apVzzzzzMMPP3z22WffcMMNAwMD1113XU9Pz4MPPlhVVXXVVVf19/dXV1frFQgAAMDKeDweRVFoW28dP4/HY7fb07p6igEIfCc3zemt525GrYnZa8xUQF2ZPGpCvOMAGFMgCAGwBKFQaGhoiCQfY+zDH/7wN77xjcbGRvr0qaeeikajTU1NjLE33njj7bff5oMJAm45AABQLKxYscLr9dK2GJInSrjp06czxnw+HxOSyjBVQlG9pGLiyhOStNNLSapG7zDxjWNcGUQuAFAUYNkJAAqA5sxrMBgcGhpiowsS7tu3jxahYowdPny4o6ODMZZMJoPBYG9vLx2jLlNMBQ4AAMCCSClGmVZGUIfD4XK5mImwPfUKEOJ+JqxyJCUp1SxEeonobRt8JJaAmUoAigIIQgAKgHqC1ul0xuPx/fv3x+Nxp9M5PDy8c+dOChdkjB09evTAgQOMMbvd3tvbu3//finLqPS+ly4neu8AAAAoLNu3b5cWnlX3zx0dHfv27Usmk3a7Pa1tkH8kHiOJTEmzSVe3aaEukO+UPEXVh6klLgDAssBlFABLkEwm3W63w+FwOByMMafTSXPDhM1m4zPKdrtd+lRyNNJ8DUMTAgBAYeGSaXBwkE/q6U3hjYyMRCKRtBY2KWxPiuVTvxrY8SqOHa8YmeoNIhUobbPjX0A2rdhFAID1gSAEoACofWlSqVQ0GvX5fFz4iZ8mEgnx7ZtMJtWvW01NiBczAABYjWXLljmd//8ATFOGMcamT5/u8XgYY9xIqKnK1HqP708dv5C95sEpw/hzSUOq0XzpSOWbuyVpwIss78CbF4hAEAJQMMQ3HH+b8nd/IpEQJ2550GAymVQURZpdNpi+BQAAUFikDrmiooILQr3DAoFASUmJpmBTa0JJLxk4l2pWT+8NojY/ivUxPktdjVzAGw2AMQWCEIACINkGaYOUHvft5NtsNM0MP97YPGhwLQAAAAVBlFJbtmxJJBKiJlT7bR46dGjnzp1r1qzxer1pPTalCxk4cKZ1G9F8ZaglJS9ZbRWUXnB5eQfBQph3MDYAIhCEABQATSOe0+kUX6iiICR9qN4WS+Pb6OUBAMBqiD1zZ2entA6heBiPIRwaGlKLK7WiUzubSNpMfQnNszR1o7ETiqQJ1b6p+QLvNQDGFAhCAAqA+t1GYYF8Zpf/S59K4lDttGMAPEgBAKCAqCP3li5dysPF9URUY2Ojoihi/jCmyudp0P+bDzg0IGtfU8m5NHdgIcw7GBUAEQhCAKxCIpGIx+OUZZTepjxQUMwiI2lFdcyGZiwH3qYAAGARqqqquL+oFATI+/CqqqqRkRHGWDKZ1Bu7G1gLNX1KNQMLmZauY1oC0thbNe+JZESgXgAYUyAIAbAK4ryvpPpEcWiz2TSzjOqVmemUMAAAgHyh2Vfv2LFDbf3jx5PQOnLkyJ49e8466yyPx6PO5mJgu5NiCKWaGLwU9Gx6esGBBiVL+9VlZgrmNPMOhgRABIIQAKuQTCZJ6ZEypH/5R5KFMG2eNw46fQAAKBSaPXBHRwfv3pnQgYs9eU9PT3d3t2bQoJkrql8HetviKepoQDpAqoA4fWlccr7AiwyAMQWCEIBCIkUGSgpQfBlLFkKDohgmUwEAwMJMnz6dxxASqdH80rzbr62tDQaDmoa4tOqIl2Z8gFSs8ZHi+8hk7OKYgtdcjkBjAxEIQgAKgGaQBjveM0cUgeIpkjcpP0szVR1emQAAYBF4Lz1z5kwShJpyizZqampisZjD4eCL0/JyzE//qZ1CNY9Ja07M9G2i+V7LBfXVoWcAyCMQhABYAu4jyt11xEQCaeWf+mWJ0EEAALAmw8PDNN+nl6CFMRYOhwcHB51Op2Znnjb/J0tnymOqKUiDcgwK0Sszv6jfhpjuzBGMDYAIBCEABUAM0hBjNqQOWvQgFa2FapdRvVh/9b8AAAAKAu+od+zYkUgkpJ38X+q0jxw50tbWJq5fn/e4gLF4O4yRKQ8vMgDGFHv6QwAAY4NaxUmqT3M+WDMFeUpgDGsMAAAgZ7xer7gOoWbX7fF4fD4fX7+ewaQDABgzYCEEoGCktBZx4llGpXc/HxZktOwEAAAAq7F48WJu91NDnf+MGTP8fr/L5VIvMlFE/X9+RWymCVcBACaBIASgYBjHAYpuoup1JgAAABQpkUgkbRBgLBYbHh5mjBlklLE+emsbZl1avooCAIhAEAJQAAySBKh9RwnNpSY0zwUAAGApJFH0wQcfRCIRzYXp2aiIOnjw4J49ezTjwyeh7+gkbDIA4wkEIQAFQPPdRsGBaaeNNWMIjU8BAABgHfTSgElThPQv7/MNUpICAEAuQBACYAn4i5/v0RN+mjsn88wxAABYGXX/PHv2bJ/PJ+2UaG5uFmcJeeIZY38Qi7wCTK5DaL628H/JOxZ5VIBFgCAEwIrorT9hfDyyjAIAgDURe3VxdUEy94miUVyNlnp1npJULEo6kZc2pq0AAExIIAgBsCjSe10cTOhlGcWEHwAAWArRrMfZs2dPPB43jiHs7u5ua2uLx+Nut1sqRJ13VLyWFTD5MhKFrlr3ZlEgACA7IAgBmAjAZRQAACwIGfEkRRcMBtVCTvIFjUajjDFFUcznDCu6/t86ChaASQ4EIQAWxfjVrmk/hMsoAABYEKk/P+mkk8SPNPvtGTNmJBIJbh5kgm5Ur0JkWSlonP/G4CPJWohXW96x7DMDCgIEIQBFD96UAABgZSQLod1udzgc4kdsVDtxfZhMJkkNGqzGzj8qoreAgV8oAKBQQBACYF3S5pKRwIQfAABYEEmw7dmzR7N7Fw/r6Og4fPiwQToZdbEThonaLgAsCwQhAEUPdCAAAFgZqZcOBoOJRELzIzYqh8Lh8PDwcCwW83q94pEmV3QoatRWxInaUgAsAgQhAAAAAMD40dDQ4HT+/wMwPWtYTU1NMBikbc3MNCIWNKnlV8Kp227BJhcX0NhABIIQgKLHYIEKAAAABUTToCcKQsnux8MCfT5fVVWVy+VS52XRXHvQUj2/mOEsi4qpT1FLYku1F4BiB4IQAEuQy2Sn8VgBAABAodDULcPDw4qikCbUW1k+EolEo1GHw8EloliU3rZFyL1K6mUJ9crEKy87LPjYgAICQQhAgeGdcqYpZDjS/DF6eQAAsDK7du3iHb5eDGFPT8/u3btjsZjH4xH3q7et3OcbLzuRVstJS26oERfhAABkDQQhABMBTJECAIDF4dKlrq4urdQpKyurrq52uVzJZNJutxtkFi2i/l+9SIZoBuTb6hbpRQ8WUdutBoQ0EIEgBAAAAAAYPxYuXMjXIRQRJV9tba2iKHa7ndsSjcWPwXKFlsJms2kuRSjpE9LA/F+EygMwpkAQAjARmNhrUgEAQFEjCZjBwUEpRkDdh4fD4ZGREUVR+Lma/TzfacHUMmkxVn1MaA7fIEspXna5U1yPChhrNCZpAABFh5jSDQAAgKWQuugNGzYoisL/lYLA6d+Ojo6dO3fGYjGumtT9vKiXLBhNp66wZBuUMseoLYd6EtF2PPmsNACTElgIAZgI4I0IAADFQkVFBRc/kt2PRJTNZvN6vYFAgGeUUR/JitArxFgfSh8RmicCAPILBCEAAAAAwPixePFil8vF/9VUO1OmTKE4Q55UhvaTw2TxTgKqYwX5fnE7NYrmWXAcBSC/QBACAAAAAIwfwWAwHo+TJtRTd8lkkmII+RL2xWUb1Fw+kYx+fI8UQyi5j6r9S3nJrBjuAABFBGIIAQAAAADGj23btolJZSR/Ufr3wIEDu3btoqQyxSh+NOusjoGUwiDFIw1ajdBBAPILLIQAAAAAAOOH3+/ny06I9i5R5LhcLrfbLcYQTgBE8yA73gxo8BE7/v6I20WqlgGwGhCEAAAAAADjx5w5c/QcQbnamTJlCikiKYawqJHygtpsNp5tVYohNKn0JsZtAaDgQBACAAAAAIwfkUiEb0uuj6IQikQiyWRSlE96SVYsiN66iKLdz2azud1u8V/xMINVKGAYBCC/QBACAAAAAIwfu3bt4jGEXDiJkYQ2m62jo6O9vT0Wi/l8vmLMp6IpWSULoegmqg4LFG2GeuUXdcJVAKwDBCEAE42iGCsAAMDkQRItIyMj6o/4BvXhiqLQqvTjVcf8o1ZrapdR0U2Ux1XSiXqSUnSsHcPaAzCZgCAEYCIAEQgAAJZFEjBTp07VW3KdH1NbWzs8PFzUglCNlDnG4XDwf6Vtl8slrUMIYyAAYwcEIQATAbwmAQCgWJg6dapkGFRP6lVVVYXDYdJFtMeyEXTmX0BkBhTbLmZblTKvSm60TLUUIQcGQwByBIIQAKswwWaCAQAAaNLZ2ZlIJCjRqCRmuObp7+/v7OxUFEV0qmSjmUiLQvyoKyn5gjqdTlEciplX6SOTr8WiuBsAWBkIQgAKTLG82gEAAOSFffv2ae4XXwednZ0HDx4kH0vJPmZBjBeRF7fF9KHiWaItlEyF4mIb/CaolyIsosyrAFgWCEIALEEubzK8BQEAoIiYMmUKt4ZJ2TK5AbCmpmbKlCnJZFJypLQsJqunKApfezCRSHA5F4vF+LaiKPF4PJFI6EVaSte1vmC2IBZ/nMA4A0EIQNEDGyMAABQRM2bMSHtMZWXllClTbDabuDC9Na1hUqSftF6i+GkqlZoyZUpZWZmiKA6HY/78+fF4nD6tqKiYPXs2Y4xW2mhubnY4HNR2sSjNcEFL3Q0AihEIQgAmApgZBQAAi8N1S0dHB98pKhzRBzIUCnV3d4sWQrGft1Sfb1KPpVIpt9tdW1vr8XhoT3NzcyQSoe2Ghobu7m7GGC1V39zcXFtba1yatAEyAioaiEAQAmBdzMfT440IAADFwvbt2xVF4V6jIrwz7+rqamtri8fj4mEWHMSLpkvJiCeuG8EYs9vtdXV1P/7xj6uqqr761a8ePnz461//ek1NzZ133skYu+WWWx555JG77rpr0aJF99xzz5NPPvnAAw9w06gomDkWvBsAFCkQhAAUJXgvAgBAkTJ9+nS9ZSf4BF9lZWVjYyMTggLETKQW7/PFdSPEIMmKiopbbrmFMfbf//3f/ODf/va3fHvx4sV8+3e/+93nP/95OpH/Fcu3/n0AoFhAmnsALAqMfgAAMCGZM2cOdwTVo6qqaubMmT6fryjeBbSYhOaygZKdkDHW0tJSXl5eWlrqF/B6vT6fLxAIlJaW1tfXM8buv/9+9VX0rggAyAVYCAGwKMYTn5gWBQCAIqW7u1tSMuouPRQKDQwMKIqi/qhI+39u0BsYGBgcHDQ4MhwOM8bq6ur4HnHZCb3UMgCArIEgBKA4EGde1bGFmCUFAACLwwXM1q1beQyhXuLQw4cPf/DBB7RwnzqdjOiNOc5oijF1flGO5BPLGOPLThhTUlIilWNwFQBALkAQAmAhxDWXxEGAqAA1RwCYKAUAgGKBXCIJvd67urq6pqYmFot5PB5uFpN8Jse8olqYzymq3qBz0wpCOkX0qlWvbKH+CGQEhg1ABIIQgAKgnhJWx1roveTw8gMAgKLmhBNO0FxyXRyjV1dXt7S0OJ1OvvKEZqZNiyCaAfXWIcwUWn/C5KUBALkAQQhAAdB8gdH4QEo9p3mYmfcrdCMAABQQA6ESi8WSyaTxYfF4PB6Pi+4hlu3VDSL6NOtssiEul4s21CVLV7TsnbEyENJABIIQAKsgrdckveGM1yRUmxzR1wMAgBVQ98/79u2TunT1MceOHTt8+LCYS1O97oJ1kBSanoTLCK/Xqz7Xag0HYGIAQQiAVZDcgex2Ox8xpB0HcHcdTJQCAIDVkPrtkZERbiHUIxqNRiIRaf16y+ZTyahiJo+UXEYlr1T1RwCArIEgBMASqFPGSeqOh9cjyygAABQXkow58cQTxS6dHe/9SNsNDQ2JRMLhcKgXqLBIh69ZDT1tpk6UmserW+SGFBdQ0UAEghCAAiOaBPlOUn2a0SMmYwgBAABYk8bGxrTHVFdXK4pCvT11+0UhgQwqlmmduWlUL7equCYhACAXIAgBKACaibN5olH1BLAoDqUVKQhM9QEAQLEgrkOoGW5ns9m6urr279+/cuVKg9wqRUQWalb0lVWfZeWcqwAUHRCEAFgFUfVJ5kFJIuIVCAAAxcuxY8ckeaPWSENDQz09PQ6HQz0DaE2bmGbOT/OpR9VIghAvPgDGDghCAAqA5otTjCGkbc0EMwggBACAYoR36XPmzOFqR+rtOTU1NZFIxOl0aqpBK6sj8UUmxcZnhLgwvRppqUMr3xAArA8EIQCFRMwnLq5DaLfbJUEovmIlTSgWMp6VBwAAYAZJsbS0tKRdYLCuro4J8q9YYgjVqNVaFhbCtKGJRXRDLAIGDEAEghCAAqA5nSkqQEn1if9KWpGfO5b1BQAAkD1SF71v375kMilOAjLhvUDapr+//9ChQ6eccoraSFjs5NgcvO8AyDsQhAAUAL0sApJJkP/rdDpjsRg/V511RjMVDQAAACsg9fmHDh2SFhgUk4rRnoGBgcHBQXKbnABekeIbKgsLoeSGmvfqTUKK+nECeQeCEABLYB+FSzuHw8H7a8kk6HQ61V6jDP07AAAUA62trVKAnLr3rq6ujsVidrs9mUxOzr5dHTDP8JoDYGyAIASgAKgnOHnwPXci4tv0r7giE6ZIAQCgGCE9M2PGDGlhev4R/7empkZRFOl0y4aLZ2TANPn+0hSEAICxAIIQgHFFnVCOvxqdTif3C7LZbHoWQhKHmiUAAACwLNxtsqOjQ28dQn7M8PBwMBjU7N6t2ecb1yoLEavOu2NBJQzAxACCEIBxwjhBHPf51BSBDoeDTydrZqOx5vgAAACAmo6OjrSddigU6uvro4xikhWRZWKRyzH40OB0HuAghjhKqXHyNXcplSNZU0EWQF0DEQhCAMYPUezxnfyVJi42KFkIJWuh+K9YoLSS4Vg1AwAAQCZInX9DQ4PL5dI7mHry0tLSiooKPbdJ86P5HMf9BqeLsevqt5vBiVlkQRPlpZlLAAAyAoIQgHFF7xVoG11+kP8r6UNJK+qVCR0IAABWQzKX0RqDxvh8vtLSUv4vxA8AYOyAIARgPOC2O3FaVHR6obSifM7Y4XC43W4uAl0uVyKR4GdpphgFAABQFFRUVNCGQYigz+ejwybGwus2my2ZTOZyeh4rAwCQgCAEYPzgk8TqFzzJPL/fT/86nc6SkhK3203/lpSUcKugz+crKSlB3CAAABQd1G8PDQ3Rv3ypIekAxpiiKGImUosrIs3U2bSRTCZTqZSiKKFQyOPxjHvVAADpgSAEoACoX/+pVMrn802bNo0fMHfu3MbGRvp39uzZ0WiUtmtqambOnBkIBCRhafHhAgAAAOqud+3alUwm+SJD4gE8KKCrq6uvr6+1tVVKTG1NDGoozmZmVGYuFkUAQEZAEAIwfugtIUhqsKKighyEysrK+PzxrFmzQqFQZ2cnY6yysrKkpKS9vZ2plq4CAABgfUjk3Hrrrbfeemuh6zLelJaWDg8PM9OZsSEIARg3IAgBGFfUL0KKrLDZbAMDA4wxh8PB1SBjbN++fXy7v7+/v7/f5/OFw+H+/v7KysrxqjUAAIA8wEXOjBkzOjs7aYqQnCq5xwdt2O12ejtMmOgAUoPMdDykKAilCIv8VgwAAEEIwPihloLivxQx6Pf7g8Gg5ul0fCAQCIfDvb29JAgnzFgBAAAmNmKfPzIyEolEDA7mcmiC6R/z7yyeSo1NuJsAgNWAIARgvOHJRaXYP4q2j8Vieu9L2h+LxZgQlQEAAKDoMO8POWln/dS3CAHzAIwREIQAjB/iOhPiNkEJBtKOEuiAkpISsUzC+pnoAAAAsOPNX0ATRVGkPXjBATBGQBACMB7w0EH+PlOLNzL6mZwMFsvR2wMAAMA6aC4vAfQgdxg1mPoEIO9AEAIwTqg1obTtdGbwe+Quo+r3It6UAAAAih09IyrecQDkHQhCAMYV9awwf7eRIEz7qktraQQAAGBxYCFMC7cQ4jUHwFgDQQjA+GH8SsvOQsiOH1hgkAEAANYELqMZEY/HxX817xiEIgB5AYIQgAKguaRSRoIQb0EAAAATGEkQ8kxs4nK+0NVZg1EEELEXugIATFLUfTFlGTVJRgcDAAAAxUU0GuXbfKEmBhEIwBgACyEAhUH9SiMLYdpXnXFmGgAAANYHqsYAeqmJglDKyoaoQgDyCwQhAAVA802W0euNWwjxUgQAgImKzWaz2+0mk40VO9RMm83m9/sHBwd3794tHaBexRdvQADyAgQhAFYhuxhCTJQCAMBEJZVKqddnn/AMDg6y0RhC/oJT60DaVi/GCwDIFAhCAKxCRi8z6R0JAACgiDBp01uxYsWDDz5YV1e3fft2h8MRGyWRSCQSiVgspihKQiCZTCqKkkqlkslkMplkjIl/844YzS5FtvN/+aWTxxOPxxVFobZEo9F4PB6JRKhRg4ODXq/3oYceYsdnkbHZbGrfUX7FiWEmHTcweAAiNvx+ACg4yWTSbreHQqFAIOB0OvVW4yX8fn8oFIrH406nEz4zAABQFJCwiUQiXq/XZrMFAoGRkREzZ41D3SyLoii2UdTuMFiIAoB8AQshAAVAU8hlnWV0AstC6X1v0EYpF3lGd0PT7dZgHCb66xoUa/IwAADQY2RkhKSj1+stdF3GA/F1RsGTkiVQs6uHnTALJuSYAWQNBCEABUCzIzYpCCdV1IT51vFsBHm5ikFkpkmNKn5NxjrWfK0AAJMHkj3BYDAQCHg8HofDUegaFQCxG1Sv3ztJ3oMAjAMQhABYheyyjOKNqEdG88Sa1jy9jHZSyQaHpf1S8K0BMEnILgGYuPQCL8f86aIxrVjg3qGava7mfnSkAOQIBCEAViHrtebz9S7MYtxg8tLZlZzLOEYyGIpDMfW2uOQxS9cotdjTdFUVD5OGLHpxL0U3bgMAZI3J3ztlZJkM/ue8D5S0H+8/NWc/1R04MAlUNBCBIATAKmQkCMeiKx+714NmyWndMnPRSFLAicG25iVMzkZrJr7TC24xbgsGNABMKkz2t7FYzPzBaoqiY+GiTuw/NXtU9U5pLq8o2guABYEgBMAqWOGVb6YO+X3jGrtlGmg2Y6SGSDPK0rZe+Rk5fOotBJJ1E1hWt8LMncylSgCA8WSMlouwFMazZnq9t0E5AIBMgSAERclE6vct5bYxbjfWpFtmLlXSC+ejbbUnp14FxALVGQ6kcBe9auTShIzK0TsFWfgAsBQmf4ZkIczolImEcZMt9fYEoKiBIAQWxfxrwDhPo2XjtfL4JsvvS9HYkzNH45Ja6RlbsVhWrVM7doohhVzCqU152eWhkeIV9WqiGQCjvmLahDSSuNWskkmMpWwWBQIA8ouiKHwbv0cAwBgBQQisi3GAmebwWn1kptFr44ZY/1wqk/bc7MSbGT/DLOSH3kfGX2JGVxHPEs13en81L6RpPNRLD2OgaUV1Z2CK1GtvRt+CeZmtZzvVq0nBZ08AmBhk0dWLgpBjhVcYAGAiAUEICoyZTBvGA+LscnVYZIybdlCeFjNBZQb6QTrMvCenmUtr1lYyrKlTAujVISPpK15Fz0KoWQe9Yo3lHJeXohA1H7CnGXZofLD0E8huWsG8ss20ZACAJpn+mkSXUQAAGCMgCEHhyfQFKYmoSe4yalyOuplpG66pByR5M543kNfEzBU1XVI1bYPMhNIzlkbizeFn6W0zwzuv9zWl/RY0C9GsRhZiL6M7DwBISxbdvphURvol4ocJcgEzfUAEghAUDE0rn6Y5y2AUa3JQa37/eKJpDcv0Ha829DGtO5YjeVSAkoFRqqSmW2Yu5i/16SZdJdM6UopV1bQHqverz5KambZF6hGhZuvU23qYkYtWmEABYIJh8jeVSCRyOR0AAMwAQQgKieQ9KG5ruv/poSmKTDLOli7jPWYw01i1W6b5Mb1aL2kKJOlTg8oYN8Gknyoz8U1pii71VdI2TXO/5rak7sTyjQ3X7HhhLNVNtGGaqapoMFTPs2gKYE0DuxVmSQAAhDijBAAAYwoEISgwBi52TGtsrSdL1GWqR9LGwqZI0fRL1PMJTCuQTF4uLypC9Eg048SY0YU0v249UWdwuplqqM1oevfH4J5natkTj5RkZEZoykLj6gEAcsek0hNdRvEzBACMERCEoMDk4u1mpkyWbuifd7Ibl2eNSV1hYI9S72SCyJFKkC6ndomULqdXYZNumTmi6ZasLl99OckP08yF6BSDqzBBuYn/am7zajAT34L6UwPnT16ycVEAACswGRamBwAUHAhCUEikYCpNGSANYTMSEpLV0dgamUsT1MVqHqnZ0jxWQMKgmWrdqFmOpqRhWnLCvFeqgcFW2s7RXUrTQ5KZUIN6O9NegmlFBqbVXWlNtQYlGNxDk8drfh2QiwCMNVlYCAEAYIyAIASFRBq8Sv5vmsebGc1rfmrSWJQLmh6D6gP0FEh2g2/js0Sxx61Ymtuap+htSy3Vk5Rp62Z8800qTM0Txeqpq5ppacZfqHSMsZrSMxuy48WkwbegnvXQrKo0F2D8hfJzzQt7AEAumOyL8GMEAIwDEISgwGgOqSU0nQzV3nSTE5PjfvUpZiSopqAyMLRmKmvTHmx+zKQ2yqkLSWteNmnH0zxRsmBrmjf1lLN0nw1stpr1z242QV1tsTJq51LNSwMAsgMWQgCAdYAgBAUmrW1qMriu2Ww2RVGczmx+jwa+oJqkjvdclY6X/AbF46XTmTCgKfh3pDZ2ZV1IdodJalkc6qmlsqaVT5LZBpUxGEeq/T81dakZpJs5sX+AAFgWCEIAwDgAQQgKiabRie9PpVLJZDLrEa314c1UFCWRSJSXlzPT08Z6pYloWlPVClxzxK+nXiSxoT6gUEgiysBDMmttI9nuxDsg3Wq1QjbQ7ZqaXF1P6RLitsEezVZr3gFNO6oVvlkAJhJc4OHHBQCwDhCEoGAYR0mlUim73W632wtbSeuT1l6khjsKZnc5SbFYKupMUmKaQigLTah3vIFJ0OQ9UftqGhxgBr3jzTwnkuctrIIAjB1Zu4xaaiYOFC/o4YEIBCEoPAaeftdff/29997rdrtLS0vdbrfb7fZ6vW4B5yh2AcaY3W5Xj27pzZp2CJ5dExwOB/2lq9vtdqfTabPZnCpcLpfb7Xa5XB6Px+Vyeb3eyspKp9N50003ZVQlRVEURXG5XOYD7ZLJZDKZVBTFZrPxGpo/l5/IfVytMCjhsXDSHlG4Sr7HZtSO5MPJNyRLmgRXg8lkkv7SU0ePhMm7TbdaURTGmMPhcDgc5mdGkqMwxvgXZPATE2tFJzocDrHJ6rth0PzxgaqXTCYTiUQ8HlcURdOPoODDHWMf5hw9nIF6FkbzgPG/vWrrOnWY9JT29/fPnj3bfGmiIByLlxcAADDGCj+YA4CjHnZPwqGS3W43Dhpxu92xWKzgv9x4PC4JwrTBb2OEKP8kJaMp6pggCA1URHZt4ZUhZZV1owoF1/zqr7XgjxxBX0oymYT7ACheaK4wkUgYHEPvgoceeuhjH/sYHngAwJgCCyGwEJJVh3YGAoF4PJ42sMqCpK2bZNSiSMK0w26Si6tWrTrzzDNbWlpOOeUUh8PR2dl55MgRp9NJxiVuYopEIiROpk+fXllZuXPnzj/84Q/vv/8+Y+yiiy664oorSkpKDhw4cPTo0WQy6fP5yF5ks9kSiUQymYxGo9XV1S0tLV6v99FHH/3d737HGPvhD3/4hS98obKyUqqq2nly3FBHORp4ThpHx2k2SpSRZPpjjJHk42JJ+rodDkcwGPz2t7/9q1/9yuPx/Nd//deKFSvC4fDu3btjsZjT6XS73fwSqVQqHo/H4/FZs2Y1Nja2tbX9/e9/f+mllxhjq1ev/tSnPlVfXz8wMLB///5UKuXz+cgszF1/yVpbW1s7ffr03t7el19+efv27f/4xz8yuofnnHPOP/7xD72H1iJqkKMoit1u/8Mf/vDZz3620HUBIBvIBSAtehZCAHLEysMnMP5AEAKLwidEw+HwpEqzlvaVTwfs3bv3zDPPbG9vP3To0FlnnTVv3rylS5eOjIxEIhHuMRiPxx0Oh9/v93g87e3tTz/99BtvvNHZ2Unl9Pb2vvjii/Pnz1+zZk1FRcXAwEA8HudXURTF4/GUlpY6nc6dO3c++uijW7dupY/+9re//fu//zsbVUQFMQlm+qnaxmXsDKmXgiWVSvF5elKD6mM4fX19v/rVr+is9957LxaLffjDH77iiivC4XA0Go3FYlRUKpVyOp0ej6eioqK7u/vFF1984oknjh07RoWEQqGXXnpp6tSpF1988apVq6LRaDweTyQSdOdJwHs8nkAgEA6H//nPf27dutXhcAQCAaqh1+uNxWJ698rr9Q4PDzPGWlpannvuOb0bIirewg5JpW/trbfeYowFg8GSkpLq6upgMKjO2KGusJkm5PhU0+3i36/mFem7S42Sy+UmJ3xOhOceU08XcnM9y/fwN+2MEn8AyFnUfAkGWMdQDwCYYEAQAmshhmAVui6W5qMf/egPf/hDxtju3bttNtvUqVMZY7W1tXrHOxyONWvWfOpTn5o9e/ahQ4fa2trOOOOMnTt37ty5c+nSpcbOSMFg8Pzzz//lL3/p9XrvvPPOvr4++poK5RKpN7Djwz7JfZTQNP3xAtWDckkCiT7MXV1dZWVlfr+fP6iiduLn2my2devWfec731m9enVPT8/mzZunTJnS2tpq0LTa2tpgMLhy5co1a9b09vZu2bLlzDPPPHjw4MaNGxctWuT3+43vTG9v74c+9CG6hMfjicVixvMp1LS1a9c+88wzK1euZMdnTJWUYQGD9ER1J34Rra2tN954I6nfoaEhcUbDChibgEwaiECRwoVojojPSdqwSQAAyA4IQgCKDBoHHDhwgDEWi8XmzJnT1tZ21113pVKp1atXz5kzhzEWiUQcDofL5Uomk48//vhLL710wgknfOITn6ioqGCMbd++nexCJ5xwQnd39w033BCLxb74xS/OmjWLyiSPxEgk8qc//WnDhg1r1qy5/PLLvV4vY2xkZGTTpk2bNm2aN29ed3c3959kowMXvdUUMx0bGQx3xIumUqlEIlFbWztjxgy73R6Px/nEPNNZ8U+zfMkMKO7nnqJU7ODg4I9+9CO32/3Nb36zpqZGjPlUC6d9+/bt3bt39erVNTU1ixYtevjhh2+//fZVq1Z98pOfZKNpgch39L333nvggQecTud1111H8v7AgQPbt28/88wzp0+fzhj79a9/3dfXd+aZZ55zzjmMMYoj9Xg8jLFt27Y9//zzPp/v/PPPnzZtGlXVvN7o7u5+5513ent79W4IO17o8rs0nsYKzedhaGho48aNtE1PBewnYIIhxhnqdVMAZAHmFIAIBCEARQZ14uFwmDGWSCTcbvfMmTMbGhra2tpef/31vXv3nnvuuSTe9u3b9/TTT5eUlHzhC19obGwkNUhwtXDqqaeeeOKJb7755mOPPdbQ0HDJJZf4fD7G2Ouvv75hw4bGxsYbbrihtrbW7/criuJwOJYtW/b1r3/9b3/729e+9jWv19vT00PqMRqNKori8/mi0SilJFEb1jKCq76UkCFW/JTkX0VFRUdHx/bt2x0Ox9atW10ul3gYNZP75rHjJQ1HL3+MaJii7ba2tgcffPCb3/xmR0fHQw89tHr16gULFpAmVEcS0r/cY7Ouru6qq65avXr1hg0bfvnLX65Zs2bJkiUOh2NwcPDRRx8dGRn56Ec/2traWlNTQ8dTVCFtT58+/brrrtu7d++GDRtuv/32j370o01NTYyxoaGhJ554gjF29tlnt7a2kgkxHo97PB6v1zsyMmJy1BgMBumZkdpuOz5pkPrOjBua35HX66UfAj9mfCsFwJgjWQjVUzMAAJA7EITAKoj6AaSFRglchPj9/oULF86YMWPDhg133HGH0+mMx+Nut/uUU05ZsWIFncL1CR83UxBgRUXFeeedd9JJJ/3jH//46U9/Wl5eHo/Hg8Hg+vXrly1bxs+ljfLyctr42c9+VldXd+zYsRkzZkydOnX//v3t7e2BQCAUCtHBXq+XxGF2flMm3YZ9Ph+XBHQ3jh07ZrfbSVY5HA7RfGfgNaoZOMeO14SMsWPHju3bt2/KlClTpkxJJBLPPfecx+NpbW3lmlAsn4QoN5mmUqnS0tIFCxYsWLDghRdeePbZZx955JFAIBCNRltaWq655prS0lLxdClPaUlJyZIlS+bPn79jx44nnngiEokkEomKiooVK1a0traSjGdC8K3P50srCPk3ReugMJVPJtP5SRYkcFQzc09JSQk/YJyrBMA4oGchBACAPAJBCKyC9KozyAkB2PGrn1PGRbvdHggEzj777AcffPC3v/0tY+yRRx7hapAyzTidTjqeTE82m40vdldXV3fNNddceeWV999/f1lZ2d///neuBhOJBPfD7OnpoZ1z5swJBAK1tbW9vb2vvvrqokWLli1bduDAgbKyMrqc2+2WrIVZN5M3QdygYh0OR01NzZNPPqk+/sknn7zgggsM3Aj1ssjwnep/V65cmUgk7rzzzquuumrlypXxePypp54677zz5syZw6UvvyJfFZOgFR1I461du3ZoaOhjH/sYY+zyyy//7ne/y4+hHDNs9LbTfnKFpdykixcv3rx583XXXccY+/73v3/iiSfyc8VGkSeqsRclHexyufhqhJIMVps9C4WeLrVC3QAYOzR9v/HYAwDyCwQhAEVJKBRio0kvuVT717/+1d3d/b3vfe/OO+9kjL388ss/+MEPli9fvnbtWqfTSYfFYrFYLMYFIemTzs7OBx98MBqN3njjjX/961+Hhob+/ve///jHP161atWaNWtIn5BI2LRp07nnnnvttddefvnl3d3dZWVlV1555SOPPPLd73730ksvLdz9OI7t27cvXLhw/fr1Ka0lCtUYjK64IiK9Z7fbTz/99P7+/r/+9a8f//jHV69e7ff7n3zyyYsuumjWrFl2uz2RSHCTIP07ODhIJfD9L7/88ksvvbRkyRKqz/vvv3/zzTfPnTv3rLPOqqqqomNSqVQ8HqdvmTFG5rtIJPLUU08NDAwsW7aMzt2zZ8/f//53xti6desotwpPZWFehLvdbjISSjdENMqlrJFllB3/ZVGgLG0XvGIA5Bd61MVUSXjIQR7BtAIQgSAEoMigTpzUBWm83t7eTZs2dXZ2BgKBM888s7GxkY487bTTGGP79u2744475syZs2rVqrKystLS0mnTppEdjzF26NChDRs27Nu3r7m5+ZRTTpk7dy5jrKys7KKLLnr77bffeeedjRs3nnbaacuWLSPpGAqFpk2bdt5557HRpKbf/OY3H3nkkcsuu+xnP/vZI488Qh6nZtJ7mHwb8cNI54jrCtAlkslkIBBYtGjR0NDQ0aNHA4EAhdVpXijTVyCPPKRFJkgTnn/++U8++eQDDzzwiU984qSTTnK5XI8++ujll18+depUWgqSziVzX2NjI110aGjorbfeamtri0QiH/rQh1atWkWHLV68mDG2a9eue++9t6mp6YwzzqipqbHZbLNmzeKJXo4dO7Z169adO3f6/f4lS5YsXbqU9s+ePTuVSu3atev555+vq6tbvHhxIBCgOpM+NHmHQ6GQtDqFpoleUxOO56hCfWnxeUBSGTDxsFruXADAhASCEFgFxBBmBAlCj8czNDT0yiuvRCKRNWvWUDrKZDJJksztdp955plnnHHG008//c477/j9/tNPP91ms1VXV9MwOhQKPfnkk8PDw2vXrj355JMZY6lUitbHq6qqWrdu3amnnvrwww+/8sorNptt+fLljLGamprDhw8PDw+XlpZGIhGv17tixYra2lrKVipm+BhnuNcoUV9ff/fddzOd2DMzj5k6hpDkByXXueiii5544om77rrrC1/4wqJFi0Kh0D333PPpT3+6ublZPGvatGnV1dW0/e677z7//POnnHLK+eefT9lfYrFYMpn0eDyLFy9evHjxhg0b/vnPfzqdzrVr15aUlPh8Pu5x+sorr3R2di5btuz000+nPaTfXC7XnDlz5syZs3fv3s2bNyeTyZUrV1J6GBKEZjRSZWVlVVUVN05q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BBZCPc67+uqrKa4sLb/61a9OPPFEKaxL7bVo0nqjlgQ0fCehdcYZZ7z00ktPPvnkvHnzYrGYx+PhdjlKDFNSUjJ79uxUKrV3795QKFRSUjJ9+vSmpqYDBw4kEgluYiotLU0mk3v27KHgQ72gtVQqtW/fvm3btp166qls1JWUDlYUhZr8yCOPfOYzn7n++ut/8IMfUD0N2kttMSlCDKDUPuIePZXCFRetGEk7H3jggSlTppx55pldXV1UGSnUk6ckZYwlk0m6z4cPH3766ac7OjpWr17d19eXEpL9kL+oGIoplkbLTrz33nu7d+/mpmap7dI8ggF6iW2NTxefK24hdLvdov+qSdJWMuskqJNHbk2elgIAAAAGQBACqyBZ5PjQubS0NBKJ8CSNokskneLz+cLh8B//+McvfelLjLHf/va3Z5999qxZs9QSy3ygl2bkocfjicfjHo/H7Xafc845GzduPHDggNvtdjgcZKYjQZJMJgcGBsrLy20228DAgKIow8PDZWVlFAZJRrxYLOZyubxebzKZDAaDdCIbHcSTpOHbpD0+9rGPzZkzhzFGXrJUJTrmG9/4xsMPP3z++ec/+OCDBw4cuOeee3hlpGbydCnSuh3qxhrfGYLW29A7TDM1i91upyUZq6qqvv/970cike3bt5MepohEWrSDakgpW5PJJH3vJSUl0Wj00KFDHR0dR44cOXbsWH9/P7/nbDS00m63u1wuOosS/NAGYywajdbW1t52223Dw8NdXV1qX1/z0FUyPUv6OkhRu91uydSckbVWjxxXxZgkZBT2CQAAAExIIAiB1YnH4yQhRESZQWKATEw7duz44he/+PnPf/7nP/85CQwz+UXVyTA1jyftx0YF1bJly4aGhijhDV2FakLbsVjMZrNNmzbN6XSSLOEOk/wSJCPFNTPUkpUsiqRC6ZhEIsHTkNhstkgkctttt917771XX311f3//9OnTb7jhhltuuUVqhe34lQxId2nG0ZmHWwgNPHLV1+X/nn766YlEIhwOizk/1V67dInU6CINU6dOdTqdc+bMmTlzJgUWsuOfB82i2KjF2Ofz2e32d999t6+vL1NBKBZIQi6j0yW4y6iYPpd/lGPJbFQQIpGmMZCCAAAAAAQhsBbqxJhqNShBxp/58+dv3br1yJEjP/3pT4PB4Je//OWbbrqppqbGwNgijZWN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', + crossOrigin: null, + filters: [], + } \ No newline at end of file diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..8208ef8 --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,25 @@ +declare module 'slash2'; +declare module '*.css'; +declare module '*.less'; +declare module '*.scss'; +declare module '*.sass'; +declare module '*.svg'; +declare module '*.png'; +declare module '*.jpg'; +declare module '*.jpeg'; +declare module '*.gif'; +declare module '*.bmp'; +declare module '*.tiff'; +declare module 'omit.js'; +declare module 'numeral'; +declare module '@antv/data-set'; +declare module 'mockjs'; +declare module 'react-fittext'; +declare module 'bizcharts-plugin-slider'; +declare module 'uuid' + +declare const REACT_APP_ENV: 'test' | 'dev' | 'pre' | false; +declare const SERVER_HOST:string; + +declare const FILE_SERVER_HOST:string; +declare const WEBRTC_SERVER_HOST:string; diff --git a/src/utils/FixMenuItemIcon.tsx b/src/utils/FixMenuItemIcon.tsx new file mode 100644 index 0000000..1cadf80 --- /dev/null +++ b/src/utils/FixMenuItemIcon.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { MenuDataItem } from '@ant-design/pro-layout'; +import {CarOutlined, UserOutlined, TableOutlined, + DollarCircleOutlined, ShopOutlined, UserSwitchOutlined, + HomeOutlined, SettingOutlined, TeamOutlined, DotChartOutlined, + BlockOutlined, DesktopOutlined, DatabaseOutlined, + WarningOutlined, CalendarOutlined, ExperimentOutlined, + ThunderboltOutlined, BugOutlined, AreaChartOutlined, +} from '@ant-design/icons'; + +const iconMap:any = { + 'CarOutlined': <CarOutlined/>, + 'UserOutlined': <UserOutlined/>, + 'TableOutlined': <TableOutlined/>, + 'DollarCircleOutlined': <DollarCircleOutlined/>, + 'ShopOutlined': <ShopOutlined/>, + 'UserSwitchOutlined': <UserSwitchOutlined/>, + 'HomeOutlined': <HomeOutlined/>, + 'SettingOutlined': <SettingOutlined/>, + 'TeamOutlined': <TeamOutlined/>, + 'DotChartOutlined': <DotChartOutlined/>, + 'BlockOutlined': <BlockOutlined/>, + 'DesktopOutlined': <DesktopOutlined/>, + 'DatabaseOutlined': <DatabaseOutlined/>, + 'WarningOutlined': <WarningOutlined/>, + 'CalendarOutlined': <CalendarOutlined/>, + 'ExperimentOutlined': <ExperimentOutlined/>, + 'ThunderboltOutlined': <ThunderboltOutlined/>, + 'BugOutlined': <BugOutlined/>, + 'AreaChartOutlined': <AreaChartOutlined/>, +} +// FIX从接口获取菜单时icon为string类型 +const fixMenuItemIcon = (menus: MenuDataItem[], iconType = 'Outlined'): MenuDataItem[] => { + menus.forEach((item) => { + const { icon, children } = item; + if (typeof icon === 'string') { + console.log(22, icon) + if (icon in iconMap) { + item.icon = iconMap[icon]; + } else { + item.icon = iconMap['TableOutlined']; + } + // let fixIconName = icon.slice(0, 1).toLocaleUpperCase() + icon.slice(1) + iconType; + // // @ts-ignore + // item.icon = React.createElement(allIcons[fixIconName] || allIcons[icon]); + } + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + children && children.length > 0 ? (item.children = fixMenuItemIcon(children)) : null; + }); + return menus; +}; + +export default fixMenuItemIcon; diff --git a/src/utils/IconUtil.ts b/src/utils/IconUtil.ts new file mode 100644 index 0000000..19446c4 --- /dev/null +++ b/src/utils/IconUtil.ts @@ -0,0 +1,24 @@ +import * as AntdIcons from '@ant-design/icons'; +import React from 'react'; + +const allIcons: Record<string, any> = AntdIcons; + +export function getIcon(name: string): React.ReactNode | string { + const icon = allIcons[name]; + return icon || ''; +} + +export function createIcon(icon?: string | any): React.ReactNode | string { + if(!icon){ + return '' + } + console.log(icon,'createIcon_icon') + if (typeof icon === 'object') { + return icon; + } + const ele = allIcons[icon]; + if (ele) { + return React.createElement(allIcons[icon]); + } + return ''; +} diff --git a/src/utils/common.ts b/src/utils/common.ts new file mode 100644 index 0000000..8e31cc0 --- /dev/null +++ b/src/utils/common.ts @@ -0,0 +1,123 @@ +import {RcFile} from "antd/es/upload/interface"; +import {message} from "antd"; + +const file_type_list = [ + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', //xlsx + 'application/vnd.ms-excel', //xls + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', //docx + 'text/plain', //text + 'application/pdf', //pdf + 'application/json', //json + 'application/msword', //doc +] +export const parseIds = (data: string | undefined)=>{ + console.log(555, data) + if (data === undefined || data === '') { + console.log(88888, data) + return [] + } else { + return data.split(",").map((item)=>{return parseInt(item)}) + } +} + +export const handleOneFile: any = (values: any, name: string)=>{ + if (values[name] && values[name].length) { + // 有文件 + if(values[name][0].status === 'error'){ + // 第一个文件 上传失败 + delete values[name] + } else { + if (values[name][0]?.response && values[name][0]?.response?.data?.path) { + values[name] = values[name][0]?.response?.data?.path + } else { + delete values[name] + } + } + } else { + delete values[name] + } + return values +} + +export const beforeUploadImage = (file: RcFile) => { + const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; + console.log(file.type) + if (!isJpgOrPng) { + message.error('不是图片类型'); + } + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + message.error('大小超过2M'); + } + return isJpgOrPng && isLt2M; +}; + +export const beforeUploadFile = (file: RcFile) => { + const isLt50M = file.size / 1024 / 1024 < 50; + if (!isLt50M) { + message.error('大小超过50M'); + } + return isLt50M; +}; + +export const imageInit = (host: string, data: any)=>{ + if (data) { + return [{uid: '-1', name: 'image.png', status: 'done', url: host+data,}] + } else { + return [] + } +} + +export const getEnum = (intl: any, data: Array<string>)=>{ + let temp = {} + data.forEach((v)=>{ + let name = v.split('.enum.')[1] + // @ts-ignore + temp[name] = intl.formatMessage({id: `${v}`, defaultMessage: '$$$',}) + }) + return temp +} + +export function addObjectByCode(obj: any, code: any, data:any) { + if (obj.code === code) { + if (!obj.children) { + obj.children = []; + } + obj.children.push(data); + return true; + } else if (obj.children) { + for (let i = 0; i < obj.children.length; i++) { + const added = addObjectByCode(obj.children[i], code, data); + if (added) { + return true; + } + } + } + return false; +} + +export function floatFormat(num: number, precision = 12) { + return +parseFloat(num.toPrecision(precision)); +} + +export function getAllRouteNameTile(routes: any[], parent_name: string) { + let temp: any[] = [] + routes.forEach((v)=>{ + temp.push({name: `${parent_name}.${v.name}`, title: v.title}) + let new_parent_name = `${parent_name}.${v.name}` + if (v.routes.length) { + temp = temp.concat(getAllRouteNameTile(v.routes, new_parent_name)) + } + }) + return temp +} + +export function dateFormat(date: string) : string{ + + + const datetime = new Date(date); + const year = datetime.getFullYear(); + const month = (datetime.getMonth() + 1).toString().padStart(2, '0'); + const day = datetime.getDate().toString().padStart(2, '0'); + return `${year}-${month}-${day}` +} diff --git a/src/utils/downloadfile.ts b/src/utils/downloadfile.ts new file mode 100644 index 0000000..5d56cda --- /dev/null +++ b/src/utils/downloadfile.ts @@ -0,0 +1,63 @@ +import { request } from '@umijs/max'; + +const mimeMap = { + xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + zip: 'application/zip', +}; + +/** + * 解析blob响应内容并下载 + * @param {*} res blob响应内容 + * @param {String} mimeType MIME类型 + */ +export function resolveBlob(res: any, mimeType: string) { + const aLink = document.createElement('a'); + const blob = new Blob([res.data], { type: mimeType }); + // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名; + const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*'); + // console.log(res); + const contentDisposition = decodeURI(res.headers['content-disposition']); + const result = patt.exec(contentDisposition); + let fileName = result ? result[1] : 'file'; + fileName = fileName.replace(/"/g, ''); + aLink.style.display = 'none'; + aLink.href = URL.createObjectURL(blob); + aLink.setAttribute('download', fileName); // 设置下载文件名称 + document.body.appendChild(aLink); + aLink.click(); + URL.revokeObjectURL(aLink.href); // 清除引用 + document.body.removeChild(aLink); +} + +export function downLoadZip(url: string) { + request(url, { + method: 'GET', + responseType: 'blob', + getResponse: true, + }).then((res) => { + resolveBlob(res, mimeMap.zip); + }); +} + +export async function downLoadXlsx(url: string, params: any, fileName: string) { + return request(url, { + ...params, + method: 'POST', + responseType: 'blob', + }).then((data) => { + const aLink = document.createElement('a'); + const blob = data as any; // new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + aLink.style.display = 'none'; + aLink.href = URL.createObjectURL(blob); + aLink.setAttribute('download', fileName); // 设置下载文件名称 + document.body.appendChild(aLink); + aLink.click(); + URL.revokeObjectURL(aLink.href); // 清除引用 + document.body.removeChild(aLink); + }); +} + + +export function download(fileName: string) { + window.location.href = `/api/common/download?fileName=${encodeURI(fileName)}&delete=${true}`; +} diff --git a/src/utils/options.ts b/src/utils/options.ts new file mode 100644 index 0000000..79ee803 --- /dev/null +++ b/src/utils/options.ts @@ -0,0 +1,12 @@ +import { DictValueEnumObj } from "@/components/DictTag"; +import { ProSchemaValueEnumObj, ProSchemaValueEnumType } from "@ant-design/pro-components"; + +export function getValueEnumLabel(options: DictValueEnumObj | ProSchemaValueEnumObj, val: string | number | undefined, defaultValue?: string) { + if (val !== undefined) { + const data = options[val] as ProSchemaValueEnumType; + if(data) { + return data.text; + } + } + return defaultValue?defaultValue:val; +} diff --git a/src/utils/permission.ts b/src/utils/permission.ts new file mode 100644 index 0000000..e7c8a28 --- /dev/null +++ b/src/utils/permission.ts @@ -0,0 +1,64 @@ +// /** +// * 字符权限校验 +// * @param {Array} value 校验值 +// * @returns {Boolean} +// */ +export function matchPerms(permissions: string[], value: string[]) { + if (value && value instanceof Array && value.length > 0) { + const permissionDatas = value; + const all_permission = '*:*:*'; + const hasPermission = permissions.some((permission) => { + return all_permission === permission || permissionDatas.includes(permission); + }); + if (!hasPermission) { + return false; + } + return true; + } + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`); + return false; +} + +export function matchPerm(permissions: string[], value: string) { + if (value && value.length > 0) { + const permissionDatas = value; + const all_permission = '*:*:*'; + const hasPermission = permissions.some((permission) => { + return all_permission === permission || permissionDatas === permission; + }); + if (!hasPermission) { + return false; + } + return true; + } + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`); + return false; +} + +export function matchPermission(permissions: string[] | undefined, value: any): boolean { + if (permissions === undefined) return false; + const type = typeof value; + if (type === 'string') { + return matchPerm(permissions, value); + } + return matchPerms(permissions, value); +} + +/** + * 角色权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkRole(roles: API.System.Role[] | undefined, value: string[]) { + if (roles && value && value.length > 0) { + for (let i = 0; i < roles?.length; i++) { + for (let j = 0; j < value?.length; j++) { + if (value[j] === roles[i].roleKey) { + return true; + } + } + } + } + console.error(`need roles! Like checkRole="['admin','editor']"`); + return false; +} diff --git a/src/utils/player.tsx b/src/utils/player.tsx new file mode 100644 index 0000000..ee20481 --- /dev/null +++ b/src/utils/player.tsx @@ -0,0 +1,9 @@ +import React from 'react' +import { VideoPlayer } from '@videojs-player/react' +import 'video.js/dist/video-js.css' + +export const MyComponent: React.FC = () => { + return ( + <div></div> + ) +} diff --git a/src/utils/tree.ts b/src/utils/tree.ts new file mode 100644 index 0000000..d75395e --- /dev/null +++ b/src/utils/tree.ts @@ -0,0 +1,93 @@ +import { DataNode } from 'antd/es/tree'; +import { parse } from 'querystring'; + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + */ +export function buildTreeData( + data: any[], + id: string, + name: string, + parentId: string, + parentName: string, + children: string, +) { + const config = { + id: id || 'id', + name: name || 'name', + parentId: parentId || 'parentId', + parentName: parentName || 'parentName', + childrenList: children || 'children', + }; + + const childrenListMap: any[] = []; + const nodeIds: any[] = []; + const tree: any[] = []; + data.forEach((item) => { + const d = item; + const pId = d[config.parentId]; + if (!childrenListMap[pId]) { + childrenListMap[pId] = []; + } + d.key = d[config.id]; + d.title = d[config.name]; + d.value = d[config.id]; + d[config.childrenList] = null; + nodeIds[d[config.id]] = d; + childrenListMap[pId].push(d); + }); + + data.forEach((item: any) => { + const d = item; + const pId = d[config.parentId]; + if (!nodeIds[pId]) { + d[config.parentName] = ''; + tree.push(d); + } + }); + + function adaptToChildrenList(item: any) { + const o = item; + if (childrenListMap[o[config.id]]) { + if (!o[config.childrenList]) { + o[config.childrenList] = []; + } + o[config.childrenList] = childrenListMap[o[config.id]]; + } + if (o[config.childrenList]) { + o[config.childrenList].forEach((child: any) => { + const c = child; + c[config.parentName] = o[config.name]; + adaptToChildrenList(c); + }); + } + } + + tree.forEach((t: any) => { + adaptToChildrenList(t); + }); + + return tree; +} + +export const getPageQuery = () => parse(window.location.href.split('?')[1]); + +export function formatTreeData(arrayList: any): DataNode[] { + const treeSelectData: DataNode[] = arrayList.map((item: any) => { + const node: DataNode = { + id: item.id, + title: item.label, + key: `${item.id}`, + value: item.id, + } as DataNode; + if (item.children) { + node.children = formatTreeData(item.children); + } + return node; + }); + return treeSelectData; +} diff --git a/tests/setupTests.jsx b/tests/setupTests.jsx new file mode 100644 index 0000000..952561d --- /dev/null +++ b/tests/setupTests.jsx @@ -0,0 +1,64 @@ +const localStorageMock = { + getItem: jest.fn(), + setItem: jest.fn(), + removeItem: jest.fn(), + clear: jest.fn(), +}; + +global.localStorage = localStorageMock; + +Object.defineProperty(URL, 'createObjectURL', { + writable: true, + value: jest.fn(), +}); + +class Worker { + constructor(stringUrl) { + this.url = stringUrl; + this.onmessage = () => {}; + } + + postMessage(msg) { + this.onmessage(msg); + } +} +window.Worker = Worker; + +/* eslint-disable global-require */ +if (typeof window !== 'undefined') { + // ref: https://github.com/ant-design/ant-design/issues/18774 + if (!window.matchMedia) { + Object.defineProperty(global.window, 'matchMedia', { + writable: true, + configurable: true, + value: jest.fn(() => ({ + matches: false, + addListener: jest.fn(), + removeListener: jest.fn(), + })), + }); + } + if (!window.matchMedia) { + Object.defineProperty(global.window, 'matchMedia', { + writable: true, + configurable: true, + value: jest.fn((query) => ({ + matches: query.includes('max-width'), + addListener: jest.fn(), + removeListener: jest.fn(), + })), + }); + } +} +const errorLog = console.error; +Object.defineProperty(global.window.console, 'error', { + writable: true, + configurable: true, + value: (...rest) => { + const logStr = rest.join(''); + if (logStr.includes('Warning: An update to %s inside a test was not wrapped in act(...)')) { + return; + } + errorLog(...rest); + }, +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9c05082 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "forceConsistentCasingInFileNames": false, + + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "jsx": "preserve", + "esModuleInterop": true, + "sourceMap": true, + "baseUrl": "./", + "skipLibCheck": true, + "experimentalDecorators": true, + "strict": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "paths": { + "@/*": ["./src/*"], + "@@/*": ["./src/.umi/*"], + "@@test/*": ["./src/.umi-test/*"] + } + }, + "include": ["./**/*.d.ts", "./**/*.ts", "./**/*.tsx"] +} diff --git a/types/cache/cache.json b/types/cache/cache.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/types/cache/cache.json @@ -0,0 +1 @@ +{} diff --git a/types/cache/login.cache.json b/types/cache/login.cache.json new file mode 100644 index 0000000..81109b4 --- /dev/null +++ b/types/cache/login.cache.json @@ -0,0 +1,386 @@ +{ + "GET /api/currentUser": { + "res": { + "data": { + "name": "Serati Ma", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png", + "userid": "00000001", + "email": "antdesign@alipay.com", + "signature": "海纳百川,有容乃大", + "title": "交互专家", + "group": "蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED", + "tags": [ + { + "key": "0", + "label": "很有想法的" + }, + { + "key": "1", + "label": "专注设计" + }, + { + "key": "2", + "label": "辣~" + }, + { + "key": "3", + "label": "大长腿" + }, + { + "key": "4", + "label": "川妹子" + }, + { + "key": "5", + "label": "海纳百川" + } + ], + "notifyCount": 12, + "unreadCount": 11, + "country": "China", + "geographic": { + "province": { + "label": "浙江省", + "key": "330000" + }, + "city": { + "label": "杭州市", + "key": "330100" + } + }, + "address": "西湖区工专路 77 号", + "phone": "0752-268888888" + } + }, + "query": { + "token ": " 123" + }, + "payload": {}, + "types": "/** GET /api/currentUser */\nexport type GET_API_CURRENT_USER_QUERY = {\n /** example: 123 */\n token : string\n}\n \n\nexport type GET_API_CURRENT_USER_PAYLOAD = {\n \n}\n \n\nexport type GET_API_CURRENT_USER_RES = {\n /** example: {\"name\": \"Serati Ma\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png\", \"userid\": \"00000001\", \"email\": \"antdesign@alipay.com\", \"signature\": \"海纳百川,有容乃大\", \"title\": \"交互专家\", \"group\": \"蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED\", \"tags\": [{\"key\": \"0\", \"label\": \"很有想法的\"}, {\"key\": \"1\", \"label\": \"专注设计\"}, {\"key\": \"2\", \"label\": \"辣~\"}, {\"key\": \"3\", \"label\": \"大长腿\"}, {\"key\": \"4\", \"label\": \"川妹子\"}, {\"key\": \"5\", \"label\": \"海纳百川\"}], \"notifyCount\": 12, \"unreadCount\": 11, \"country\": \"China\", \"geographic\": {\"province\": {\"label\": \"浙江省\", \"key\": \"330000\"}, \"city\": {\"label\": \"杭州市\", \"key\": \"330100\"}}, \"address\": \"西湖区工专路 77 号\", \"phone\": \"0752-268888888\"} */\n data: {\n name: string,\navatar: string,\nuserid: string,\nemail: string,\nsignature: string,\ntitle: string,\ngroup: string,\ntags: {\n key: string,\nlabel: string\n }[],\nnotifyCount: number,\nunreadCount: number,\ncountry: string,\ngeographic: {\n province: {\n label: string,\nkey: string\n },\ncity: {\n label: string,\nkey: string\n }\n },\naddress: string,\nphone: string\n }\n}\n " + }, + "GET /api/rule": { + "res": { + "data": [ + { + "key": 99, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 99", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 503, + "status": "0", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 81 + }, + { + "key": 98, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 98", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 164, + "status": "0", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 12 + }, + { + "key": 97, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 97", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 174, + "status": "1", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 81 + }, + { + "key": 96, + "disabled": true, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 96", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 914, + "status": "0", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 7 + }, + { + "key": 95, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 95", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 698, + "status": "2", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 82 + }, + { + "key": 94, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 94", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 488, + "status": "1", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 14 + }, + { + "key": 93, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 93", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 580, + "status": "2", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 77 + }, + { + "key": 92, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 92", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 244, + "status": "3", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 58 + }, + { + "key": 91, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 91", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 959, + "status": "0", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 66 + }, + { + "key": 90, + "disabled": true, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 90", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 958, + "status": "0", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 72 + }, + { + "key": 89, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 89", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 301, + "status": "2", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 2 + }, + { + "key": 88, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 88", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 277, + "status": "1", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 12 + }, + { + "key": 87, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 87", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 810, + "status": "1", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 82 + }, + { + "key": 86, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 86", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 780, + "status": "3", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 22 + }, + { + "key": 85, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 85", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 705, + "status": "3", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 12 + }, + { + "key": 84, + "disabled": true, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 84", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 203, + "status": "0", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 79 + }, + { + "key": 83, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 83", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 491, + "status": "2", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 59 + }, + { + "key": 82, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 82", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 73, + "status": "0", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 100 + }, + { + "key": 81, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", + "name": "TradeCode 81", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 406, + "status": "3", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 61 + }, + { + "key": 80, + "disabled": false, + "href": "https://ant.design", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", + "name": "TradeCode 80", + "owner": "曲丽丽", + "desc": "这是一段描述", + "callNo": 112, + "status": "2", + "updatedAt": "2022-12-06T05:00:57.040Z", + "createdAt": "2022-12-06T05:00:57.040Z", + "progress": 20 + } + ], + "total": 100, + "success": true, + "pageSize": 20, + "current": 1 + }, + "query": { + "token ": " 123", + "current": "1", + "pageSize": "20" + }, + "payload": {}, + "types": "/** GET /api/rule */\nexport type GET_API_RULE_QUERY = {\n /** example: 123 */\n token : string;\n /** example: 1 */\n current: string;\n /** example: 20 */\n pageSize: string\n}\n \n\nexport type GET_API_RULE_PAYLOAD = {\n \n}\n \n\nexport type GET_API_RULE_RES = {\n /** example: [{\"key\": 99, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 99\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 503, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 81}, {\"key\": 98, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 98\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 164, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 12}, {\"key\": 97, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 97\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 174, \"status\": \"1\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 81}, {\"key\": 96, \"disabled\": true, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 96\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 914, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 7}, {\"key\": 95, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 95\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 698, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 82}, {\"key\": 94, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 94\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 488, \"status\": \"1\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 14}, {\"key\": 93, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 93\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 580, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 77}, {\"key\": 92, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 92\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 244, \"status\": \"3\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 58}, {\"key\": 91, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 91\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 959, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 66}, {\"key\": 90, \"disabled\": true, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 90\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 958, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 72}, {\"key\": 89, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 89\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 301, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 2}, {\"key\": 88, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 88\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 277, \"status\": \"1\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 12}, {\"key\": 87, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 87\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 810, \"status\": \"1\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 82}, {\"key\": 86, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 86\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 780, \"status\": \"3\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 22}, {\"key\": 85, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 85\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 705, \"status\": \"3\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 12}, {\"key\": 84, \"disabled\": true, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 84\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 203, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 79}, {\"key\": 83, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 83\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 491, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 59}, {\"key\": 82, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 82\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 73, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 100}, {\"key\": 81, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 81\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 406, \"status\": \"3\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 61}, {\"key\": 80, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 80\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 112, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 20}] */\n data: {\n key: number,\ndisabled: boolean,\nhref: string,\navatar: string,\nname: string,\nowner: string,\ndesc: string,\ncallNo: number,\nstatus: string,\nupdatedAt: string,\ncreatedAt: string,\nprogress: number\n }[];\n /** example: 100 */\n total: number;\n /** example: true */\n success: boolean;\n /** example: 20 */\n pageSize: number;\n /** example: 1 */\n current: number\n}\n " + }, + "POST /api/login/outLogin": { + "res": { + "data": {}, + "success": true + }, + "query": { + "token ": " 123" + }, + "payload": {}, + "types": "/** POST /api/login/outLogin */\nexport type POST_API_LOGIN_OUT_LOGIN_QUERY = {\n /** example: 123 */\n token : string\n}\n \n\nexport type POST_API_LOGIN_OUT_LOGIN_PAYLOAD = {\n \n}\n \n\nexport type POST_API_LOGIN_OUT_LOGIN_RES = {\n /** example: {} */\n data: {\n \n };\n /** example: true */\n success: boolean\n}\n " + }, + "POST /api/login/account": { + "res": { + "status": "ok", + "type": "account", + "currentAuthority": "admin" + }, + "query": { + "token ": " 123" + }, + "payload": { + "username": "admin", + "password": "ant.design", + "autoLogin": true, + "type": "account" + }, + "types": "/** POST /api/login/account */\nexport type POST_API_LOGIN_ACCOUNT_QUERY = {\n /** example: 123 */\n token : string\n}\n \n\nexport type POST_API_LOGIN_ACCOUNT_PAYLOAD = {\n /** example: admin */\n username: string;\n /** example: ant.design */\n password: string;\n /** example: true */\n autoLogin: boolean;\n /** example: account */\n type: string\n}\n \n\nexport type POST_API_LOGIN_ACCOUNT_RES = {\n /** example: ok */\n status: string;\n /** example: account */\n type: string;\n /** example: admin */\n currentAuthority: string\n}\n " + } +} diff --git a/types/cache/mock/login.mock.cache.js b/types/cache/mock/login.mock.cache.js new file mode 100644 index 0000000..6c59e19 --- /dev/null +++ b/types/cache/mock/login.mock.cache.js @@ -0,0 +1,324 @@ +module.exports = { + 'GET /api/currentUser': { + data: { + name: 'Serati Ma', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png', + userid: '00000001', + email: 'antdesign@alipay.com', + signature: '海纳百川,有容乃大', + title: '交互专家', + group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED', + tags: [ + { key: '0', label: '很有想法的' }, + { key: '1', label: '专注设计' }, + { key: '2', label: '辣~' }, + { key: '3', label: '大长腿' }, + { key: '4', label: '川妹子' }, + { key: '5', label: '海纳百川' }, + ], + notifyCount: 12, + unreadCount: 11, + country: 'China', + geographic: { + province: { label: '浙江省', key: '330000' }, + city: { label: '杭州市', key: '330100' }, + }, + address: '西湖区工专路 77 号', + phone: '0752-268888888', + }, + }, + 'GET /api/rule': { + data: [ + { + key: 99, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 99', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 503, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 81, + }, + { + key: 98, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 98', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 164, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 12, + }, + { + key: 97, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 97', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 174, + status: '1', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 81, + }, + { + key: 96, + disabled: true, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 96', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 914, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 7, + }, + { + key: 95, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 95', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 698, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 82, + }, + { + key: 94, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 94', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 488, + status: '1', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 14, + }, + { + key: 93, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 93', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 580, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 77, + }, + { + key: 92, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 92', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 244, + status: '3', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 58, + }, + { + key: 91, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 91', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 959, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 66, + }, + { + key: 90, + disabled: true, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 90', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 958, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 72, + }, + { + key: 89, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 89', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 301, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 2, + }, + { + key: 88, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 88', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 277, + status: '1', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 12, + }, + { + key: 87, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 87', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 810, + status: '1', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 82, + }, + { + key: 86, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 86', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 780, + status: '3', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 22, + }, + { + key: 85, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 85', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 705, + status: '3', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 12, + }, + { + key: 84, + disabled: true, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 84', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 203, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 79, + }, + { + key: 83, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 83', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 491, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 59, + }, + { + key: 82, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 82', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 73, + status: '0', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 100, + }, + { + key: 81, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + name: 'TradeCode 81', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 406, + status: '3', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 61, + }, + { + key: 80, + disabled: false, + href: 'https://ant.design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + name: 'TradeCode 80', + owner: '曲丽丽', + desc: '这是一段描述', + callNo: 112, + status: '2', + updatedAt: '2022-12-06T05:00:57.040Z', + createdAt: '2022-12-06T05:00:57.040Z', + progress: 20, + }, + ], + total: 100, + success: true, + pageSize: 20, + current: 1, + }, + 'POST /api/login/outLogin': { data: {}, success: true }, + 'POST /api/login/account': { + status: 'ok', + type: 'account', + currentAuthority: 'admin', + }, +}; diff --git a/types/cache/mock/mock.cache.js b/types/cache/mock/mock.cache.js new file mode 100644 index 0000000..e69de29 diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..2c2805a --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,120 @@ +export namespace API { + /** GET /api/currentUser */ + export type GET_API_CURRENT_USER_QUERY = { + /** example: 123 */ + token: string; + }; + + export type GET_API_CURRENT_USER_PAYLOAD = Record<string, any>; + + export type GET_API_CURRENT_USER_RES = { + /** example: {"name": "Serati Ma", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png", "userid": "00000001", "email": "antdesign@alipay.com", "signature": "海纳百川,有容乃大", "title": "交互专家", "group": "蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED", "tags": [{"key": "0", "label": "很有想法的"}, {"key": "1", "label": "专注设计"}, {"key": "2", "label": "辣~"}, {"key": "3", "label": "大长腿"}, {"key": "4", "label": "川妹子"}, {"key": "5", "label": "海纳百川"}], "notifyCount": 12, "unreadCount": 11, "country": "China", "geographic": {"province": {"label": "浙江省", "key": "330000"}, "city": {"label": "杭州市", "key": "330100"}}, "address": "西湖区工专路 77 号", "phone": "0752-268888888"} */ + data: { + name: string; + avatar: string; + userid: string; + email: string; + signature: string; + title: string; + group: string; + tags: { + key: string; + label: string; + }[]; + notifyCount: number; + unreadCount: number; + country: string; + geographic: { + province: { + label: string; + key: string; + }; + city: { + label: string; + key: string; + }; + }; + address: string; + phone: string; + }; + }; + + /** GET /api/rule */ + export type GET_API_RULE_QUERY = { + /** example: 123 */ + token: string; + /** example: 1 */ + current: string; + /** example: 20 */ + pageSize: string; + }; + + export type GET_API_RULE_PAYLOAD = Record<string, any>; + + export type GET_API_RULE_RES = { + /** example: [{"key": 99, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 99", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 503, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 81}, {"key": 98, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 98", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 164, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 12}, {"key": 97, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 97", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 174, "status": "1", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 81}, {"key": 96, "disabled": true, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 96", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 914, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 7}, {"key": 95, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 95", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 698, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 82}, {"key": 94, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 94", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 488, "status": "1", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 14}, {"key": 93, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 93", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 580, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 77}, {"key": 92, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 92", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 244, "status": "3", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 58}, {"key": 91, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 91", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 959, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 66}, {"key": 90, "disabled": true, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 90", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 958, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 72}, {"key": 89, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 89", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 301, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 2}, {"key": 88, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 88", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 277, "status": "1", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 12}, {"key": 87, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 87", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 810, "status": "1", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 82}, {"key": 86, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 86", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 780, "status": "3", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 22}, {"key": 85, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 85", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 705, "status": "3", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 12}, {"key": 84, "disabled": true, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 84", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 203, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 79}, {"key": 83, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 83", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 491, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 59}, {"key": 82, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 82", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 73, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 100}, {"key": 81, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 81", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 406, "status": "3", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 61}, {"key": 80, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 80", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 112, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 20}] */ + data: { + key: number; + disabled: boolean; + href: string; + avatar: string; + name: string; + owner: string; + desc: string; + callNo: number; + status: string; + updatedAt: string; + createdAt: string; + progress: number; + }[]; + /** example: 100 */ + total: number; + /** example: true */ + success: boolean; + /** example: 20 */ + pageSize: number; + /** example: 1 */ + current: number; + }; + + /** POST /api/login/outLogin */ + export type POST_API_LOGIN_OUT_LOGIN_QUERY = { + /** example: 123 */ + token: string; + }; + + export type POST_API_LOGIN_OUT_LOGIN_PAYLOAD = Record<string, any>; + + export type POST_API_LOGIN_OUT_LOGIN_RES = { + /** example: {} */ + data: Record<string, any>; + /** example: true */ + success: boolean; + }; + + /** POST /api/login/account */ + export type POST_API_LOGIN_ACCOUNT_QUERY = { + /** example: 123 */ + token: string; + }; + + export type POST_API_LOGIN_ACCOUNT_PAYLOAD = { + /** example: admin */ + username: string; + /** example: ant.design */ + password: string; + /** example: true */ + autoLogin: boolean; + /** example: account */ + type: string; + }; + + export type POST_API_LOGIN_ACCOUNT_RES = { + /** example: ok */ + status: string; + /** example: account */ + type: string; + /** example: admin */ + currentAuthority: string; + }; +}