@ibiz-template/core 0.2.18-dev.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +4 -1
- package/dist/index.system.min.js +2 -2
- package/dist/index.system.min.js.map +1 -1
- package/out/interface/i-portal-async-action/i-portal-async-action.d.ts +72 -0
- package/out/interface/i-portal-async-action/i-portal-async-action.d.ts.map +1 -1
- package/out/utils/net/net.d.ts.map +1 -1
- package/out/utils/net/net.js +4 -1
- package/package.json +2 -2
- package/src/interface/i-portal-async-action/i-portal-async-action.ts +78 -0
- package/src/utils/net/net.ts +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.system.min.js","sources":["../../../node_modules/.pnpm/@microsoft+fetch-event-source@2.0.1/node_modules/@microsoft/fetch-event-source/lib/esm/parse.js","../../../node_modules/.pnpm/@microsoft+fetch-event-source@2.0.1/node_modules/@microsoft/fetch-event-source/lib/esm/fetch.js","../src/command/utils/linked-list.ts","../src/command/utils/util.ts","../src/command/command-register.ts","../src/command/command.ts","../src/command/index.ts","../src/constant/core/core.ts","../src/constant/util/util.ts","../src/constant/http-status-message/http-status-message.ts","../src/constant/login-mode/login-mode.ts","../src/constant/menu-permission-mode/menu-permission-mode.ts","../src/context/index.ts","../src/params/params.ts","../src/environment/environment.ts","../src/error/http-error/http-error.ts","../src/error/model-error/model-error.ts","../src/error/runtime-error/runtime-error.ts","../src/error/runtime-model-error/runtime-model-error.ts","../src/error/notice-error/notice-error.ts","../src/utils/util/util.ts","../src/utils/interceptor/interceptor.ts","../src/utils/interceptor/core-interceptor.ts","../src/utils/message-center/base/message-base.ts","../src/utils/message-center/base/message-all.ts","../src/utils/message-center/command/command-base/command-base.ts","../src/utils/message-center/command/create/command-create.ts","../src/utils/message-center/command/update/command-update.ts","../src/utils/message-center/command/remove/command-remove.ts","../src/utils/message-center/command/change/command-change.ts","../src/utils/message-center/command/async-action/command-async-action.ts","../src/utils/message-center/command/message-command.ts","../src/utils/message-center/console/message-console.ts","../src/utils/message-center/message-center.ts","../src/utils/namespace/namespace.ts","../src/utils/net/http-response.ts","../src/utils/net/net.ts","../src/utils/string-util/string-util.ts","../src/utils/url-helper/url-helper.ts","../src/utils/event/event.ts","../src/utils/click-outside/click-outside.ts","../src/utils/color/color.ts","../src/utils/download-file/download-file.ts","../src/utils/upload/select-file.ts","../src/utils/upload/upload-file.ts","../src/utils/sync/await-timeout.ts","../src/utils/sync/count-latch.ts","../src/utils/style/remote-style.ts","../src/utils/recursive/find-recursive-child.ts","../src/utils/data-type/data-types.ts","../src/utils/clone/clone.ts","../src/utils/bit-mask/bit-mask.ts","../src/utils/logger/logger.ts","../src/ibizsys.ts","../src/install.ts"],"sourcesContent":["export async function getBytes(stream, onChunk) {\r\n const reader = stream.getReader();\r\n let result;\r\n while (!(result = await reader.read()).done) {\r\n onChunk(result.value);\r\n }\r\n}\r\nexport function getLines(onLine) {\r\n let buffer;\r\n let position;\r\n let fieldLength;\r\n let discardTrailingNewline = false;\r\n return function onChunk(arr) {\r\n if (buffer === undefined) {\r\n buffer = arr;\r\n position = 0;\r\n fieldLength = -1;\r\n }\r\n else {\r\n buffer = concat(buffer, arr);\r\n }\r\n const bufLength = buffer.length;\r\n let lineStart = 0;\r\n while (position < bufLength) {\r\n if (discardTrailingNewline) {\r\n if (buffer[position] === 10) {\r\n lineStart = ++position;\r\n }\r\n discardTrailingNewline = false;\r\n }\r\n let lineEnd = -1;\r\n for (; position < bufLength && lineEnd === -1; ++position) {\r\n switch (buffer[position]) {\r\n case 58:\r\n if (fieldLength === -1) {\r\n fieldLength = position - lineStart;\r\n }\r\n break;\r\n case 13:\r\n discardTrailingNewline = true;\r\n case 10:\r\n lineEnd = position;\r\n break;\r\n }\r\n }\r\n if (lineEnd === -1) {\r\n break;\r\n }\r\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength);\r\n lineStart = position;\r\n fieldLength = -1;\r\n }\r\n if (lineStart === bufLength) {\r\n buffer = undefined;\r\n }\r\n else if (lineStart !== 0) {\r\n buffer = buffer.subarray(lineStart);\r\n position -= lineStart;\r\n }\r\n };\r\n}\r\nexport function getMessages(onId, onRetry, onMessage) {\r\n let message = newMessage();\r\n const decoder = new TextDecoder();\r\n return function onLine(line, fieldLength) {\r\n if (line.length === 0) {\r\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);\r\n message = newMessage();\r\n }\r\n else if (fieldLength > 0) {\r\n const field = decoder.decode(line.subarray(0, fieldLength));\r\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1);\r\n const value = decoder.decode(line.subarray(valueOffset));\r\n switch (field) {\r\n case 'data':\r\n message.data = message.data\r\n ? message.data + '\\n' + value\r\n : value;\r\n break;\r\n case 'event':\r\n message.event = value;\r\n break;\r\n case 'id':\r\n onId(message.id = value);\r\n break;\r\n case 'retry':\r\n const retry = parseInt(value, 10);\r\n if (!isNaN(retry)) {\r\n onRetry(message.retry = retry);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n}\r\nfunction concat(a, b) {\r\n const res = new Uint8Array(a.length + b.length);\r\n res.set(a);\r\n res.set(b, a.length);\r\n return res;\r\n}\r\nfunction newMessage() {\r\n return {\r\n data: '',\r\n event: '',\r\n id: '',\r\n retry: undefined,\r\n };\r\n}\r\n//# sourceMappingURL=parse.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { getBytes, getLines, getMessages } from './parse';\r\nexport const EventStreamContentType = 'text/event-stream';\r\nconst DefaultRetryInterval = 1000;\r\nconst LastEventId = 'last-event-id';\r\nexport function fetchEventSource(input, _a) {\r\n var { signal: inputSignal, headers: inputHeaders, onopen: inputOnOpen, onmessage, onclose, onerror, openWhenHidden, fetch: inputFetch } = _a, rest = __rest(_a, [\"signal\", \"headers\", \"onopen\", \"onmessage\", \"onclose\", \"onerror\", \"openWhenHidden\", \"fetch\"]);\r\n return new Promise((resolve, reject) => {\r\n const headers = Object.assign({}, inputHeaders);\r\n if (!headers.accept) {\r\n headers.accept = EventStreamContentType;\r\n }\r\n let curRequestController;\r\n function onVisibilityChange() {\r\n curRequestController.abort();\r\n if (!document.hidden) {\r\n create();\r\n }\r\n }\r\n if (!openWhenHidden) {\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n }\r\n let retryInterval = DefaultRetryInterval;\r\n let retryTimer = 0;\r\n function dispose() {\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.clearTimeout(retryTimer);\r\n curRequestController.abort();\r\n }\r\n inputSignal === null || inputSignal === void 0 ? void 0 : inputSignal.addEventListener('abort', () => {\r\n dispose();\r\n resolve();\r\n });\r\n const fetch = inputFetch !== null && inputFetch !== void 0 ? inputFetch : window.fetch;\r\n const onopen = inputOnOpen !== null && inputOnOpen !== void 0 ? inputOnOpen : defaultOnOpen;\r\n async function create() {\r\n var _a;\r\n curRequestController = new AbortController();\r\n try {\r\n const response = await fetch(input, Object.assign(Object.assign({}, rest), { headers, signal: curRequestController.signal }));\r\n await onopen(response);\r\n await getBytes(response.body, getLines(getMessages(id => {\r\n if (id) {\r\n headers[LastEventId] = id;\r\n }\r\n else {\r\n delete headers[LastEventId];\r\n }\r\n }, retry => {\r\n retryInterval = retry;\r\n }, onmessage)));\r\n onclose === null || onclose === void 0 ? void 0 : onclose();\r\n dispose();\r\n resolve();\r\n }\r\n catch (err) {\r\n if (!curRequestController.signal.aborted) {\r\n try {\r\n const interval = (_a = onerror === null || onerror === void 0 ? void 0 : onerror(err)) !== null && _a !== void 0 ? _a : retryInterval;\r\n window.clearTimeout(retryTimer);\r\n retryTimer = window.setTimeout(create, interval);\r\n }\r\n catch (innerErr) {\r\n dispose();\r\n reject(innerErr);\r\n }\r\n }\r\n }\r\n }\r\n create();\r\n });\r\n}\r\nfunction defaultOnOpen(response) {\r\n const contentType = response.headers.get('content-type');\r\n if (!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith(EventStreamContentType))) {\r\n throw new Error(`Expected content-type to be ${EventStreamContentType}, Actual: ${contentType}`);\r\n }\r\n}\r\n//# sourceMappingURL=fetch.js.map","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable no-underscore-dangle */\n/* eslint-disable max-classes-per-file */\nclass Node<E> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static readonly Undefined = new Node<any>(undefined);\n\n element: E;\n\n next: Node<E>;\n\n prev: Node<E>;\n\n constructor(element: E) {\n this.element = element;\n this.next = Node.Undefined;\n this.prev = Node.Undefined;\n }\n}\n\nexport class LinkedList<E> {\n private _first: Node<E> = Node.Undefined;\n\n private _last: Node<E> = Node.Undefined;\n\n private _size: number = 0;\n\n get size(): number {\n return this._size;\n }\n\n isEmpty(): boolean {\n return this._first === Node.Undefined;\n }\n\n clear(): void {\n let node = this._first;\n while (node !== Node.Undefined) {\n const { next } = node;\n node.prev = Node.Undefined;\n node.next = Node.Undefined;\n node = next;\n }\n\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n this._size = 0;\n }\n\n unshift(element: E): () => void {\n return this._insert(element, false);\n }\n\n push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new Node(element);\n if (this._first === Node.Undefined) {\n this._first = newNode;\n this._last = newNode;\n } else if (atTheEnd) {\n // push\n const oldLast = this._last!;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n } else {\n // unshift\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n this._size += 1;\n\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n shift(): E | undefined {\n if (this._first === Node.Undefined) {\n return undefined;\n }\n const res = this._first.element;\n this._remove(this._first);\n return res;\n }\n\n pop(): E | undefined {\n if (this._last === Node.Undefined) {\n return undefined;\n }\n const res = this._last.element;\n this._remove(this._last);\n return res;\n }\n\n private _remove(node: Node<E>): void {\n if (node.prev !== Node.Undefined && node.next !== Node.Undefined) {\n // middle\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n } else if (node.prev === Node.Undefined && node.next === Node.Undefined) {\n // only node\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n } else if (node.next === Node.Undefined) {\n // last\n this._last = this._last!.prev!;\n this._last.next = Node.Undefined;\n } else if (node.prev === Node.Undefined) {\n // first\n this._first = this._first!.next!;\n this._first.prev = Node.Undefined;\n }\n\n // done\n this._size -= 1;\n }\n\n *[Symbol.iterator](): Iterator<E> {\n let node = this._first;\n while (node !== Node.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n","/* eslint-disable func-names */\n/* eslint-disable prefer-rest-params */\n/* eslint-disable no-underscore-dangle */\nimport { IDisposable } from '../interface';\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function once<T extends Function>(this: unknown, fn: T): T {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n let didCall = false;\n let result: unknown;\n\n return function () {\n if (didCall) {\n return result;\n }\n\n didCall = true;\n result = fn.apply(_this, arguments);\n\n return result;\n } as unknown as T;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n const self = {\n dispose: once(() => {\n fn();\n }),\n };\n return self;\n}\n\n/**\n * 函数防抖---“立即执行版本” 和 “非立即执行版本” 的组合版本\n *\n * @author chitanda\n * @date 2022-06-29 19:06:15\n * @export\n * @param {((...args: unknown[]) => void | Promise<void>)} func 处理函数\n * @param {number} wait 延迟执行时间(毫秒)\n * @param {boolean} [immediate] 是否立即执行\n * @return {*} {(...args: unknown[]) => void}\n */\nexport function debounce(\n func: (...args: unknown[]) => void | Promise<void>,\n wait: number,\n immediate?: boolean,\n): (...args: unknown[]) => void {\n let timer: unknown;\n\n return function (this: unknown, ...args: unknown[]): void {\n if (timer) {\n clearTimeout(timer as number);\n }\n if (immediate) {\n const callNow = !timer;\n timer = setTimeout(() => {\n timer = null;\n }, wait);\n if (callNow) {\n func.apply(this, args);\n }\n } else {\n timer = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n }\n };\n}\n\n/**\n * 节流函数\n *\n * @author chitanda\n * @date 2022-06-29 20:06:38\n * @export\n * @param {((...args: unknown[]) => void | Promise<void>)} fn\n * @param {number} wait\n * @return {*} {(...args: unknown[]) => void}\n */\nexport function throttle(\n fn: (...args: unknown[]) => void | Promise<void>,\n wait: number,\n): (...args: unknown[]) => void {\n let timer: unknown = null;\n return function (this: unknown, ...args: unknown[]): void {\n if (!timer) {\n timer = setTimeout(() => {\n fn.apply(this, args);\n timer = null;\n }, wait);\n }\n };\n}\n","import {\n ICommand,\n ICommandHandler,\n ICommandOption,\n ICommandRegistry,\n ICommandsMap,\n IDisposable,\n} from './interface';\nimport { LinkedList, toDisposable } from './utils';\n\n/**\n * 命令注册中心\n *\n * @author chitanda\n * @date 2022-06-27 13:06:50\n * @export\n * @class CommandRegisterService\n * @implements {ICommandRegistry}\n */\nexport class CommandsRegistry implements ICommandRegistry {\n /**\n * 已经注册的所有指令\n *\n * @author chitanda\n * @date 2022-07-21 15:07:47\n * @private\n */\n private readonly commands = new Map<string, LinkedList<ICommand>>();\n\n /**\n * 注册指令\n *\n * @author chitanda\n * @date 2022-06-27 13:06:31\n * @param {(string | ICommand)} idOrCommand\n * @param {ICommandHandler} [handler]\n * @return {*} {IDisposable}\n */\n registerCommand(\n idOrCommand: string | ICommand,\n handler?: ICommandHandler,\n opts?: ICommandOption,\n ): IDisposable {\n if (!idOrCommand) {\n throw new Error(`invalid command`);\n }\n\n if (typeof idOrCommand === 'string') {\n if (!handler) {\n throw new Error(`invalid command`);\n }\n return this.registerCommand({ id: idOrCommand, handler, opts });\n }\n\n const { id } = idOrCommand;\n\n let commands = this.commands.get(id);\n if (!commands) {\n commands = new LinkedList<ICommand>();\n this.commands.set(id, commands);\n }\n\n const removeFn = commands.unshift(idOrCommand);\n\n const ret = toDisposable(() => {\n removeFn();\n const command = this.commands.get(id);\n if (command?.isEmpty()) {\n this.commands.delete(id);\n }\n });\n\n return ret;\n }\n\n /**\n * 指令是否已经注册\n *\n * @author chitanda\n * @date 2022-07-21 15:07:58\n * @param {string} id\n * @return {*} {boolean}\n */\n hasCommand(id: string): boolean {\n return this.commands.has(id);\n }\n\n /**\n * 查找指令\n *\n * @author chitanda\n * @date 2022-07-21 16:07:12\n * @param {string} id\n * @return {*} {(ICommand | undefined)}\n */\n getCommand(id: string): ICommand | undefined {\n const list = this.commands.get(id);\n if (!list || list.isEmpty()) {\n return undefined;\n }\n return list[Symbol.iterator]().next().value;\n }\n\n /**\n * 获取所有指令\n *\n * @author chitanda\n * @date 2022-07-21 16:07:20\n * @return {*} {ICommandsMap}\n */\n getCommands(): ICommandsMap {\n const result = new Map<string, ICommand>();\n const keys = this.commands.keys();\n for (const key of keys) {\n const command = this.getCommand(key);\n if (command) {\n result.set(key, command);\n }\n }\n return result;\n }\n\n /**\n * 获取指令配置参数\n *\n * @author chitanda\n * @date 2022-07-21 16:07:27\n * @param {string} id\n * @return {*} {(ICommandOption | undefined)}\n */\n getCommandOpt(id: string): ICommandOption | undefined {\n const cmd = this.getCommand(id);\n return cmd?.opts;\n }\n}\n","import { ICommandHandler, ICommandOption, IDisposable } from './interface';\nimport { CommandsRegistry } from './command-register';\n\n/**\n * 指令控制器\n *\n * @author chitanda\n * @date 2022-06-28 19:06:51\n * @export\n * @class CommandController\n */\nexport class CommandController {\n private commandRegister = new CommandsRegistry();\n\n /**\n * 注册指令\n *\n * @author chitanda\n * @date 2022-06-28 19:06:45\n * @param {string} id\n * @param {ICommandHandler} handler\n * @param {ICommandOption} [opts]\n * @return {*} {IDisposable}\n */\n register(\n id: string,\n handler: ICommandHandler,\n opts?: ICommandOption,\n ): IDisposable {\n return this.commandRegister.registerCommand(id, handler, opts);\n }\n\n /**\n * 执行指令\n *\n * @author chitanda\n * @date 2022-06-28 19:06:38\n * @template T\n * @param {string} id\n * @param {...unknown[]} args\n * @return {*} {Promise<T>}\n */\n async execute<T = undefined>(id: string, ...args: unknown[]): Promise<T> {\n const command = this.commandRegister.getCommand(id);\n if (command) {\n return command.handler(...args) as T | Promise<T>;\n }\n throw new Error(`未注册指令: ${id},请先注册指令`);\n }\n\n /**\n * 判断指令是否存在,可直接抛出异常\n *\n * @author chitanda\n * @date 2022-06-28 19:06:11\n * @param {string} id\n * @param {boolean} [err]\n * @return {*} {boolean}\n */\n hasCommand(id: string, err?: boolean): boolean {\n const bol = !!this.commandRegister.hasCommand(id);\n if (err === true && bol === true) {\n throw new Error(`未注册指令: ${id},请先注册指令`);\n }\n return bol;\n }\n\n /**\n * 获取指令配置参数\n *\n * @author chitanda\n * @date 2022-07-21 17:07:11\n * @param {string} id\n * @return {*} {(ICommandOption | undefined)}\n */\n getCommandOpts(id: string): ICommandOption | undefined {\n return this.commandRegister.getCommandOpt(id);\n }\n}\n","import { CommandController } from './command';\n\nexport * from './interface';\nexport * from './utils';\nexport { CommandsRegistry } from './command-register';\nexport { CommandController } from './command';\n\n/**\n * 命令控制器\n */\nexport const commands = new CommandController();\n","/**\n * 核心全局静态变量\n *\n * @author chitanda\n * @date 2022-07-14 17:07:25\n * @export\n * @enum {number}\n */\nexport class CoreConst {\n /**\n * 默认模型服务标识\n */\n static readonly DEFAULT_MODEL_SERVICE_TAG = 'default';\n\n /**\n * 访问令牌标识\n *\n * @author chitanda\n * @date 2022-07-20 15:07:28\n * @static\n */\n static readonly TOKEN = 'ibzuaa-token';\n\n /**\n * 访问令牌标识过期时间\n *\n * @author lxm\n * @date 2023-02-13 07:11:33\n * @static\n * @memberof CoreConst\n */\n static readonly TOKEN_EXPIRES = 'ibzuaa-token-expires';\n}\n","/* eslint-disable @typescript-eslint/no-empty-function */\n/**\n * 无操作函数\n */\nexport const NOOP = (): void => {};\n","/**\n * 请求状态码文本\n */\nexport const HttpStatusMessageConst: Record<number, string> = {\n 200: '服务器成功返回请求的数据。',\n 201: '新建或修改数据成功。',\n 202: '一个请求已经进入后台排队(异步任务)。',\n 204: '删除数据成功。',\n 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',\n 401: '用户没有权限(令牌、用户名、密码错误)。',\n 403: '用户得到授权,但是访问是被禁止的。',\n 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',\n 406: '请求的格式不可得。',\n 410: '请求的资源被永久删除,且不会再得到的。',\n 422: '当创建一个对象时,发生一个验证错误。',\n 500: '服务器发生错误,请检查服务器。',\n 502: '网关错误。',\n 503: '服务不可用,服务器暂时过载或维护。',\n 504: '网关超时。',\n};\n","/* eslint-disable no-shadow */\n/**\n * 登录模式\n *\n * @author lxm\n * @date 2022-10-12 14:10:56\n * @export\n * @enum {number}\n */\nexport enum LoginMode {\n /**\n * 默认标准登录\n */\n DEFAULT = 'DEFAULT',\n /**\n * 自定义登录\n */\n CUSTOM = 'CUSTOM',\n /**\n * 中央认证登录\n */\n CAS = 'CAS',\n}\n","/* eslint-disable no-shadow */\n/**\n * 菜单权限校验模式\n *\n * @author lxm\n * @date 2022-10-12 14:10:56\n * @export\n * @enum {number}\n */\nexport enum MenuPermissionMode {\n /**\n * 混合模式(默认)\n */\n MIXIN = 'MIXIN',\n /**\n * 统一资源模式\n */\n RESOURCE = 'RESOURCE',\n /**\n * RT模式\n */\n RT = 'RT',\n}\n","import { clone } from 'ramda';\n\n/**\n * 上下文处理类\n *\n * @author chitanda\n * @date 2022-07-14 10:07:24\n * @export\n * @class IBizContext\n */\nexport class IBizContext implements IContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string | symbol]: any;\n\n /**\n * clone 后引用的上下文实例,需要在实例销毁时,同时销毁\n *\n * @author chitanda\n * @date 2023-03-13 16:03:31\n * @protected\n * @type {IBizContext[]}\n */\n protected declare _associationContext: IBizContext[];\n\n /**\n * 修改的父上下文\n *\n * @author lxm\n * @date 2022-12-08 18:12:16\n * @protected\n * @type {IData}\n */\n protected declare _context: IData;\n\n /**\n * 父的上下文源对象\n *\n * @author lxm\n * @date 2022-12-08 18:12:31\n * @type {IContext}\n */\n declare _parent?: IContext;\n\n /**\n * Creates an instance of IBizContext.\n *\n * @author chitanda\n * @date 2022-07-14 10:07:15\n * @param {IData} [context={}] 自身的上下文\n * @param {IContext} [parent]\n */\n // eslint-disable-next-line default-param-last\n private constructor(context: IData = {}, parent?: IContext) {\n Object.defineProperty(this, '_associationContext', {\n enumerable: false,\n value: [],\n });\n\n if (parent) {\n this.initWithParent(parent);\n }\n\n // 合并给入上下文\n Object.assign(this, context);\n }\n\n private initWithParent(parent: IContext): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n // 定义私有变量,存放父上下文源对象\n Object.defineProperty(this, '_parent', {\n enumerable: false,\n writable: true,\n value: parent,\n });\n\n // 定义私有变量,用于存储对父已有上下文的修改。\n Object.defineProperty(this, '_context', {\n enumerable: false,\n writable: true,\n value: {},\n });\n // 监控父上下文参数,自身不存在时从父取\n const properties: { [key: string]: PropertyDescriptor } = {};\n const keys = Object.keys(parent);\n keys.forEach(key => {\n if (Object.prototype.hasOwnProperty.call(this, key)) {\n // !已经定义的不重复定义,会报错\n return;\n }\n properties[key] = {\n enumerable: true,\n set(val: unknown): void {\n if (val == null) {\n self._context[key] = null;\n } else {\n self._context[key] = val;\n }\n },\n get(): IContext {\n if (self._context[key] !== undefined) {\n return self._context[key];\n }\n return self._parent![key];\n },\n };\n });\n Object.defineProperties(this, properties);\n }\n\n /**\n * 返回自身的上下文,独有的和与父有差异的。\n *\n * @author lxm\n * @date 2022-12-08 17:12:26\n * @returns {*} {IData}\n */\n getOwnContext(): IData {\n const result: IData = {};\n Object.keys(this).forEach(key => {\n // 父没有的,或者修改了父的上下文\n // 父不存在则返回所有自身的属性\n if (\n !this._parent ||\n !Object.prototype.hasOwnProperty.call(this._parent, key) ||\n Object.prototype.hasOwnProperty.call(this._context, key)\n ) {\n result[key] = this[key];\n }\n });\n return result;\n }\n\n /**\n * 销毁当前上下文对象\n *\n * @author chitanda\n * @date 2023-03-13 15:03:04\n */\n destroy(): void {\n this._parent = undefined;\n this._context = {};\n this._associationContext.forEach(item => {\n item.destroy();\n });\n }\n\n /**\n * 在非视图中,需要断开视图上下文联系时。只能使用 clone 创建新的局部上下文\n *\n * @author chitanda\n * @date 2023-03-13 16:03:13\n * @return {*} {IBizContext}\n */\n clone(): IBizContext {\n const newContext = new IBizContext(\n clone(this.getOwnContext()),\n this._parent,\n );\n this._associationContext.push(newContext);\n return newContext;\n }\n\n /**\n * 在不改变对象引用的情况下,重置上下文\n * 等效于重新实例化,但是引用不变\n * @author lxm\n * @date 2023-05-24 10:30:40\n * @param {IData} [context={}]\n * @param {IContext} [parent]\n */\n // eslint-disable-next-line default-param-last\n reset(context: IData = {}, parent?: IContext): void {\n // 清空_associationContext\n this._associationContext.forEach(item => {\n item.destroy();\n });\n // 置空parent相关属性\n if (this._parent) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this._parent = {} as any;\n this._context = {};\n }\n // 删除自身的属性,define的删不掉,上面置空了就不管了\n Object.keys(this).forEach(key => {\n try {\n delete this[key];\n } catch (error) {\n // 删不掉的不管了,上面已经变成uneducated了\n }\n });\n if (parent) {\n this.initWithParent(parent);\n }\n // 合并默认值\n Object.assign(this, context);\n }\n\n /**\n * 上下文只有在视图初始化时,调用 create 方法\n *\n * @author chitanda\n * @date 2023-03-13 16:03:32\n * @static\n * @param {IData} [context]\n * @param {IContext} [parent]\n * @return {*} {IContext}\n */\n static create(context?: IData, parent?: IContext): IBizContext {\n return new IBizContext(context, parent);\n }\n}\n","/* eslint-disable no-constructor-return */\n/**\n * 视图参数类\n * @author lxm\n * @date 2023-10-27 03:39:12\n * @export\n * @class IBizParams\n * @implements {IParams}\n */\nexport class IBizParams implements IParams {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string | symbol]: any;\n\n /**\n * 自身的属性\n * @author lxm\n * @date 2023-10-27 04:09:25\n * @protected\n * @type {IParams}\n */\n protected declare _params: IParams;\n\n /**\n * 父视图参数\n * @author lxm\n * @date 2023-10-27 04:08:59\n * @protected\n * @type {IParams}\n */\n protected declare _parent?: IParams;\n\n constructor(params?: IParams, parent?: IParams) {\n // 定义私有变量,存放父视图参数源对象\n Object.defineProperty(this, '_parent', {\n enumerable: false,\n configurable: true,\n writable: true,\n value: parent,\n });\n\n // 定义私有变量,用于存储对父已有视图参数的修改。\n Object.defineProperty(this, '_params', {\n enumerable: false,\n configurable: true,\n writable: true,\n value: params || {},\n });\n\n return this.createProxy();\n }\n\n /**\n * 创建代理\n *\n * @author lxm\n * @date 2023-10-27 03:53:14\n * @protected\n * @return {*} {IBizParams}\n */\n protected createProxy(): IBizParams {\n // 更新属性,缺的补充定义\n function updateKeyDefine(target: IParams, keys: string[]): void {\n keys.forEach(key => {\n if (!Object.prototype.hasOwnProperty.call(target, key)) {\n Object.defineProperty(target, key, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: undefined,\n });\n }\n });\n }\n\n return new Proxy(this, {\n set(target: IBizParams, p: string, value: unknown): boolean {\n if (['_params', '_parent'].includes(p)) {\n target[p] = value;\n } else {\n target._params[p] = value;\n }\n return true;\n },\n\n get(target: IBizParams, p: string | symbol, _receiver: unknown): unknown {\n if (target[p] !== undefined) {\n return target[p];\n }\n if (target._params[p] !== undefined) {\n return target._params[p];\n }\n if (target._parent && target._parent[p] !== undefined) {\n return target._parent[p];\n }\n },\n\n ownKeys(target: IBizParams): ArrayLike<string | symbol> {\n // 整合所有并排重\n const allKeys = [\n ...new Set([\n ...Object.keys(target._params),\n ...Object.keys(target._parent || {}),\n ]),\n ];\n updateKeyDefine(target, allKeys);\n return allKeys;\n },\n });\n }\n\n /**\n * 在不改变对象引用的情况下,重置视图参数\n * 等效于重新实例化,但是引用不变\n * @author lxm\n * @date 2023-10-27 05:24:45\n * @param {IParams} [params]\n * @param {IParams} [parent]\n */\n reset(params?: IParams, parent?: IParams): void {\n this._params = params || {};\n this._parent = parent;\n }\n\n /**\n * 销毁上下文,避免内存泄漏\n *\n * @author lxm\n * @date 2023-10-27 03:57:44\n */\n destroy(): void {\n this._params = {};\n this._parent = undefined;\n }\n}\n","import { LoginMode, MenuPermissionMode } from '../constant';\nimport { IEnvironment } from '../interface';\n\n/**\n * 环境变量\n */\nexport const Environment: IEnvironment = {\n dev: false,\n hub: true,\n enableMqtt: false,\n mqttUrl: '/portal/mqtt/mqtt',\n isEnableMultiLan: false,\n logLevel: 'ERROR',\n baseUrl: '/api',\n appId: '',\n pluginBaseUrl: './plugins',\n isLocalModel: false,\n remoteModelUrl: '/remotemodel',\n assetsUrl: './assets',\n dcSystem: '',\n downloadFileUrl: '/ibizutil/download',\n uploadFileUrl: '/ibizutil/upload',\n casLoginUrl: '',\n loginMode: LoginMode.DEFAULT,\n menuPermissionMode: MenuPermissionMode.MIXIN,\n enablePermission: true,\n routePlaceholder: '-',\n enableWfAllHistory: false,\n isMob: false,\n isSaaSMode: true,\n AppTitle: '应用',\n favicon: './favicon.ico',\n};\n","import { AxiosError, AxiosResponse } from 'axios';\n\n/**\n * 请求异常\n *\n * @author chitanda\n * @date 2022-09-18 17:09:10\n * @export\n * @class HttpError\n * @implements {Error}\n */\nexport class HttpError extends Error {\n name: string = 'HttpError';\n\n message: string;\n\n status: number;\n\n response?: AxiosResponse;\n\n constructor(err: AxiosError) {\n super('HttpError');\n const res = err.response;\n this.response = err.response;\n if (res) {\n if (res.data) {\n this.message = (res.data as IData).message;\n } else {\n this.message = res.statusText;\n }\n if (!this.message) {\n this.message = '网络异常,请稍后重试!';\n }\n this.status = res.status;\n } else {\n this.message = err.message;\n this.status = 500;\n }\n }\n}\n","/**\n * 未支持的模型\n *\n * @author chitanda\n * @date 2022-08-30 16:08:03\n * @export\n * @class ModelError\n */\nexport class ModelError extends Error {\n name: string = '未支持的模型';\n\n /**\n * Creates an instance of ModelError.\n *\n * @author chitanda\n * @date 2022-08-30 16:08:38\n * @param {IModelObject} model 模板未支持的模型\n * @param {string} [msg]\n */\n constructor(\n public model: IData,\n msg?: string,\n ) {\n super(`「${model.id}」模型${msg ? `: ${msg}` : ''}`);\n }\n}\n","/**\n * 运行时异常\n *\n * @author lxm\n * @date 2022-09-21 18:09:09\n * @export\n * @class RuntimeError\n * @implements {Error}\n */\nexport class RuntimeError extends Error {\n name: string = 'Runtime Error';\n\n constructor(public message: string) {\n super(message);\n }\n}\n","/**\n * 模型配置缺失\n *\n * @author chitanda\n * @date 2022-08-30 16:08:15\n * @export\n * @class DefectModelError\n * @extends {Error}\n */\nexport class RuntimeModelError extends Error {\n name: string = '模型配置缺失';\n\n /**\n * Creates an instance of DefectModelError.\n *\n * @author chitanda\n * @date 2022-08-30 16:08:58\n * @param {IModelObject} model 丢失配置的模型\n * @param {string} [msg] 缺失配置描述\n */\n constructor(\n public model: IData,\n msg?: string,\n ) {\n super(`「${model.id}」模型${msg ? `: ${msg}` : ''}`);\n }\n}\n","/**\n * 纯输出通知信息的异常\n *\n * @author lxm\n * @date 2022-09-21 18:09:09\n * @export\n * @class NoticeError\n * @implements {Error}\n */\nexport class NoticeError extends Error {\n name: string = 'notice Error';\n\n constructor(\n public message: string,\n public duration?: number,\n ) {\n super(message);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { debounce } from 'lodash-es';\nimport { getCookie } from 'qx-util';\nimport { isNotNil, isNil } from 'ramda';\nimport { CoreConst } from '../../constant';\n\n/**\n * 获取认证令牌\n *\n * @author chitanda\n * @date 2022-07-20 18:07:39\n * @export\n * @return {*} {(string | null)}\n */\nexport function getToken(): string | null {\n return getCookie(CoreConst.TOKEN);\n}\n\n/**\n * 判断两个数组是否有相同的元素\n *\n * @author lxm\n * @date 2022-09-20 19:09:29\n * @export\n * @param {any[]} arr1\n * @param {any[]} arr2\n * @returns {*} {boolean}\n */\nexport function isOverlap(arr1: any[], arr2: any[]): boolean {\n const newArr = Array.from(new Set([...arr1, ...arr2]));\n return newArr.length !== arr1.length + arr2.length;\n}\n\n/**\n * 是否元素相同\n * @author lxm\n * @date 2023-05-22 12:50:53\n * @export\n * @param {any[]} arr1\n * @param {any[]} arr2\n * @param {string} [field] 比较元素里的某个固定属性\n * @return {*} {boolean}\n */\nexport function isElementSame(\n arr1: any[],\n arr2: any[],\n field?: string,\n): boolean {\n if (arr1.length !== arr2.length) {\n return false;\n }\n const allElements = field\n ? [...arr1.map(item => item[field]), ...arr2.map(item => item[field])]\n : [...arr1, ...arr2];\n\n const newArr = Array.from(new Set(allElements));\n return newArr.length === arr1.length;\n}\n\n/**\n * 防抖并合并每次的参数,\n * 最后一次才会执行\n *\n * @author lxm\n * @date 2022-09-20 21:09:53\n * @export\n * @template T\n * @param {T} func 要防抖的函数\n * @param {(\n * oldParams: Parameters<T>,\n * newParams: Parameters<T>,\n * ) => Parameters<T>} mergeFunc 合并的回调函数\n * @param {number} [wait] 防抖的延迟毫秒数\n * @returns {*}\n */\nexport function debounceAndMerge<T extends (...args: any[]) => any>(\n func: T,\n mergeFunc: (\n oldParams: Parameters<T>,\n newParams: Parameters<T>,\n ) => Parameters<T>,\n wait?: number,\n): (...args: Parameters<T>) => any {\n // 缓存上一次的函数参数\n let oldParams: Parameters<T> | undefined;\n const debounceFunc = debounce((...params: Parameters<T>) => {\n // 防抖函数执行的时候清空缓存参数\n oldParams = undefined;\n return func(...params);\n }, wait);\n return (...args: Parameters<T>) => {\n // 合并参数,并把参数缓存到oldParams里,用新参数调用防抖函数\n let newParams = args;\n if (oldParams) {\n newParams = mergeFunc(oldParams, newParams);\n }\n oldParams = newParams;\n return debounceFunc(...newParams);\n };\n}\n\n/**\n * 防抖并合并每次的参数,最后一次才会执行\n * 绑定方法为异步方法,给每次调用返回最终执行那次的结果\n *\n * @author lxm\n * @date 2022-09-20 21:09:53\n * @export\n * @template T\n * @param {T} func 要防抖的函数\n * @param {(\n * oldParams: Parameters<T>,\n * newParams: Parameters<T>,\n * ) => Parameters<T>} mergeFunc 合并的回调函数\n * @param {number} [wait] 防抖的延迟毫秒数\n * @returns {*}\n */\nexport function debounceAndAsyncMerge<\n T extends (...args: any[]) => Promise<any>,\n>(\n func: T,\n mergeFunc: (\n oldParams: Parameters<T>,\n newParams: Parameters<T>,\n ) => Parameters<T>,\n wait?: number,\n): T {\n // 缓存上一次的函数参数\n let oldParams: Parameters<T> | undefined;\n let promises: Array<{ resolve: any; reject: any }> = [];\n const debounceFunc = debounce(async (...params: Parameters<T>) => {\n // 防抖函数执行的时候清空缓存参数\n oldParams = undefined;\n try {\n const result = await func(...params);\n promises.forEach(promise => {\n promise.resolve(result);\n });\n promises = [];\n return result;\n } catch (error) {\n promises.forEach(promise => {\n promise.reject(error);\n });\n promises = [];\n }\n }, wait);\n const fun = async (...args: Parameters<T>): Promise<unknown> => {\n // 合并参数,并把参数缓存到oldParams里,用新参数调用防抖函数\n let newParams = args;\n if (oldParams) {\n newParams = mergeFunc(oldParams, newParams);\n }\n oldParams = newParams;\n // 执行防抖函数\n debounceFunc(...newParams);\n return new Promise((resolve, reject) => {\n // 阻塞当前调用,当防抖函数被执行后返回\n promises.push({ resolve, reject });\n });\n };\n return fun as T;\n}\n\n/**\n * 把右侧的对象里非空的属性合并到左侧对象里\n * @author lxm\n * @date 2023-05-16 02:23:39\n * @param {IData} l\n * @param {IData} r\n */\nexport function mergeInLeft(l: IData, r: IData): void {\n Object.keys(r).forEach(key => {\n if (isNotNil(r[key])) {\n l[key] = r[key];\n }\n });\n}\n\n/**\n * 把右侧的对象里非空的属性合并到左侧对象属性为空里\n *\n * @author zk\n * @date 2023-06-01 02:06:36\n * @export\n * @param {IData} l\n * @param {IData} r\n */\nexport function mergeDefaultInLeft(l: IData, r: IData): void {\n Object.keys(r).forEach(key => {\n if (isNotNil(r[key]) && isNil(l[key])) {\n l[key] = r[key];\n }\n });\n}\n\n/**\n * 比较两个数组集合,找出相同和不同的元素\n * @author lxm\n * @date 2023-05-29 12:33:55\n * @export\n * @param {IData[]} arr1 数组一\n * @param {IData[]} arr2 数组二\n * @param {string} [keyField] 主键属性,有主键比较主键\n * @return {*} {{\n * more: IData[]; arr1多的元素\n * less: IData[]; arr1少的元素\n * same: IData[]; 相同的元素\n * }}\n */\nexport function compareArr(\n arr1: IData[],\n arr2: IData[],\n keyField?: string,\n): {\n more: IData[];\n less: IData[];\n same: IData[];\n} {\n const all = new Set([...arr1, ...arr2]);\n const more: IData[] = [];\n const less: IData[] = [];\n const same: IData[] = [];\n\n if (keyField) {\n const arr1Keys = arr1.map(item => item[keyField]);\n const arr2Keys = arr2.map(item => item[keyField]);\n all.forEach(item => {\n if (!arr1Keys.includes(item[keyField])) {\n less.push(item);\n return;\n }\n if (!arr2Keys.includes(item[keyField])) {\n more.push(item);\n return;\n }\n same.push(item);\n });\n } else {\n all.forEach(item => {\n if (!arr1.includes(item)) {\n less.push(item);\n return;\n }\n if (!arr2.includes(item)) {\n more.push(item);\n return;\n }\n same.push(item);\n });\n }\n\n return {\n more,\n less,\n same,\n };\n}\n\n/**\n * 转换为数字或undefined\n * - 如果是undefined或null 返回undefined\n * - 其他情况转成数字,能转成数字的返回数字,NaN的返回undefined\n * @author lxm\n * @date 2023-06-08 06:30:57\n * @param {unknown} value 值\n * @return {*} {(number | undefined)}\n */\nexport function toNumberOrNil(value: unknown): number | undefined {\n if (isNil(value)) {\n return undefined;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n return undefined;\n }\n return num;\n}\n\nconst SvgPattern = /<svg\\b[^>]*>[\\s\\S]*?<\\/svg>/;\n\n/**\n * 判断字符串是否是svg的格式\n * @author lxm\n * @date 2023-10-17 02:04:28\n * @export\n * @param {string} str\n * @return {*} {boolean}\n */\nexport function isSvg(str: string): boolean {\n return SvgPattern.test(str);\n}\n\n/**\n * 处理浮点数相加\n * @param {number} a\n * @param {number} b\n * @return {*}\n * @author: zhujiamin\n * @Date: 2023-11-08 17:04:09\n */\nexport function plus(a: number, b: number): number {\n let c;\n let d;\n try {\n c = a.toString().split('.')[1].length;\n } catch (f) {\n c = 0;\n }\n try {\n d = b.toString().split('.')[1].length;\n } catch (f) {\n d = 0;\n }\n const e = 10 ** Math.max(c, d);\n return (a * e + b * e) / e;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n AxiosInstance,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\n\n/**\n * 拦截器基类\n *\n * @author chitanda\n * @date 2022-07-20 18:07:11\n * @export\n * @class Interceptor\n */\nexport class Interceptor {\n /**\n * 请求拦截器绑定标识\n *\n * @author lxm\n * @date 2022-10-27 17:10:20\n * @private\n * @type {number}\n */\n private requestTag?: number;\n\n /**\n * 响应拦截器绑定标识\n *\n * @author lxm\n * @date 2022-10-27 17:10:19\n * @private\n * @type {number}\n */\n private responseTag?: number;\n\n /**\n * 请求之前处理\n *\n * @author lxm\n * @date 2022-10-27 17:10:41\n * @protected\n * @param {InternalAxiosRequestConfig} config\n * @returns {*} {Promise<InternalAxiosRequestConfig>}\n */\n protected async onBeforeRequest(\n config: InternalAxiosRequestConfig,\n ): Promise<InternalAxiosRequestConfig> {\n return config;\n }\n\n /**\n * 请求失败之后处理\n *\n * @author lxm\n * @date 2022-10-27 17:10:40\n * @protected\n * @param {*} error\n */\n protected onRequestError(error: Error): Promise<never> {\n // 处理请求错误\n return Promise.reject(error);\n }\n\n /**\n * 响应成功之后处理\n *\n * @author lxm\n * @date 2022-10-27 17:10:38\n * @protected\n * @param {AxiosResponse} config\n * @returns {*} {Promise<AxiosRequestConfig>}\n */\n protected async onResponseSuccess(\n config: AxiosResponse,\n ): Promise<AxiosResponse> {\n return config;\n }\n\n /**\n * 响应失败之后处理\n *\n * @author lxm\n * @date 2022-10-27 17:10:37\n * @protected\n * @param {*} _error\n */\n protected onResponseError(error: Error): Promise<never> {\n // 处理响应错误\n return Promise.reject(error);\n }\n\n /**\n * 使用拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:28\n * @param {AxiosInstance} instance\n */\n use(instance: AxiosInstance): void {\n this.requestTag = instance.interceptors.request.use(\n this.onBeforeRequest,\n this.onRequestError,\n );\n this.responseTag = instance.interceptors.response.use(\n this.onResponseSuccess,\n this.onResponseError,\n );\n }\n\n /**\n * 移出拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:27\n * @param {AxiosInstance} instance\n */\n eject(instance: AxiosInstance): void {\n if (this.requestTag) {\n instance.interceptors.request.eject(this.requestTag);\n }\n if (this.responseTag) {\n instance.interceptors.response.eject(this.responseTag);\n }\n }\n}\n","import { InternalAxiosRequestConfig } from 'axios';\nimport { getToken } from '../util/util';\nimport { Interceptor } from './interceptor';\n\n/**\n * 核心包拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:48\n * @export\n * @class CoreInterceptor\n * @extends {Interceptor}\n */\nexport class CoreInterceptor extends Interceptor {\n protected async onBeforeRequest(\n config: InternalAxiosRequestConfig,\n ): Promise<InternalAxiosRequestConfig> {\n config = await super.onBeforeRequest(config);\n\n const { headers } = config;\n\n // Set the access token.\n headers.set('Authorization', `Bearer ${getToken()}`);\n\n // Set the system ID.\n let systemId = ibiz.env.dcSystem;\n const { orgData } = ibiz;\n if (orgData) {\n if (orgData.systemid) {\n systemId = orgData.systemid;\n }\n if (orgData.orgid) {\n headers.set('srforgid', orgData.orgid);\n }\n }\n headers.set('srfsystemid', systemId);\n\n return config;\n }\n}\n","import { QXEvent } from 'qx-util';\nimport { IPortalMessage } from '../../../interface';\n\n/**\n * 消息事件\n *\n * @author chitanda\n * @date 2023-09-05 16:09:17\n * @interface MessageCenterEvent\n */\ninterface MessageCenterEvent {\n all: (msg: IPortalMessage) => void;\n}\n\n/**\n * 消息基类,各个类型消息继承此类\n *\n * @author chitanda\n * @date 2023-09-05 16:09:41\n * @export\n * @class MessageBase\n */\nexport abstract class MessageBase {\n /**\n * 事件\n *\n * @author chitanda\n * @date 2023-09-05 16:09:58\n * @protected\n * @type {QXEvent<MessageCenterEvent>}\n */\n protected evt: QXEvent<MessageCenterEvent> = new QXEvent(1000);\n\n constructor(protected parent?: MessageBase) {}\n\n /**\n * 推送标准结构消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:40\n * @param {IPortalMessage} msg\n */\n next(msg: IPortalMessage): void {\n this.evt.emit('all', msg);\n if (this.parent) {\n this.nextParent(msg);\n }\n }\n\n /**\n * 私有方法,专门向父级推送消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:08\n * @protected\n * @param {IPortalMessage} msg\n */\n protected nextParent(msg: IPortalMessage): void {\n if (this.parent) {\n this.parent.evt.emit('all', msg);\n this.parent.nextParent(msg);\n }\n }\n\n /**\n * 订阅消息\n *\n * @author chitanda\n * @date 2023-09-05 15:09:21\n * @param {(msg: IPortalMessage) => void} evt\n */\n on(cb: (msg: IPortalMessage) => void): void {\n this.evt.on('all', cb);\n }\n\n /**\n * 取消订阅\n *\n * @author chitanda\n * @date 2023-09-05 15:09:50\n * @param {(msg: IPortalMessage) => void} cb\n */\n off(cb: (msg: IPortalMessage) => void): void {\n this.evt.off('all', cb);\n }\n}\n","import { MessageBase } from './message-base';\n\n/**\n * 所有消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:34\n * @export\n * @class MessageAll\n * @extends {MessageBase}\n */\nexport class MessageAll extends MessageBase {}\n","import { createUUID } from 'qx-util';\nimport { IPortalMessage } from '../../../../interface';\nimport { MessageBase } from '../../base/message-base';\n\n/**\n * 指令消息基类\n *\n * @author chitanda\n * @date 2023-09-05 16:09:11\n * @export\n * @class CommandBase\n * @extends {MessageBase}\n */\nexport class CommandBase extends MessageBase {\n /**\n * 发送指令消息\n * @param data 更新的数据\n * @param subtype 数据更新 | 数据删除 | 数据创建\n */\n protected sendCommand(data: IData, subtype: IPortalMessage['subtype']): void {\n const msg: IPortalMessage = {\n messageid: createUUID(),\n messagename: 'command',\n type: 'COMMAND',\n subtype,\n data,\n };\n this.next(msg);\n }\n}\n","import { IAppDataEntity } from '../../interface';\nimport { CommandBase } from '../command-base/command-base';\n\n/**\n * 创建指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:57\n * @export\n * @class CommandCreate\n * @extends {CommandBase}\n */\nexport class CommandCreate extends CommandBase {\n /**\n * 发送新建的数据\n *\n * @author chitanda\n * @date 2023-09-05 17:09:13\n * @param {IAppDataEntity} data\n */\n send(data: IAppDataEntity): void {\n this.sendCommand(data, 'OBJECTCREATED');\n }\n}\n","import { IAppDataEntity } from '../../interface';\nimport { CommandBase } from '../command-base/command-base';\n\n/**\n * 更新指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:54\n * @export\n * @class CommandUpdate\n * @extends {CommandBase}\n */\nexport class CommandUpdate extends CommandBase {\n /**\n * 发送更新的数据\n *\n * @author chitanda\n * @date 2023-09-05 17:09:37\n * @param {IAppDataEntity} data\n */\n send(data: IAppDataEntity): void {\n this.sendCommand(data, 'OBJECTUPDATED');\n }\n}\n","import { IAppDataEntity } from '../../interface';\nimport { CommandBase } from '../command-base/command-base';\n\n/**\n * 删除指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:03\n * @export\n * @class CommandRemove\n * @extends {CommandBase}\n */\nexport class CommandRemove extends CommandBase {\n /**\n * 发送删除的数据\n *\n * @author chitanda\n * @date 2023-09-05 17:09:29\n * @param {IAppDataEntity} data\n */\n send(data: IAppDataEntity): void {\n this.sendCommand(data, 'OBJECTREMOVED');\n }\n}\n","import { CommandBase } from '../command-base/command-base';\n\n/**\n * 数据变更指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:49\n * @export\n * @class CommandChange\n * @extends {CommandBase}\n */\nexport class CommandChange extends CommandBase {}\n","import { IPortalAsyncAction } from '../../../../interface';\nimport { CommandBase } from '../command-base/command-base';\n\n/**\n * 异步作业指令消息\n *\n * @author chitanda\n * @date 2023-10-23 17:10:28\n * @export\n * @class CommandAsyncAction\n * @extends {CommandBase}\n */\nexport class CommandAsyncAction extends CommandBase {\n /**\n * 发送 异步作业 指令消息\n *\n * @author chitanda\n * @date 2023-10-23 17:10:46\n * @param {IPortalAsyncAction} data\n */\n send(data: IPortalAsyncAction): void {\n this.sendCommand(data, 'ASYNCACTION');\n }\n}\n","import { createUUID } from 'qx-util';\nimport { IPortalMessage } from '../../../interface';\nimport { MessageBase } from '../base/message-base';\nimport { CommandCreate } from './create/command-create';\nimport { CommandUpdate } from './update/command-update';\nimport { CommandRemove } from './remove/command-remove';\nimport { CommandChange } from './change/command-change';\nimport { CommandAsyncAction } from './async-action/command-async-action';\n\n/**\n * 指令消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:41\n * @export\n * @class MessageCommand\n * @extends {MessageBase}\n */\nexport class MessageCommand extends MessageBase {\n /**\n * 数据变更指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:15\n * @type {CommandChange}\n */\n readonly change: CommandChange = new CommandChange();\n\n /**\n * 新建消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:55\n * @type {CommandCreate}\n */\n readonly create: CommandCreate = new CommandCreate(this);\n\n /**\n * 更新消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:01\n * @type {CommandUpdate}\n */\n readonly update: CommandUpdate = new CommandUpdate(this);\n\n /**\n * 删除消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:05\n * @type {CommandRemove}\n */\n readonly remove: CommandRemove = new CommandRemove(this);\n\n /**\n * 异步作业指令消息\n *\n * @author chitanda\n * @date 2023-10-23 17:10:56\n * @type {CommandAsyncAction}\n */\n readonly asyncAction: CommandAsyncAction = new CommandAsyncAction(this);\n\n /**\n * 推送指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:50\n * @param {IPortalMessage} msg\n */\n next(msg: IPortalMessage): void {\n // 消息分子类型,子类型发完消息后,会让父发消息\n // 所以子类型有父时,会一级一级的往上发消息。不需要在此处发全局消息\n // change 特殊处理,不给父发消息\n switch (msg.subtype) {\n case 'OBJECTCREATED':\n this.create.next(msg);\n this.change.next(msg);\n break;\n case 'OBJECTUPDATED':\n this.update.next(msg);\n this.change.next(msg);\n break;\n case 'OBJECTREMOVED':\n this.remove.next(msg);\n this.change.next(msg);\n break;\n default:\n super.next(msg);\n }\n }\n\n protected nextParent(msg: IPortalMessage): void {\n switch (msg.subtype) {\n case 'OBJECTCREATED':\n this.change.next(msg);\n break;\n case 'OBJECTUPDATED':\n this.change.next(msg);\n break;\n case 'OBJECTREMOVED':\n this.change.next(msg);\n break;\n default:\n }\n super.nextParent(msg);\n }\n\n /**\n * 发送指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:35\n * @param {IData} data\n * @param {IPortalMessage['subtype']} subtype\n */\n send(data: IData, subtype: IPortalMessage['subtype']): void {\n const msg: IPortalMessage = {\n messageid: createUUID(),\n messagename: 'command',\n type: 'COMMAND',\n subtype,\n data,\n };\n this.next(msg);\n }\n}\n","import { createUUID } from 'qx-util';\nimport { IPortalMessage } from '../../../interface';\nimport { MessageBase } from '../base/message-base';\n\n/**\n * 日志消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:33\n * @export\n * @class MessageConsole\n * @extends {MessageBase}\n */\nexport class MessageConsole extends MessageBase {\n /**\n * 发送日志消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:25\n * @param {(IData | string)} data\n */\n send(data: IData | string): void {\n const msg: IPortalMessage = {\n messageid: createUUID(),\n messagename: 'console',\n type: 'CONSOLE',\n data,\n };\n this.next(msg);\n }\n}\n","import { IPortalMessage } from '../../interface';\nimport { MessageAll } from './base/message-all';\nimport { MessageCommand } from './command/message-command';\nimport { MessageConsole } from './console/message-console';\n\n/**\n * 界面消息中心\n *\n * @author chitanda\n * @date 2023-09-05 15:09:14\n * @export\n * @class MessageCenter\n */\nexport class MessageCenter {\n /**\n * 所有消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:12\n * @type {MessageAll}\n */\n protected all: MessageAll = new MessageAll();\n\n /**\n * 指令消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:28\n * @type {MessageCommand}\n */\n readonly command: MessageCommand = new MessageCommand(this.all);\n\n /**\n * 日志消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:48\n * @type {MessageConsole}\n */\n readonly console: MessageConsole = new MessageConsole(this.all);\n\n /**\n * 发送消息\n *\n * @author chitanda\n * @date 2023-09-05 15:09:49\n * @param {IPortalMessage} msg\n */\n next(msg: IPortalMessage): void {\n // 消息分子类型,子类型发完消息后,会让父发消息\n // 所以子类型有父时,会一级一级的往上发消息。不需要在此处发全局消息\n if (msg.type === 'COMMAND') {\n this.command.next(msg);\n } else if (msg.type === 'CONSOLE') {\n this.console.next(msg);\n } else {\n this.all.next(msg);\n }\n }\n\n /**\n * 订阅消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:32\n * @param {(msg: IPortalMessage) => void} callback\n */\n on(callback: (msg: IPortalMessage) => void): void {\n this.all.on(callback);\n }\n\n /**\n * 取消订阅\n *\n * @author chitanda\n * @date 2023-09-05 17:09:38\n * @param {(msg: IPortalMessage) => void} callback\n */\n off(callback: (msg: IPortalMessage) => void): void {\n this.all.off(callback);\n }\n}\n","export const defaultNamespace = 'ibiz';\nconst statePrefix = 'is-';\n\n/**\n * css bem 命名规则拼接\n * _bem('ibiz', 'layout') => ibiz-layout\n * _bem('ibiz', 'layout', '', 'title') => ibiz-layout__title\n * _bem('ibiz', 'layout', '', '', 'right') => ibiz-layout--right\n * _bem('ibiz', 'layout', '', 'title', 'right') => ibiz-layout__title--right\n * _bem('ibiz', 'layout', 'header', 'title', 'right') => ibiz-layout-header__title--right\n *\n * @author chitanda\n * @date 2022-09-06 11:09:42\n * @param {string} namespace 命名空间\n * @param {string} block 块\n * @param {string} blockSuffix 块后缀\n * @param {string} element 元素\n * @param {string} modifier 修饰符\n * @return {*} {string}\n */\nfunction _bem(\n namespace: string,\n block: string,\n blockSuffix?: string,\n element?: string,\n modifier?: string,\n): string {\n let cls = `${namespace}-${block}`;\n if (blockSuffix) {\n cls += `-${blockSuffix}`;\n }\n if (element) {\n cls += `__${element}`;\n }\n if (modifier) {\n cls += `--${modifier}`;\n }\n return cls;\n}\n\n/**\n * 全局样式处理命名空间\n *\n * @author chitanda\n * @date 2022-09-06 11:09:50\n * @export\n * @class Namespace\n */\nexport class Namespace {\n /**\n * 命名空间\n *\n * @author chitanda\n * @date 2022-09-06 12:09:01\n * @type {string}\n */\n namespace: string;\n\n /**\n * Creates an instance of Namespace.\n *\n * @author chitanda\n * @date 2022-09-06 12:09:12\n * @param {string} block 当前命名空间的根模块,例如组件的名称\n * @param {string} [namespace] 指定命名空间,未指定使用默认值 ibiz\n */\n constructor(\n protected block: string,\n namespace?: string,\n ) {\n this.namespace = namespace || defaultNamespace;\n }\n\n /**\n * namespace-block\n * namespace-block-blockSuffix\n *\n * @author chitanda\n * @date 2022-09-06 12:09:08\n * @param {string} [blockSuffix='']\n * @return {*} {string}\n */\n b(blockSuffix: string = ''): string {\n return _bem(this.namespace, this.block, blockSuffix, '', '');\n }\n\n /**\n * namespace-block__element\n *\n * @author chitanda\n * @date 2022-09-06 12:09:48\n * @param {string} [element]\n * @return {*} {string}\n */\n e(element?: string): string {\n return element ? _bem(this.namespace, this.block, '', element, '') : '';\n }\n\n /**\n * namespace-block--modifier\n *\n * @author chitanda\n * @date 2022-09-06 12:09:37\n * @param {string} [modifier]\n * @return {*} {string}\n */\n m(modifier?: string): string {\n return modifier ? _bem(this.namespace, this.block, '', '', modifier) : '';\n }\n\n /**\n * namespace-block-blockSuffix__element\n *\n * @author chitanda\n * @date 2022-09-06 12:09:52\n * @param {string} [blockSuffix]\n * @param {string} [element]\n * @return {*} {string}\n */\n be(blockSuffix?: string, element?: string): string {\n return blockSuffix && element\n ? _bem(this.namespace, this.block, blockSuffix, element, '')\n : '';\n }\n\n /**\n * namespace-block__element--modifier\n *\n * @author chitanda\n * @date 2022-09-06 12:09:19\n * @param {string} [element]\n * @param {string} [modifier]\n * @return {*} {string}\n */\n em(element?: string, modifier?: string): string {\n return element && modifier\n ? _bem(this.namespace, this.block, '', element, modifier)\n : '';\n }\n\n /**\n * namespace-block-blockSuffix--modifier\n *\n * @author chitanda\n * @date 2022-09-06 12:09:59\n * @param {string} [blockSuffix]\n * @param {string} [modifier]\n * @return {*} {string}\n */\n bm(blockSuffix?: string, modifier?: string): string {\n return blockSuffix && modifier\n ? _bem(this.namespace, this.block, blockSuffix, '', modifier)\n : '';\n }\n\n /**\n * namespace-block-blockSuffix__element--modifier\n *\n * @author chitanda\n * @date 2022-09-06 12:09:37\n * @param {string} [blockSuffix]\n * @param {string} [element]\n * @param {string} [modifier]\n * @return {*} {string}\n */\n bem(blockSuffix?: string, element?: string, modifier?: string): string {\n return blockSuffix && element && modifier\n ? _bem(this.namespace, this.block, blockSuffix, element, modifier)\n : '';\n }\n\n /**\n * 返回状态 class\n *\n * is('loading', false) => '';\n * is('loading', true) => 'is-loading';\n *\n * @author chitanda\n * @date 2022-09-06 12:09:57\n * @param {string} name\n * @param {boolean} [state]\n * @return {*} {string}\n */\n is(name: string, state?: boolean): string {\n return name && state ? `${statePrefix}${name}` : '';\n }\n\n /**\n * 生成使用到的 css 变量 style 对象\n *\n * @author chitanda\n * @date 2022-09-06 15:09:41\n * @param {Record<string, string>} object\n * @return {*} {Record<string, string>}\n */\n cssVar(object: Record<string, string>): Record<string, string> {\n const styles: Record<string, string> = {};\n for (const key in object) {\n if (object[key]) {\n styles[this.cssVarName(key)] = object[key];\n }\n }\n return styles;\n }\n\n /**\n * 生成使用到的 css block 变量 style 对象\n *\n * @author chitanda\n * @date 2022-09-06 15:09:03\n * @param {Record<string, string>} object\n * @return {*} {Record<string, string>}\n */\n cssVarBlock(object: Record<string, string>): Record<string, string> {\n const styles: Record<string, string> = {};\n for (const key in object) {\n if (object[key]) {\n styles[this.cssVarBlockName(key)] = object[key];\n }\n }\n return styles;\n }\n\n /**\n * 生成 css var 变量名称\n *\n * @author chitanda\n * @date 2022-09-06 15:09:21\n * @param {string} name\n * @return {*} {string}\n */\n cssVarName(name: string): string {\n return `--${this.namespace}-${name}`;\n }\n\n /**\n * 生成块 css var 变量名称\n *\n * @author chitanda\n * @date 2022-09-06 15:09:35\n * @param {string} name\n * @return {*} {string}\n */\n cssVarBlockName(name: string): string {\n return `--${this.namespace}-${this.block}-${name}`;\n }\n}\n","import axios, {\n AxiosResponse,\n AxiosResponseHeaders,\n InternalAxiosRequestConfig,\n RawAxiosResponseHeaders,\n} from 'axios';\n\n/**\n * Http请求返回接口\n *\n * @author chitanda\n * @date 2022-08-21 17:08:06\n * @export\n * @interface IHttpResponse\n * @extends {AxiosResponse}\n * @template T\n */\nexport interface IHttpResponse<T = IData> extends AxiosResponse {\n /**\n * 是否请求成功\n *\n * @description 当状态码为 200-299 时认为成功\n * @author chitanda\n * @date 2022-07-14 16:07:59\n * @type {boolean}\n */\n ok: boolean;\n /**\n * 是否为本地仿造响应\n *\n * @description 只有当值为 true 时, 才认为是本地仿造响应\n * @author chitanda\n * @date 2022-08-18 15:08:44\n * @type {boolean}\n */\n local: boolean;\n\n data: T;\n\n /**\n * 当前页\n */\n page?: number;\n\n /**\n * 分页条数\n */\n size?: number;\n\n /**\n * 总条数\n */\n total?: number;\n}\n\n/**\n * 本地请求仿造响应\n *\n * @author chitanda\n * @date 2022-08-21 17:08:00\n * @export\n * @class HttpResponse\n * @implements {IHttpResponse<T>}\n * @template T\n */\nexport class HttpResponse<T = IData> implements IHttpResponse<T> {\n /**\n * 本地仿造响应\n *\n * @author chitanda\n * @date 2022-08-18 15:08:06\n */\n local = true;\n\n ok = false;\n\n data: T;\n\n status: number;\n\n statusText: string;\n\n headers: RawAxiosResponseHeaders | AxiosResponseHeaders = {};\n\n config: InternalAxiosRequestConfig<IData> = {\n headers: new axios.AxiosHeaders(),\n };\n\n /**\n * Creates an instance of HttpResponse.\n *\n * @author chitanda\n * @date 2022-08-18 15:08:11\n * @param {unknown} [data] 返回的数据\n * @param {number} [status] 状态码 (默认为 200)\n * @param {string} [statusText] 状态描述 (默认为空字符)\n */\n constructor(data?: unknown, status?: number, statusText?: string) {\n this.data = data as T;\n this.status = status || 200;\n this.statusText = statusText || '';\n if (this.status >= 200 && this.status < 300) {\n this.ok = true;\n }\n }\n}\n","import axios, {\n AxiosError,\n RawAxiosRequestHeaders,\n AxiosResponse,\n AxiosRequestConfig,\n AxiosInstance,\n CreateAxiosDefaults,\n} from 'axios';\nimport {\n FetchEventSourceInit,\n fetchEventSource,\n} from '@microsoft/fetch-event-source';\nimport { merge } from 'lodash-es';\nimport qs from 'qs';\nimport { notNilEmpty } from 'qx-util';\nimport { mergeDeepRight } from 'ramda';\nimport { HttpError } from '../../error';\nimport { CoreInterceptor } from '../interceptor';\nimport { Interceptor } from '../interceptor/interceptor';\nimport { IHttpResponse } from './http-response';\nimport { getToken } from '../util/util';\n\n/**\n * 全局请求工具类\n *\n * @author chitanda\n * @date 2022-07-14 15:07:42\n * @export\n * @class Net\n */\nexport class Net {\n /**\n * axios实例\n *\n * @author lxm\n * @date 2022-10-27 17:10:18\n * @protected\n * @type {AxiosInstance}\n */\n protected instance: AxiosInstance;\n\n /**\n * 是否为 http || https 开头\n *\n * @author chitanda\n * @date 2022-11-07 14:11:28\n * @protected\n */\n protected urlReg = /^http[s]?:\\/\\/[^\\s]*/;\n\n /**\n * 请求等待队列,防止重复请求。当有完全相同请求参数的请求时,会等待上一个请求完成后把结果返回给当前请求,不会重复请求\n * key: 由请求的 config 生成的字符串,用于唯一标识请求\n * value: 当前正在请求的 Promise\n *\n * @author chitanda\n * @date 2023-06-07 14:06:19\n * @protected\n */\n protected waitRequest = new Map<string, Promise<AxiosResponse>>();\n\n protected get baseUrl(): string {\n return (\n this.instance.defaults.baseURL || `${ibiz.env.baseUrl}/${ibiz.env.appId}`\n );\n }\n\n /**\n * Creates an instance of Net.\n * @author lxm\n * @date 2022-10-27 16:10:05\n * @param {CreateAxiosDefaults} [config] 创建实例用的默认配置\n */\n constructor(config?: CreateAxiosDefaults) {\n this.instance = axios.create(config);\n this.addInterceptor('Default', new CoreInterceptor());\n }\n\n /**\n * 注册的拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:18\n * @type {Map<string, Interceptor>}\n */\n interceptors: Map<string, Interceptor> = new Map();\n\n /**\n * 添加拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:42\n * @param {string} name 唯一标识\n * @param {Interceptor} interceptor 拦截器\n */\n addInterceptor(name: string, interceptor: Interceptor): void {\n interceptor.use(this.instance);\n this.interceptors.set(name, interceptor);\n }\n\n /**\n * 删除拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:27\n * @param {string} name 唯一标识\n */\n removeInterceptor(name: string): void {\n const interceptor = this.interceptors.get(name);\n if (interceptor) {\n interceptor.eject(this.instance);\n this.interceptors.delete(name);\n }\n }\n\n /**\n * 预置config,绑定动态的配置\n *\n * @author lxm\n * @date 2022-10-27 16:10:48\n * @readonly\n * @protected\n * @type {AxiosRequestConfig}\n */\n protected get presetConfig(): AxiosRequestConfig {\n return {\n // 请求前缀路径\n baseURL: this.baseUrl,\n headers: {\n 'Content-Type': 'application/json;charset=UTF-8',\n Accept: 'application/json',\n },\n };\n }\n\n /**\n * 从左到右递归合并配置参数(内置第一个合并的预置参数)\n *\n * @author lxm\n * @date 2022-10-27 16:10:09\n * @protected\n * @param {...AxiosRequestConfig[]} configs\n * @returns {*}\n */\n protected mergeConfig(...configs: AxiosRequestConfig[]): AxiosRequestConfig {\n const config = this.presetConfig;\n if (configs.length === 0) {\n return config;\n }\n const { url } = configs[0];\n if (url && this.urlReg.test(url)) {\n delete config.baseURL;\n }\n return merge(config, ...configs);\n }\n\n /**\n * Post 请求\n *\n * @author chitanda\n * @date 2022-10-19 11:10:30\n * @param {string} url\n * @param {IData} data\n * @param {IParams} [params={}]\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async post(\n url: string,\n data: IData,\n params: IParams = {},\n headers: RawAxiosRequestHeaders = {},\n ): Promise<IHttpResponse> {\n url = this.handleAppPresetParam(url, params);\n try {\n const response = await this.request(url, {\n method: 'post',\n data,\n headers,\n });\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * Get 请求\n *\n * @author chitanda\n * @date 2022-10-19 11:10:24\n * @param {string} url\n * @param {IParams} [params={}]\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @param {IParams} [option={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async get(\n url: string,\n params: IParams = {},\n headers: RawAxiosRequestHeaders = {},\n option: AxiosRequestConfig = {},\n ): Promise<IHttpResponse> {\n url = this.attachUrlParam(url, params);\n try {\n const response = await this.request(\n url,\n merge({ method: 'get', headers }, option),\n );\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * Delete 请求\n *\n * @author chitanda\n * @date 2022-10-19 11:10:17\n * @param {string} url\n * @param {IParams} [params]\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async delete(\n url: string,\n params?: IParams,\n headers: RawAxiosRequestHeaders = {},\n ): Promise<IHttpResponse> {\n url = this.handleAppPresetParam(url, params);\n try {\n const response = await this.request(url, { method: 'delete', headers });\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * Put 请求\n *\n * @author chitanda\n * @date 2022-10-19 11:10:11\n * @param {string} url\n * @param {IData} data\n * @param {IParams} [params={}]\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async put(\n url: string,\n data: IData,\n params: IParams = {},\n headers: RawAxiosRequestHeaders = {},\n ): Promise<IHttpResponse> {\n url = this.handleAppPresetParam(url, params);\n try {\n const response = await this.request(url, {\n method: 'put',\n data,\n headers,\n });\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * 获取模型数据\n *\n * @author chitanda\n * @date 2022-07-14 15:07:15\n * @param {string} url\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async getModel(\n url: string,\n headers: RawAxiosRequestHeaders = {},\n ): Promise<IHttpResponse> {\n try {\n const response = await this.instance.get(url, {\n headers,\n });\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * 基础请求方法,会合并预置配置\n *\n * @author lxm\n * @date 2022-10-27 14:10:06\n * @param {string} url\n * @param {AxiosRequestConfig} [config={}]\n * @returns {*} {Promise<IHttpResponse>}\n */\n async request(\n url: string,\n config: AxiosRequestConfig = {},\n ): Promise<IHttpResponse> {\n // axios 请求参数配置\n const cfg = this.mergeConfig({ url }, config);\n // 当前请求的唯一标识\n const key = JSON.stringify(cfg);\n try {\n let requestPromise: Promise<AxiosResponse> | null = null;\n if (!this.waitRequest.has(key)) {\n requestPromise = this.instance.request(cfg);\n this.waitRequest.set(key, requestPromise);\n } else {\n requestPromise = this.waitRequest.get(key)!;\n }\n const response = await requestPromise;\n // 当第一个请求完成后就删除等待队列中的请求\n if (this.waitRequest.has(key)) {\n this.waitRequest.delete(key);\n }\n return this.doResponseResult(response);\n } catch (error) {\n // 请求异常删除等待队列中的请求体\n if (this.waitRequest.has(key)) {\n this.waitRequest.delete(key);\n }\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * 创建标准 axios 请求\n *\n * @author chitanda\n * @date 2023-01-30 15:01:27\n * @param {AxiosRequestConfig<IData>} config\n * @return {*}\n */\n axios(config: AxiosRequestConfig<IData>): Promise<AxiosResponse> {\n return axios(config);\n }\n\n /**\n * 触发 sse 请求\n *\n * @author chitanda\n * @date 2023-10-10 16:10:08\n * @param {string} url\n * @param {IParams} params\n * @param {FetchEventSourceInit} [options={}]\n * @return {*} {Promise<void>}\n */\n async sse(\n url: string,\n params: IParams,\n options: FetchEventSourceInit = {},\n ): Promise<void> {\n url = this.attachUrlParam(this.baseUrl + url, params);\n if (!options.headers) {\n options.headers = {};\n }\n const headers = options.headers!;\n // 补充基本认证信息\n {\n headers.Authorization = `Bearer ${getToken()}`;\n let systemId = ibiz.env.dcSystem;\n const { orgData } = ibiz;\n if (orgData) {\n if (orgData.systemid) {\n systemId = orgData.systemid;\n }\n if (orgData.orgid) {\n headers.srforgid = orgData.orgid;\n }\n }\n headers.srfsystemid = systemId;\n }\n const config = mergeDeepRight(\n {\n openWhenHidden: true,\n method: 'POST',\n },\n options,\n );\n await fetchEventSource(url, config);\n }\n\n /**\n * 统一处理请求返回\n *\n * @author chitanda\n * @date 2022-07-14 16:07:23\n * @private\n * @param {AxiosResponse} response\n * @return {*} {IHttpResponse}\n */\n private doResponseResult(response: AxiosResponse): IHttpResponse {\n const res = response as IHttpResponse;\n if (res.status >= 200 && res.status <= 299) {\n res.ok = true;\n }\n return res;\n }\n\n /**\n * 处理平台预定义参数\n *\n * @author chitanda\n * @date 2022-07-14 15:07:12\n * @private\n * @param {string} url\n * @param {IParams} [params]\n * @return {*} {string}\n */\n private handleAppPresetParam(url: string, params?: IParams): string {\n if (params) {\n const keys = Object.keys(params);\n const tempParam: IParams = {};\n keys.forEach((item: string) => {\n if (item.startsWith('srf') && notNilEmpty(params[item])) {\n tempParam[item] = params[item];\n }\n });\n return this.attachUrlParam(url, params);\n }\n return url;\n }\n\n /**\n * url 附加请求参数,并处理路径的字符转换 encode\n *\n * @author chitanda\n * @date 2022-07-14 15:07:34\n * @private\n * @param {string} url\n * @param {IParams} params\n * @return {*} {string}\n */\n private attachUrlParam(url: string, params: IParams): string {\n {\n // url 转码\n const urlSplit = url.split('?');\n urlSplit[0] = urlSplit[0]\n .split('/')\n .map(item => encodeURIComponent(item))\n .join('/');\n url = urlSplit.length > 1 ? urlSplit.join('?') : urlSplit[0];\n }\n const strParams: string = qs.stringify(params);\n if (notNilEmpty(strParams)) {\n if (url.endsWith('?')) {\n url = `${url}${strParams}`;\n } else if (url.indexOf('?') !== -1 && url.endsWith('&')) {\n url = `${url}${strParams}`;\n } else if (url.indexOf('?') !== -1 && !url.endsWith('&')) {\n url = `${url}&${strParams}`;\n } else {\n url = `${url}?${strParams}`;\n }\n }\n return url;\n }\n}\n","import { notNilEmpty } from 'qx-util';\n\n/**\n * 字符串工具类\n *\n * @author chitanda\n * @date 2021-04-23 20:04:27\n * @export\n * @class StringUtil\n */\nexport class StringUtil {\n /**\n * 上下文替换正则\n *\n * @author chitanda\n * @date 2021-04-23 20:04:01\n * @static\n */\n static contextReg = /\\$\\{context.[a-zA-Z_$][a-zA-Z0-9_$]{1,}\\}/g;\n\n /**\n * 数据替换正则\n *\n * @author chitanda\n * @date 2021-04-23 20:04:09\n * @static\n */\n static dataReg = /\\$\\{data.[a-zA-Z_$][a-zA-Z0-9_$]{1,}\\}/g;\n\n /**\n * 填充字符串中的数据\n *\n * @author chitanda\n * @date 2021-04-23 20:04:17\n * @static\n * @param {string} str\n * @param {*} [context]\n * @param {*} [data]\n * @return {*} {string}\n */\n static fill(str: string, context?: IContext, data?: IData): string {\n if (notNilEmpty(str)) {\n if (notNilEmpty(context)) {\n const strArr = str.match(this.contextReg);\n strArr?.forEach(_key => {\n const key = _key.slice(10, _key.length - 1);\n str = str.replace(`\\${context.${key}}`, context![key] || '');\n });\n }\n if (notNilEmpty(data)) {\n const strArr = str.match(this.dataReg);\n strArr?.forEach(_key => {\n const key = _key.slice(7, _key.length - 1);\n str = str.replace(`\\${data.${key}}`, data![key] || '');\n });\n }\n }\n return str;\n }\n}\n","/**\n * 路径解析助手\n *\n * @author lxm\n * @date 2022-10-11 14:10:12\n * @export\n * @class UrlHelper\n */\nexport class UrlHelper {\n /**\n * 路由路径前面的基础路径\n * 如:http://172.16.103.120:30061/portalwebapp/#/index/appportalview?params=123\n * 返回:http://172.16.103.120:30061/portalwebapp/#\n *\n * @author lxm\n * @date 2022-10-11 20:10:29\n * @returns {*}\n */\n static get routeBase(): string {\n const hashIndex = window.location.href.lastIndexOf('#/');\n return window.location.href.slice(0, hashIndex + 1);\n }\n\n /**\n * 应用的的基础路径\n * 如:http://172.16.103.120:30061/portalwebapp/#/index/appportalview?params=123\n * 返回:http://172.16.103.120:30061/portalwebapp\n *\n * @author lxm\n * @date 2022-10-11 20:10:29\n * @returns {*}\n */\n static get appBase(): string {\n const { origin, pathname } = window.location;\n return `${origin}${pathname}`.replace(/\\/$/, '');\n }\n\n /**\n * #开始到末尾,即路由地址\n * 如:http://172.16.103.120:30061/portalwebapp/#/index/appportalview?params=123\n * 返回:/index/appportalview?params=123\n *\n * @author lxm\n * @date 2022-10-11 16:10:40\n * @returns {*}\n */\n static get routePath(): string {\n return window.location.hash.replace('#', '');\n }\n\n /**\n * 当前地址的全路径,包含域名和参数\n * 如:http://172.16.103.120:30061/portalwebapp/#/index/appportalview?params=123\n *\n * @author lxm\n * @date 2022-10-11 21:10:39\n * @readonly\n * @static\n */\n static get fullPath(): string {\n return window.location.href;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { NOOP } from '../../constant';\n\n/**\n * 计算event的composedPath返回事件路径(兼容了IE)\n *\n * @author lxm\n * @date 2022-10-28 17:10:14\n * @param {MouseEvent} event\n * @returns {*}\n */\nexport function eventPath(event: MouseEvent): (EventTarget | null)[] {\n const path = ((event.composedPath && event.composedPath()) ||\n (event as any).path) as HTMLElement[] | undefined;\n\n if (path != null) return path;\n\n // 浏览器没有提供的,自己递归计算\n function getParents(\n node: HTMLElement,\n memo: HTMLElement[] = [],\n ): HTMLElement[] {\n const parentNode = node.parentNode as HTMLElement | null;\n\n return parentNode\n ? getParents(parentNode, memo.concat([parentNode]))\n : memo;\n }\n\n return [event.target].concat(getParents(event.target as HTMLElement));\n}\n\n/**\n * 监听JS原生事件,返回cleanup回调,调用后删除该监听\n *\n * @author lxm\n * @date 2022-10-28 18:10:36\n * @export\n * @param {EventTarget} target 监听对象\n * @param {string} eventName 监听事件名称\n * @param {(..._args: any[]) => any} listener 监听回调\n * @param {AddEventListenerOptions} options 额外参数\n * @returns {*} {() => void}\n */\nexport function listenJSEvent(\n target: EventTarget,\n eventName: string,\n listener: (..._args: any[]) => any,\n options: AddEventListenerOptions = {},\n): () => void {\n target.addEventListener(eventName, listener, options);\n\n let cleanup = (): void => {\n target.removeEventListener(eventName, listener, options);\n // cleanup方法只能调用一次\n cleanup = NOOP;\n };\n\n return () => {\n cleanup();\n };\n}\n\n/**\n * event是否是在目标元素内部触发的\n *\n * @author lxm\n * @date 2022-10-31 11:10:49\n * @export\n * @param {MouseEvent} event 原生事件\n * @param {HTMLElement} el 目标元素\n * @returns {*} {boolean}\n */\nexport function isEventInside(event: MouseEvent, el: HTMLElement): boolean {\n return el && (event.target === el || eventPath(event).includes(el));\n}\n","import { RuntimeError } from '../../error';\nimport {\n OnClickOutsideHandler,\n OnClickOutsideOptions,\n OnClickOutsideResult,\n} from '../../interface';\nimport { eventPath, isEventInside, listenJSEvent } from '../event/event';\n\nconst defaultWindow = typeof window !== 'undefined' ? window : undefined;\n\n/**\n * 监听目标元素之外的点击事件回调\n *\n * @author lxm\n * @date 2022-10-28 18:10:25\n * @export\n * @param {HTMLElement} target 目标元素\n * @param {OnClickOutsideHandler} handler 触发的时间回调\n * @param {OnClickOutsideOptions} [options={}] 额外配置参数\n * @returns {*} {OnClickOutsideResult}\n */\nexport function onClickOutside(\n target: HTMLElement,\n handler: OnClickOutsideHandler,\n options: OnClickOutsideOptions = {},\n): OnClickOutsideResult {\n const { window = defaultWindow, ignore = [], capture = true } = options;\n\n if (!target) throw new RuntimeError('target元素不存在');\n if (!window) throw new RuntimeError('找不到window');\n\n /** 是否需要监听,为false时handler不会执行 */\n let shouldListen = true;\n\n /**\n * 判断event的触发是否是在元素的外部(排除了ignore元素)\n * @param event 事件对象\n * @returns\n */\n const isOutside = (event: MouseEvent): boolean => {\n // 有一个判断是在内部,则不算外部,返回false\n return ![target, ...ignore].some(el => {\n return isEventInside(event, el);\n });\n };\n\n /** 暂停,所有监听的回调都不执行,用于增强某些ignore无法实现的场景 */\n let isPaused = false;\n const pause = (): void => {\n isPaused = true;\n };\n const proceed = (): void => {\n isPaused = false;\n };\n\n /** pointerup延时触发标识 */\n let fallback: number;\n\n /**\n * 事件监听处理回调\n * @param event 事件对象\n * @returns\n */\n const listener = (event: MouseEvent): void => {\n if (isPaused) return;\n window.clearTimeout(fallback);\n\n // 当需要监听并且最终触发在外部时才需要执行回调\n if (!(shouldListen && isOutside(event))) return;\n\n handler(event);\n };\n\n // 鼠标左键单击先后触发pointerdown,pointerup,click\n // 鼠标右键单击先后触发pointerdown,pointerup\n const cleanups = [\n listenJSEvent(window, 'click', listener, { passive: true, capture }),\n listenJSEvent(\n window,\n 'pointerdown',\n e => {\n if (isPaused) return;\n // 当pointerdown是在内部触发则不需要后续监听\n shouldListen = isOutside(e);\n },\n { passive: true },\n ),\n listenJSEvent(\n window,\n 'pointerup',\n e => {\n if (isPaused) return;\n // 鼠标左键触发才执行\n if (e.button === 0) {\n // 锁死结果避免延时执行时变更\n const path = eventPath(e);\n e.composedPath = (): (EventTarget | null)[] => path;\n fallback = window.setTimeout(() => listener(e), 50);\n }\n },\n { passive: true },\n ),\n ].filter(Boolean);\n\n /**\n * 停止事件监听,移除监听\n */\n const stop = (): void => cleanups.forEach(fn => fn());\n return { stop, pause, proceed };\n}\n","/* eslint-disable no-bitwise */\n/* eslint-disable no-nested-ternary */\nconst r = Math.round;\n\n/**\n * 把颜色字符串转成RGBA数组\n *\n * @param {string} color 颜色字符串\n * @returns {*} {number[]}\n */\nfunction toRGBA(color: string): number[] {\n const l = color.length;\n const rgba = [];\n if (color.slice(0, 3).toLowerCase() === 'rgb') {\n const d = color.match(/([\\d|.%]{1,3})/g)!;\n rgba[0] = parseInt(d[0], 10);\n rgba[1] = parseInt(d[1], 10);\n rgba[2] = parseInt(d[2], 10);\n rgba[3] = d[3]\n ? d[3].indexOf('%') !== -1\n ? parseInt(d[3], 10) / 100\n : parseFloat(d[3])\n : 1;\n } else {\n let d: number;\n if (l < 6)\n d = parseInt(\n String(color[1]) +\n color[1] +\n color[2] +\n color[2] +\n color[3] +\n color[3] +\n (l > 4 ? String(color[4]) + color[4] : ''),\n 16,\n );\n else d = parseInt(color.slice(1), 16);\n rgba[0] = (d >> 16) & 255;\n rgba[1] = (d >> 8) & 255;\n rgba[2] = d & 255;\n rgba[3] =\n l === 9 || l === 5 ? r((((d >> 24) & 255) / 255) * 10000) / 10000 : 1;\n }\n return rgba;\n}\n\n/**\n * 混合两种颜色,颜色格式支持hex和rgb\n * 如:#46b5d555,#fff\n * rgb(245 245 245 / 80%)\n *\n * @param {string} color1 颜色1\n * @param {string} color2 颜色2\n * @param {number} [p=0.5] 颜色1占多少百分比,小数格式\n * @param {(\"hex\" | \"rgb\")} [format=\"hex\"] 输出的格式,hex或rgb\n * @returns {*}\n */\nexport function colorBlend(\n color1: string,\n color2: string,\n p = 0.5,\n format: 'hex' | 'rgb' = 'hex',\n): string {\n color1 = color1.trim();\n color2 = color2.trim();\n const c1 = toRGBA(color1);\n const c2 = toRGBA(color2);\n const result = [\n r((1 - p) * c1[0] + p * c2[0]),\n r((1 - p) * c1[1] + p * c2[1]),\n r((1 - p) * c1[2] + p * c2[2]),\n (1 - p) * c1[3] + p * c2[3],\n ];\n if (format === 'hex') {\n const hex = [\n result[0].toString(16),\n result[1].toString(16),\n result[2].toString(16),\n result[3] === 0 ? '00' : r(result[3] * 255).toString(16),\n ];\n return `#${hex[0]}${hex[1]}${hex[2]}${hex[3]}`;\n }\n return `rgb(${result[0]} ${result[1]} ${result[2]} / ${result[3]})`;\n}\n","/**\n * 根据文件名称计算Mime类型\n *\n * @author lxm\n * @date 2022-11-16 22:11:02\n * @export\n * @param {string} fileName\n * @returns {*}\n */\nexport function calcMimeByFileName(fileName: string): string {\n const ext = fileName.split('.').pop();\n let mime = '';\n switch (ext) {\n case '.wps':\n mime = 'application/kswps';\n break;\n case '.doc':\n mime = 'application/msword';\n break;\n case '.docx':\n mime =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n break;\n case '.txt':\n mime = 'text/plain';\n break;\n case '.zip':\n mime = 'application/zip';\n break;\n case '.png':\n mime = 'image/png';\n break;\n case '.gif':\n mime = 'image/gif';\n break;\n case '.jpeg':\n mime = 'image/jpeg';\n break;\n case '.jpg':\n mime = 'image/jpeg';\n break;\n case '.rtf':\n mime = 'application/rtf';\n break;\n case '.avi':\n mime = 'video/x-msvideo';\n break;\n case '.gz':\n mime = 'application/x-gzip';\n break;\n case '.tar':\n mime = 'application/x-tar';\n break;\n case '.xlsx':\n mime = 'application/vnd.ms-excel';\n break;\n default:\n mime = '';\n }\n return mime;\n}\n\n/**\n * 判断是否是图片格式\n *\n * @author lxm\n * @date 2022-11-21 13:11:23\n * @export\n * @param {string} fileName\n * @returns {*} {boolean}\n */\nexport function isImage(fileName: string): boolean {\n const ext = fileName.split('.').pop();\n if (!ext) {\n return false;\n }\n const imageTypes = ['.jpeg', 'jpg', 'gif', 'png', 'bmp', 'svg'];\n return imageTypes.includes(ext);\n}\n\n/**\n * 纯JS触发下载文件\n *\n * @author lxm\n * @date 2022-11-16 22:11:24\n * @export\n * @param {Blob} file 文件流Blob\n * @param {string} fileName 文件名称\n */\nexport function downloadFileFromBlob(file: Blob, fileName: string): void {\n // 获取文件名\n const filetype = calcMimeByFileName(fileName);\n // 用blob对象获取文件流\n const blob = new Blob([file], { type: filetype });\n // 通过文件流创建下载链接\n const href = URL.createObjectURL(blob);\n // 创建一个a元素并设置相关属性\n const a = document.createElement('a');\n a.href = href;\n a.download = fileName;\n // 添加a元素到当前网页\n document.body.appendChild(a);\n // 触发a元素的点击事件,实现下载\n a.click();\n // 从当前网页移除a元素\n document.body.removeChild(a);\n // 释放blob对象\n URL.revokeObjectURL(href);\n}\n","import { merge } from 'lodash-es';\n\n/**\n * 文件List转数组\n *\n * @author lxm\n * @date 2022-11-18 13:11:03\n * @export\n * @param {FileList} fileList\n * @returns {*}\n */\nexport function fileListToArr(fileList: FileList): File[] {\n const files = [];\n for (let i = 0; i < fileList.length; i++) {\n files.push(fileList[i]);\n }\n return files;\n}\n\n/**\n * JS打开文件上传操作配置参数\n *\n * @author lxm\n * @date 2022-11-20 21:11:47\n * @export\n * @interface SelectFileOpts\n */\nexport interface SelectFileOpts {\n /**\n * 接受的文件类型\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @type {string}\n */\n accept?: string;\n /**\n * 是否支持多选\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @type {boolean}\n */\n multiple?: boolean;\n /**\n * 选中文件后回调\n *\n * @author lxm\n * @date 2022-11-20 21:11:50\n */\n onSelected: (_fileList: File[]) => void;\n}\n\n/**\n * JS打开文件上传操作\n *\n * @author lxm\n * @date 2022-11-20 21:11:31\n * @export\n * @param {SelectFileOpts} _opts 配置参数\n */\nexport function selectFile(_opts: SelectFileOpts): void {\n const opts: Required<SelectFileOpts> = merge(\n {\n multiple: true,\n accept: '',\n },\n _opts,\n );\n const input = document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('multiple', `${opts.multiple}`);\n input.setAttribute('accept', opts.accept);\n input.onchange = (e): void => {\n const inputEl = e.target as HTMLInputElement;\n const files = inputEl.files ? fileListToArr(inputEl.files) : [];\n if (files.length === 0) {\n return;\n }\n opts.onSelected(files);\n inputEl.value = ''; // 如果不置空,相同的文件不会触发change事件\n };\n document.body.appendChild(input);\n input.click();\n document.body.removeChild(input);\n}\n","/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable no-param-reassign */\nimport { cloneDeep, isFunction, merge, round, uniqueId } from 'lodash-es';\nimport { RuntimeError } from '../../error';\nimport { HttpResponse } from '../net/http-response';\nimport { selectFile } from './select-file';\n\nexport interface IUploadFile {\n name: string;\n uid: string;\n status: 'uploading' | 'finished' | 'fail' | 'cancel';\n percentage: number;\n response?: HttpResponse;\n error?: unknown;\n}\n\nexport interface IUploadFileOpts {\n uploadUrl: string;\n /**\n * 接受的文件类型\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @type {string}\n */\n accept?: string;\n /**\n * 是否支持多选\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @type {Boolean}\n */\n multiple?: boolean;\n separate?: string;\n request?: (_files: File[]) => Promise<HttpResponse>;\n beforeUpload?: (_fileData: File[], _files: IUploadFile[]) => boolean;\n finish?: (_resultFiles: IUploadFile[]) => void;\n success?: (_resultFiles: IUploadFile[], _res: HttpResponse) => void;\n error?: (_resultFiles: IUploadFile[], _error: unknown) => void;\n progress?: (_files: IUploadFile[]) => void;\n}\n\n/**\n * 使用上传文件逻辑\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @export\n * @param {IUploadFileOpts} _opts\n * @returns {*}\n */\nexport function uploadFile(_opts: IUploadFileOpts): void {\n const opts: Required<IUploadFileOpts> = merge(\n {\n multiple: true,\n accept: '',\n separate: true,\n beforeUpload: (_fileData: File[], _files: IUploadFile[]) => true,\n finish: (_resultFiles: IUploadFile[]) => {},\n success: (_resultFiles: IUploadFile[], _res: HttpResponse) => {},\n error: (_resultFiles: IUploadFile[], _error: unknown) => {},\n progress: (_files: IUploadFile[]) => {},\n },\n _opts,\n );\n\n /**\n * 进度条回调\n *\n * @author lxm\n * @date 2022-11-20 21:11:47\n * @param {IParams} event\n * @param {IUploadFile[]} files\n */\n const onUploadProgress = (event: IParams, files: IUploadFile[]): void => {\n files.forEach(file => {\n file.percentage = round(event.progress * 100);\n });\n opts.progress(cloneDeep(files));\n };\n\n /**\n * 上传请求方法,返回响应对象\n *\n * @author lxm\n * @date 2022-11-18 13:11:57\n * @param {File[]} files\n * @returns {*} {Promise<HttpResponse>}\n */\n const uploadRequest = async (\n files: File[],\n _onProgress: (_event: IParams) => void,\n ): Promise<HttpResponse> => {\n // 自定义上传请求\n if (opts.request && isFunction(opts.request)) {\n return opts.request(files);\n }\n\n // 默认每次单个文件上传,可能存在接口一次上传多个文件,\n const data = new FormData();\n files.forEach(file => {\n data.append('file', file);\n });\n // const res = await ibiz.net.request(opts.uploadUrl, {\n // method: 'post',\n // baseURL: '',\n // data,\n // headers: { 'Content-Type': 'multipart/form-data' },\n // onUploadProgress: onProgress,\n // });\n // return res;\n throw new RuntimeError(`多应用模式等待重新实现请求`);\n };\n\n /**\n * 执行一次上传,可能是一个文件也可能是多个文件\n *\n * @author lxm\n * @date 2022-11-18 14:11:54\n * @param {File[]} files 此次上传文件的集合\n * @returns {*} {Promise<IUploadFile[]>}\n */\n const executeSingleUpload = async (files: File[]): Promise<IUploadFile[]> => {\n const resultFiles: IUploadFile[] = files.map(file => {\n return {\n status: 'uploading',\n name: file.name,\n uid: uniqueId(),\n percentage: 0,\n };\n });\n\n // 上传前回调,可以取消此次下载\n const pass = opts.beforeUpload(files, resultFiles);\n if (!pass) {\n resultFiles.forEach(file => {\n file.status = 'cancel';\n });\n ibiz.log.debug('取消上传', resultFiles);\n return resultFiles;\n }\n\n try {\n const res = await uploadRequest(files, event => {\n onUploadProgress(event, resultFiles);\n });\n resultFiles.forEach(file => {\n file.status = 'finished';\n });\n // 上传成功事件\n opts.success(resultFiles, res);\n resultFiles.forEach(file => {\n file.response = res;\n });\n } catch (error) {\n resultFiles.forEach(file => {\n file.status = 'fail';\n });\n // 上传失败事件\n opts.error(resultFiles, error);\n resultFiles.forEach(file => {\n file.error = error;\n });\n ibiz.log.error(error);\n ibiz.log.error(`${files.map(file => file.name).join(',')}上传失败`);\n }\n return resultFiles;\n };\n\n /**\n * 执行上传文件逻辑\n *\n * @author lxm\n * @date 2022-11-18 13:11:21\n * @param {files} File[] 文件集合\n */\n const uploadFiles = async (files: File[]): Promise<void> => {\n const uploadSequence = opts.separate ? files.map(file => [file]) : [files];\n const res = await Promise.allSettled(\n uploadSequence.map(async sequence => {\n return executeSingleUpload(sequence);\n }),\n );\n\n // 整合所有的返回文件\n const resultFiles: IUploadFile[] = [];\n res.forEach(result => {\n if (result.status === 'fulfilled') {\n resultFiles.push(...result.value);\n }\n });\n\n opts.finish(resultFiles);\n };\n\n const select = (): void => {\n selectFile({\n accept: opts.accept,\n multiple: opts.multiple,\n onSelected: files => {\n uploadFiles(files);\n },\n });\n };\n\n select();\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * 设置延迟wait毫米后执行fun方法,返回fun的返回值\n *\n * @author lxm\n * @date 2023-03-06 08:20:57\n * @export\n * @template T\n * @param {number} wait\n * @param {T} fun\n * @param {any[]} params\n * @returns {*} {Promise<ReturnType<T>>}\n */\nexport async function awaitTimeout<T extends (...args: any) => any>(\n wait: number,\n fun?: T,\n params?: any[],\n): Promise<ReturnType<T> | undefined> {\n await new Promise(resolve => {\n setTimeout(() => {\n resolve(true);\n }, wait);\n });\n if (fun) {\n return fun(...(params || []));\n }\n}\n","import { RuntimeError } from '../../error';\n\n/**\n * 计数插销工具类\n *\n * @author lxm\n * @date 2022-11-24 19:11:49\n * @export\n * @class CountLatch\n */\nexport class CountLatch {\n private promise: Promise<void> | null = null;\n\n private resolve: ((value: void) => void) | null = null;\n\n /**\n * 计数,当前等待的异步逻辑个数\n *\n * @author lxm\n * @date 2022-11-24 19:11:59\n * @type {number}\n */\n count: number = 0;\n\n /**\n * 开启promise\n *\n * @author lxm\n * @date 2022-11-24 19:11:32\n * @private\n */\n private startPromise(): void {\n this.promise = new Promise(resolve => {\n this.resolve = resolve;\n });\n }\n\n /**\n * 结束promise\n *\n * @author lxm\n * @date 2022-11-24 19:11:44\n * @private\n */\n private endPromise(): void {\n if (this.resolve) {\n this.resolve();\n this.resolve = null;\n this.promise = null;\n }\n }\n\n /**\n * 上锁,计数加一\n * 第一次计数,开启异步\n *\n * @author lxm\n * @date 2022-11-24 19:11:27\n */\n lock(): void {\n this.count += 1;\n if (!this.promise) {\n this.startPromise();\n }\n }\n\n /**\n * 解锁,计数减一\n * 归零时结束异步\n *\n * @author lxm\n * @date 2022-11-24 19:11:47\n */\n unlock(): void {\n if (this.count < 1) {\n throw new RuntimeError('lock和unlock次数不匹配!');\n }\n this.count -= 1;\n if (this.count === 0) {\n this.endPromise();\n }\n }\n\n /**\n * 等待,计数归零异步结束\n *\n * @author lxm\n * @date 2022-11-24 19:11:20\n */\n async await(): Promise<void> {\n if (this.promise) {\n await this.promise;\n }\n }\n}\n","/**\n * 设置远程样式表\n *\n * @author lxm\n * @date 2023-02-09 05:46:49\n * @export\n * @param {string} url\n * @returns {*} {Promise<void>}\n */\nexport async function setRemoteStyle(url: string): Promise<void> {\n try {\n const res = await ibiz.net.get(url);\n const styleDom = document.createElement('style');\n styleDom.setAttribute('title', 'app-style-css');\n styleDom.innerText = res.data as unknown as string;\n document.head.appendChild(styleDom);\n } catch (error) {\n ibiz.log.debug('加载远程样式表失败', url);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { mergeDeepRight } from 'ramda';\n\n/** 默认配置参数 */\nconst IterateOpts = {\n /** 子集合属性数组 */\n childrenFields: ['children'],\n};\n\nconst BreakError = new Error('中断操作');\n\n/**\n * 获取子属性集合\n * @author lxm\n * @date 2023-04-20 08:54:32\n * @param {IData} parent\n * @param {string[]} fields 子集合可能的属性名称\n * @return {*} {(IData[] | undefined)}\n */\nfunction getChildField(parent: IData, fields: string[]): IData[] | undefined {\n for (const field of fields) {\n if (parent[field]?.length) {\n return parent[field];\n }\n }\n}\n\nfunction _recursiveIterate(\n parent: IData,\n callback: (item: any) => boolean | void,\n opts?: Partial<typeof IterateOpts>,\n): void {\n const { childrenFields } = mergeDeepRight(IterateOpts, opts || {});\n const children = getChildField(parent, childrenFields);\n if (children?.length) {\n for (const child of children) {\n // 递归自身的子成员\n const isBreak = callback(child);\n // 如果回调返回true则退出\n if (isBreak) {\n throw BreakError;\n }\n\n // 递归孙的成员\n recursiveIterate(child, callback, opts);\n }\n }\n}\n\n/**\n * 递归遍历子元素\n * @author lxm\n * @date 2023-04-23 09:07:06\n * @export\n * @param {IData} parent 父元素\n * @param {(item: any) => boolean} callback 每一个子元素的回调\n * @param {Partial<typeof IterateOpts>} [opts]\n */\nexport function recursiveIterate(\n parent: IData,\n callback: (item: any) => boolean | void,\n opts?: Partial<typeof IterateOpts>,\n): void {\n try {\n _recursiveIterate(parent, callback, opts);\n } catch (error) {\n if (error !== BreakError) {\n throw error;\n }\n }\n}\n\n/** 默认配置参数 */\nconst CompareOpts = {\n ...IterateOpts,\n /** 比较的属性 */\n compareField: 'name',\n};\n\ntype ICompareOpts = Partial<typeof CompareOpts> & {\n /**\n * 自定义比较回调\n * @author lxm\n * @date 2023-04-23 09:06:42\n */\n compareCallback?: (\n child: IData,\n key: string,\n compareField: string,\n ) => boolean;\n};\n\n/**\n * 递归查找子元素\n * @author lxm\n * @date 2023-04-20 08:53:35\n * @export\n * @param {IData} parent 父对象\n * @param {string} key 子元素的比较属性的值\n * @param {ICompareOpts} [opts]\n * @return {*} {(IData | undefined)}\n */\nexport function findRecursiveChild(\n parent: IData,\n key: string,\n opts?: ICompareOpts,\n): IData | undefined {\n const { compareField, compareCallback } = mergeDeepRight(\n CompareOpts,\n opts || {},\n );\n\n // 默认比较方法\n const _compareCallback =\n compareCallback ||\n ((child: IData): boolean => {\n return child[compareField] === key;\n });\n\n // 递归遍历,找到后中断遍历,返回找到项\n let find;\n recursiveIterate(\n parent,\n item => {\n if (_compareCallback(item, key, compareField)) {\n find = item;\n return true;\n }\n },\n opts,\n );\n return find;\n}\n","/**\n * 数据类型转换识别工具类\n * @author lxm\n * @date 2023-08-25 04:33:49\n * @export\n * @class DataTypes\n */\nexport class DataTypes {\n /**\n * 数字类型映射字符串类型\n * @author lxm\n * @date 2023-08-25 04:49:52\n * @static\n * @type {{ [p: number]: string }}\n */\n static readonly typeMap: { [p: number]: string } = {\n 0: 'UNKNOWN',\n 1: 'BIGINT',\n 2: 'BINARY',\n 3: 'BIT',\n 4: 'CHAR',\n 5: 'DATETIME',\n 6: 'DECIMAL',\n 7: 'FLOAT',\n 8: 'IMAGE',\n 9: 'INT',\n 10: 'MONEY',\n 11: 'NCHAR',\n 12: 'NTEXT',\n 13: 'NVARCHAR',\n 14: 'NUMERIC',\n 15: 'REAL',\n 16: 'SMALLDATETIME',\n 17: 'SMALLINT',\n 18: 'SMALLMONEY',\n 19: 'SQL_VARIANT',\n 20: 'SYSNAME',\n 21: 'TEXT',\n 22: 'TIMESTAMP',\n 23: 'TINYINT',\n 24: 'VARBINARY',\n 25: 'VARCHAR',\n 26: 'UNIQUEIDENTIFIER',\n 27: 'DATE', // 纯日期型\n 28: 'TIME', // 纯时间\n 29: 'BIGDECIMAL', // 大数值\n };\n\n /**\n * 是否是数值类型\n * @author lxm\n * @date 2023-08-25 04:53:30\n * @static\n * @param {number} dataType 数据类型(数值)\n * @return {*} {boolean}\n */\n public static isNumber(dataType: number): boolean {\n const numberTypes = [\n 'BIGINT',\n 'BINARY',\n 'DECIMAL',\n 'FLOAT',\n 'INT',\n 'MONEY',\n 'NUMERIC',\n 'REAL',\n 'SMALLINT',\n 'SMALLMONEY',\n 'TINYINT',\n 'VARBINARY',\n ];\n return numberTypes.includes(this.toString(dataType));\n }\n\n /**\n * 是否是日期类型数据\n *\n * @static\n * @param {number} dataType\n * @return {*}\n * @memberof DataTypes\n */\n public static isDate(dataType: number): boolean {\n const dateTypes = ['DATETIME', 'SMALLDATETIME', 'DATE', 'TIME'];\n return dateTypes.includes(this.toString(dataType));\n }\n\n /**\n * 获取字符串数据类型\n * @author lxm\n * @date 2023-08-25 04:53:58\n * @static\n * @param {number} dataType 数据类型(数值)\n * @return {*} {string}\n */\n public static toString(dataType: number): string {\n return this.typeMap[dataType];\n }\n}\n","import { cloneDeepWith, cloneWith, isFunction, isObject } from 'lodash-es';\nimport { mergeDeepRight } from 'ramda';\n\n/**\n * 自定义克隆逻辑,有clone方法的拿clone方法,否则直接用lodash的clone\n * @author lxm\n * @date 2023-10-25 06:12:23\n * @param {unknown} value\n * @return {*} {unknown}\n */\nfunction customizeFn<T>(value: T): T | undefined {\n if (isObject(value) && isFunction((value as IData).clone)) {\n return (value as IData).clone();\n }\n}\n\nexport type CloneOpts = {\n deep?: boolean;\n};\n\nconst DefaultCloneOpts: CloneOpts = {\n deep: true,\n} as const;\n\n/**\n * 克隆方法(如果对象有clone方法会用clone方法调用clone)\n * @author lxm\n * @date 2023-10-25 06:24:18\n * @export\n * @template T\n * @param {readonly} value\n * @param {*} T\n * @param {*} []\n * @param {CloneOpts} [opts]\n * @return {*} {T[]}\n */\nexport function clone<T>(value: T, opts?: CloneOpts): T {\n const options = mergeDeepRight(DefaultCloneOpts, opts || {})!;\n if (options.deep) {\n return cloneDeepWith(value, customizeFn);\n }\n return cloneWith(value, customizeFn);\n}\n","/* eslint-disable default-param-last */\n/* eslint-disable no-bitwise */\n\nimport { RuntimeError } from '../../error';\n\n/**\n * 检查权限码是否有效\n * @author lxm\n * @date 2023-11-10 10:49:57\n * @static\n * @param {number} permission\n */\nfunction validate(permission: number): boolean {\n return !!permission && !(permission & (permission - 1));\n}\n\n/**\n * 检查权限码是否有效,无效抛错\n * @author lxm\n * @date 2023-11-10 10:56:00\n * @private\n * @static\n * @param {number} permission\n */\nfunction validateAndThrow(permission: number): void {\n const isPowerOf2 = validate(permission);\n if (!isPowerOf2) {\n throw new RuntimeError(`${permission}不是2的幂`);\n }\n}\n\n/**\n * 设置权限\n * @author lxm\n * @date 2023-11-10 10:50:22\n * @static\n * @param {number} [allPermissions=0] 当前所有权限\n * @param {number} permission 要设置的权限\n * @return {*} {number}\n */\nfunction setPermission(allPermissions: number = 0, permission: number): number {\n validateAndThrow(permission);\n return allPermissions | permission;\n}\n\n/**\n * 移出权限\n * @author lxm\n * @date 2023-11-10 10:50:45\n * @static\n * @param {number} [allPermissions=0] 当前所有权限\n * @param {number} permission 要移出的权限\n * @return {*} {number}\n */\nfunction removePermission(\n allPermissions: number = 0,\n permission: number,\n): number {\n validateAndThrow(permission);\n return allPermissions & ~permission;\n}\n\n/**\n * 检查是否有某个权限\n * @author lxm\n * @date 2023-11-10 10:50:46\n * @static\n * @param {number} [allPermissions=0]\n * @param {number} permission\n * @return {*} {number}\n */\nfunction checkPermission(\n allPermissions: number = 0,\n permission: number,\n): boolean {\n validateAndThrow(permission);\n return (allPermissions & permission) !== 0;\n}\n\nexport const BitMask = {\n validate,\n setPermission,\n removePermission,\n checkPermission,\n};\n","import Logger from 'loglevel';\nimport prefix from 'loglevel-plugin-prefix';\n\nconst logger = Logger.noConflict();\n\nprefix.reg(logger);\n\nprefix.apply(logger);\n\nexport { logger };\n","import { Logger } from 'loglevel';\nimport { CommandController } from './command';\nimport { Environment } from './environment/environment';\nimport { OrgData } from './interface';\nimport { MessageCenter, Net } from './utils';\nimport { logger } from './utils/logger/logger';\n\n/**\n * 全局对象\n *\n * @author chitanda\n * @date 2022-07-19 16:07:50\n * @export\n * @class IBizSys\n */\nexport class IBizSys {\n /**\n * 环境变量\n *\n * @author chitanda\n * @date 2022-07-19 18:07:04\n */\n env = Environment;\n\n /**\n * 日志输出工具类\n *\n * @author chitanda\n * @date 2023-07-10 18:07:05\n * @type {Logger}\n */\n log: Logger = logger;\n\n /**\n * 网络请求工具类(发送默认请求)\n *\n * @author chitanda\n * @date 2022-07-19 17:07:56\n * @type {Net}\n */\n net: Net = new Net();\n\n /**\n * 指令集\n *\n * @author chitanda\n * @date 2022-07-20 10:07:33\n * @type {AuthService}\n */\n commands: CommandController = new CommandController();\n\n /**\n * 界面消息中心\n *\n * @author chitanda\n * @date 2023-09-05 17:09:38\n * @type {MessageCenter}\n */\n mc: MessageCenter = new MessageCenter();\n\n /**\n * sass 模式下的中心系统标识\n *\n * @author chitanda\n * @date 2022-07-19 18:07:23\n * @type {string}\n */\n orgData?: OrgData;\n\n /**\n * 应用数据\n *\n * @author chitanda\n * @date 2022-07-20 19:07:22\n * @type {IData}\n */\n appData?: IData;\n}\n","import { IBizSys } from './ibizsys';\n\n/**\n * 初始化全局对象\n *\n * @author chitanda\n * @date 2022-07-19 17:07:37\n * @export\n */\nexport function install(): void {\n if (window.ibiz) {\n throw new Error('ibiz 已经存在, 无需重复安装');\n }\n window.ibiz = new IBizSys();\n}\n"],"names":["getBytes","stream","onChunk","reader","result","getLines","onLine","buffer","position","fieldLength","discardTrailingNewline","arr","concat","bufLength","lineStart","lineEnd","getMessages","onId","onRetry","onMessage","message","newMessage","decoder","line","field","valueOffset","value","retry","a","b","res","__rest","s","p","i","EventStreamContentType","DefaultRetryInterval","LastEventId","fetchEventSource","input","_a","inputSignal","inputHeaders","inputOnOpen","onmessage","onclose","onerror","openWhenHidden","inputFetch","rest","resolve","reject","headers","curRequestController","onVisibilityChange","create","retryInterval","retryTimer","dispose","fetch","onopen","defaultOnOpen","response","id","err","interval","innerErr","contentType","_Node","element","Node","LinkedList","node","next","atTheEnd","newNode","oldLast","oldFirst","didRemove","anchor","exports","once","fn","_this","didCall","toDisposable","debounce","func","wait","immediate","timer","args","callNow","throttle","CommandsRegistry","idOrCommand","handler","opts","commands","removeFn","list","keys","key","command","CommandController","bol","CoreConst","NOOP","HttpStatusMessageConst","LoginMode","MenuPermissionMode","IBizContext","context","parent","self","properties","val","item","newContext","clone","IBizParams","params","updateKeyDefine","target","_receiver","allKeys","Environment","HttpError","ModelError","model","msg","RuntimeError","RuntimeModelError","NoticeError","duration","getToken","getCookie","isOverlap","arr1","arr2","isElementSame","allElements","debounceAndMerge","mergeFunc","oldParams","debounceFunc","newParams","debounceAndAsyncMerge","promises","promise","error","mergeInLeft","l","r","isNotNil","mergeDefaultInLeft","isNil","compareArr","keyField","all","more","less","same","arr1Keys","arr2Keys","toNumberOrNil","num","SvgPattern","isSvg","str","plus","c","d","e","Interceptor","config","instance","CoreInterceptor","systemId","orgData","MessageBase","QXEvent","cb","MessageAll","CommandBase","data","subtype","createUUID","CommandCreate","CommandUpdate","CommandRemove","CommandChange","CommandAsyncAction","MessageCommand","MessageConsole","MessageCenter","callback","defaultNamespace","statePrefix","_bem","namespace","block","blockSuffix","modifier","cls","Namespace","name","state","object","styles","HttpResponse","status","statusText","axios","Net","interceptor","configs","url","merge","option","cfg","requestPromise","options","mergeDeepRight","notNilEmpty","urlSplit","strParams","qs","StringUtil","_key","UrlHelper","hashIndex","origin","pathname","eventPath","event","path","getParents","memo","parentNode","listenJSEvent","eventName","listener","cleanup","isEventInside","el","defaultWindow","onClickOutside","window","ignore","capture","shouldListen","isOutside","isPaused","pause","proceed","fallback","cleanups","toRGBA","color","rgba","colorBlend","color1","color2","format","c1","c2","hex","calcMimeByFileName","fileName","ext","mime","isImage","downloadFileFromBlob","file","filetype","blob","href","fileListToArr","fileList","files","selectFile","_opts","inputEl","uploadFile","_fileData","_files","_resultFiles","_res","_error","onUploadProgress","round","cloneDeep","uploadRequest","_onProgress","isFunction","executeSingleUpload","resultFiles","uniqueId","uploadFiles","uploadSequence","sequence","awaitTimeout","fun","CountLatch","setRemoteStyle","styleDom","IterateOpts","BreakError","getChildField","fields","_recursiveIterate","childrenFields","children","child","recursiveIterate","CompareOpts","findRecursiveChild","compareField","compareCallback","_compareCallback","find","DataTypes","dataType","customizeFn","isObject","DefaultCloneOpts","cloneDeepWith","cloneWith","validate","permission","validateAndThrow","setPermission","allPermissions","removePermission","checkPermission","BitMask","logger","Logger","prefix","IBizSys","install"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"index.system.min.js","sources":["../../../node_modules/.pnpm/@microsoft+fetch-event-source@2.0.1/node_modules/@microsoft/fetch-event-source/lib/esm/parse.js","../../../node_modules/.pnpm/@microsoft+fetch-event-source@2.0.1/node_modules/@microsoft/fetch-event-source/lib/esm/fetch.js","../src/command/utils/linked-list.ts","../src/command/utils/util.ts","../src/command/command-register.ts","../src/command/command.ts","../src/command/index.ts","../src/constant/core/core.ts","../src/constant/util/util.ts","../src/constant/http-status-message/http-status-message.ts","../src/constant/login-mode/login-mode.ts","../src/constant/menu-permission-mode/menu-permission-mode.ts","../src/context/index.ts","../src/params/params.ts","../src/environment/environment.ts","../src/error/http-error/http-error.ts","../src/error/model-error/model-error.ts","../src/error/runtime-error/runtime-error.ts","../src/error/runtime-model-error/runtime-model-error.ts","../src/error/notice-error/notice-error.ts","../src/utils/util/util.ts","../src/utils/interceptor/interceptor.ts","../src/utils/interceptor/core-interceptor.ts","../src/utils/message-center/base/message-base.ts","../src/utils/message-center/base/message-all.ts","../src/utils/message-center/command/command-base/command-base.ts","../src/utils/message-center/command/create/command-create.ts","../src/utils/message-center/command/update/command-update.ts","../src/utils/message-center/command/remove/command-remove.ts","../src/utils/message-center/command/change/command-change.ts","../src/utils/message-center/command/async-action/command-async-action.ts","../src/utils/message-center/command/message-command.ts","../src/utils/message-center/console/message-console.ts","../src/utils/message-center/message-center.ts","../src/utils/namespace/namespace.ts","../src/utils/net/http-response.ts","../src/utils/net/net.ts","../src/utils/string-util/string-util.ts","../src/utils/url-helper/url-helper.ts","../src/utils/event/event.ts","../src/utils/click-outside/click-outside.ts","../src/utils/color/color.ts","../src/utils/download-file/download-file.ts","../src/utils/upload/select-file.ts","../src/utils/upload/upload-file.ts","../src/utils/sync/await-timeout.ts","../src/utils/sync/count-latch.ts","../src/utils/style/remote-style.ts","../src/utils/recursive/find-recursive-child.ts","../src/utils/data-type/data-types.ts","../src/utils/clone/clone.ts","../src/utils/bit-mask/bit-mask.ts","../src/utils/logger/logger.ts","../src/ibizsys.ts","../src/install.ts"],"sourcesContent":["export async function getBytes(stream, onChunk) {\r\n const reader = stream.getReader();\r\n let result;\r\n while (!(result = await reader.read()).done) {\r\n onChunk(result.value);\r\n }\r\n}\r\nexport function getLines(onLine) {\r\n let buffer;\r\n let position;\r\n let fieldLength;\r\n let discardTrailingNewline = false;\r\n return function onChunk(arr) {\r\n if (buffer === undefined) {\r\n buffer = arr;\r\n position = 0;\r\n fieldLength = -1;\r\n }\r\n else {\r\n buffer = concat(buffer, arr);\r\n }\r\n const bufLength = buffer.length;\r\n let lineStart = 0;\r\n while (position < bufLength) {\r\n if (discardTrailingNewline) {\r\n if (buffer[position] === 10) {\r\n lineStart = ++position;\r\n }\r\n discardTrailingNewline = false;\r\n }\r\n let lineEnd = -1;\r\n for (; position < bufLength && lineEnd === -1; ++position) {\r\n switch (buffer[position]) {\r\n case 58:\r\n if (fieldLength === -1) {\r\n fieldLength = position - lineStart;\r\n }\r\n break;\r\n case 13:\r\n discardTrailingNewline = true;\r\n case 10:\r\n lineEnd = position;\r\n break;\r\n }\r\n }\r\n if (lineEnd === -1) {\r\n break;\r\n }\r\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength);\r\n lineStart = position;\r\n fieldLength = -1;\r\n }\r\n if (lineStart === bufLength) {\r\n buffer = undefined;\r\n }\r\n else if (lineStart !== 0) {\r\n buffer = buffer.subarray(lineStart);\r\n position -= lineStart;\r\n }\r\n };\r\n}\r\nexport function getMessages(onId, onRetry, onMessage) {\r\n let message = newMessage();\r\n const decoder = new TextDecoder();\r\n return function onLine(line, fieldLength) {\r\n if (line.length === 0) {\r\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);\r\n message = newMessage();\r\n }\r\n else if (fieldLength > 0) {\r\n const field = decoder.decode(line.subarray(0, fieldLength));\r\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1);\r\n const value = decoder.decode(line.subarray(valueOffset));\r\n switch (field) {\r\n case 'data':\r\n message.data = message.data\r\n ? message.data + '\\n' + value\r\n : value;\r\n break;\r\n case 'event':\r\n message.event = value;\r\n break;\r\n case 'id':\r\n onId(message.id = value);\r\n break;\r\n case 'retry':\r\n const retry = parseInt(value, 10);\r\n if (!isNaN(retry)) {\r\n onRetry(message.retry = retry);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n}\r\nfunction concat(a, b) {\r\n const res = new Uint8Array(a.length + b.length);\r\n res.set(a);\r\n res.set(b, a.length);\r\n return res;\r\n}\r\nfunction newMessage() {\r\n return {\r\n data: '',\r\n event: '',\r\n id: '',\r\n retry: undefined,\r\n };\r\n}\r\n//# sourceMappingURL=parse.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { getBytes, getLines, getMessages } from './parse';\r\nexport const EventStreamContentType = 'text/event-stream';\r\nconst DefaultRetryInterval = 1000;\r\nconst LastEventId = 'last-event-id';\r\nexport function fetchEventSource(input, _a) {\r\n var { signal: inputSignal, headers: inputHeaders, onopen: inputOnOpen, onmessage, onclose, onerror, openWhenHidden, fetch: inputFetch } = _a, rest = __rest(_a, [\"signal\", \"headers\", \"onopen\", \"onmessage\", \"onclose\", \"onerror\", \"openWhenHidden\", \"fetch\"]);\r\n return new Promise((resolve, reject) => {\r\n const headers = Object.assign({}, inputHeaders);\r\n if (!headers.accept) {\r\n headers.accept = EventStreamContentType;\r\n }\r\n let curRequestController;\r\n function onVisibilityChange() {\r\n curRequestController.abort();\r\n if (!document.hidden) {\r\n create();\r\n }\r\n }\r\n if (!openWhenHidden) {\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n }\r\n let retryInterval = DefaultRetryInterval;\r\n let retryTimer = 0;\r\n function dispose() {\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.clearTimeout(retryTimer);\r\n curRequestController.abort();\r\n }\r\n inputSignal === null || inputSignal === void 0 ? void 0 : inputSignal.addEventListener('abort', () => {\r\n dispose();\r\n resolve();\r\n });\r\n const fetch = inputFetch !== null && inputFetch !== void 0 ? inputFetch : window.fetch;\r\n const onopen = inputOnOpen !== null && inputOnOpen !== void 0 ? inputOnOpen : defaultOnOpen;\r\n async function create() {\r\n var _a;\r\n curRequestController = new AbortController();\r\n try {\r\n const response = await fetch(input, Object.assign(Object.assign({}, rest), { headers, signal: curRequestController.signal }));\r\n await onopen(response);\r\n await getBytes(response.body, getLines(getMessages(id => {\r\n if (id) {\r\n headers[LastEventId] = id;\r\n }\r\n else {\r\n delete headers[LastEventId];\r\n }\r\n }, retry => {\r\n retryInterval = retry;\r\n }, onmessage)));\r\n onclose === null || onclose === void 0 ? void 0 : onclose();\r\n dispose();\r\n resolve();\r\n }\r\n catch (err) {\r\n if (!curRequestController.signal.aborted) {\r\n try {\r\n const interval = (_a = onerror === null || onerror === void 0 ? void 0 : onerror(err)) !== null && _a !== void 0 ? _a : retryInterval;\r\n window.clearTimeout(retryTimer);\r\n retryTimer = window.setTimeout(create, interval);\r\n }\r\n catch (innerErr) {\r\n dispose();\r\n reject(innerErr);\r\n }\r\n }\r\n }\r\n }\r\n create();\r\n });\r\n}\r\nfunction defaultOnOpen(response) {\r\n const contentType = response.headers.get('content-type');\r\n if (!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith(EventStreamContentType))) {\r\n throw new Error(`Expected content-type to be ${EventStreamContentType}, Actual: ${contentType}`);\r\n }\r\n}\r\n//# sourceMappingURL=fetch.js.map","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable no-underscore-dangle */\n/* eslint-disable max-classes-per-file */\nclass Node<E> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static readonly Undefined = new Node<any>(undefined);\n\n element: E;\n\n next: Node<E>;\n\n prev: Node<E>;\n\n constructor(element: E) {\n this.element = element;\n this.next = Node.Undefined;\n this.prev = Node.Undefined;\n }\n}\n\nexport class LinkedList<E> {\n private _first: Node<E> = Node.Undefined;\n\n private _last: Node<E> = Node.Undefined;\n\n private _size: number = 0;\n\n get size(): number {\n return this._size;\n }\n\n isEmpty(): boolean {\n return this._first === Node.Undefined;\n }\n\n clear(): void {\n let node = this._first;\n while (node !== Node.Undefined) {\n const { next } = node;\n node.prev = Node.Undefined;\n node.next = Node.Undefined;\n node = next;\n }\n\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n this._size = 0;\n }\n\n unshift(element: E): () => void {\n return this._insert(element, false);\n }\n\n push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new Node(element);\n if (this._first === Node.Undefined) {\n this._first = newNode;\n this._last = newNode;\n } else if (atTheEnd) {\n // push\n const oldLast = this._last!;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n } else {\n // unshift\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n this._size += 1;\n\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n shift(): E | undefined {\n if (this._first === Node.Undefined) {\n return undefined;\n }\n const res = this._first.element;\n this._remove(this._first);\n return res;\n }\n\n pop(): E | undefined {\n if (this._last === Node.Undefined) {\n return undefined;\n }\n const res = this._last.element;\n this._remove(this._last);\n return res;\n }\n\n private _remove(node: Node<E>): void {\n if (node.prev !== Node.Undefined && node.next !== Node.Undefined) {\n // middle\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n } else if (node.prev === Node.Undefined && node.next === Node.Undefined) {\n // only node\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n } else if (node.next === Node.Undefined) {\n // last\n this._last = this._last!.prev!;\n this._last.next = Node.Undefined;\n } else if (node.prev === Node.Undefined) {\n // first\n this._first = this._first!.next!;\n this._first.prev = Node.Undefined;\n }\n\n // done\n this._size -= 1;\n }\n\n *[Symbol.iterator](): Iterator<E> {\n let node = this._first;\n while (node !== Node.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n","/* eslint-disable func-names */\n/* eslint-disable prefer-rest-params */\n/* eslint-disable no-underscore-dangle */\nimport { IDisposable } from '../interface';\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function once<T extends Function>(this: unknown, fn: T): T {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n let didCall = false;\n let result: unknown;\n\n return function () {\n if (didCall) {\n return result;\n }\n\n didCall = true;\n result = fn.apply(_this, arguments);\n\n return result;\n } as unknown as T;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n const self = {\n dispose: once(() => {\n fn();\n }),\n };\n return self;\n}\n\n/**\n * 函数防抖---“立即执行版本” 和 “非立即执行版本” 的组合版本\n *\n * @author chitanda\n * @date 2022-06-29 19:06:15\n * @export\n * @param {((...args: unknown[]) => void | Promise<void>)} func 处理函数\n * @param {number} wait 延迟执行时间(毫秒)\n * @param {boolean} [immediate] 是否立即执行\n * @return {*} {(...args: unknown[]) => void}\n */\nexport function debounce(\n func: (...args: unknown[]) => void | Promise<void>,\n wait: number,\n immediate?: boolean,\n): (...args: unknown[]) => void {\n let timer: unknown;\n\n return function (this: unknown, ...args: unknown[]): void {\n if (timer) {\n clearTimeout(timer as number);\n }\n if (immediate) {\n const callNow = !timer;\n timer = setTimeout(() => {\n timer = null;\n }, wait);\n if (callNow) {\n func.apply(this, args);\n }\n } else {\n timer = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n }\n };\n}\n\n/**\n * 节流函数\n *\n * @author chitanda\n * @date 2022-06-29 20:06:38\n * @export\n * @param {((...args: unknown[]) => void | Promise<void>)} fn\n * @param {number} wait\n * @return {*} {(...args: unknown[]) => void}\n */\nexport function throttle(\n fn: (...args: unknown[]) => void | Promise<void>,\n wait: number,\n): (...args: unknown[]) => void {\n let timer: unknown = null;\n return function (this: unknown, ...args: unknown[]): void {\n if (!timer) {\n timer = setTimeout(() => {\n fn.apply(this, args);\n timer = null;\n }, wait);\n }\n };\n}\n","import {\n ICommand,\n ICommandHandler,\n ICommandOption,\n ICommandRegistry,\n ICommandsMap,\n IDisposable,\n} from './interface';\nimport { LinkedList, toDisposable } from './utils';\n\n/**\n * 命令注册中心\n *\n * @author chitanda\n * @date 2022-06-27 13:06:50\n * @export\n * @class CommandRegisterService\n * @implements {ICommandRegistry}\n */\nexport class CommandsRegistry implements ICommandRegistry {\n /**\n * 已经注册的所有指令\n *\n * @author chitanda\n * @date 2022-07-21 15:07:47\n * @private\n */\n private readonly commands = new Map<string, LinkedList<ICommand>>();\n\n /**\n * 注册指令\n *\n * @author chitanda\n * @date 2022-06-27 13:06:31\n * @param {(string | ICommand)} idOrCommand\n * @param {ICommandHandler} [handler]\n * @return {*} {IDisposable}\n */\n registerCommand(\n idOrCommand: string | ICommand,\n handler?: ICommandHandler,\n opts?: ICommandOption,\n ): IDisposable {\n if (!idOrCommand) {\n throw new Error(`invalid command`);\n }\n\n if (typeof idOrCommand === 'string') {\n if (!handler) {\n throw new Error(`invalid command`);\n }\n return this.registerCommand({ id: idOrCommand, handler, opts });\n }\n\n const { id } = idOrCommand;\n\n let commands = this.commands.get(id);\n if (!commands) {\n commands = new LinkedList<ICommand>();\n this.commands.set(id, commands);\n }\n\n const removeFn = commands.unshift(idOrCommand);\n\n const ret = toDisposable(() => {\n removeFn();\n const command = this.commands.get(id);\n if (command?.isEmpty()) {\n this.commands.delete(id);\n }\n });\n\n return ret;\n }\n\n /**\n * 指令是否已经注册\n *\n * @author chitanda\n * @date 2022-07-21 15:07:58\n * @param {string} id\n * @return {*} {boolean}\n */\n hasCommand(id: string): boolean {\n return this.commands.has(id);\n }\n\n /**\n * 查找指令\n *\n * @author chitanda\n * @date 2022-07-21 16:07:12\n * @param {string} id\n * @return {*} {(ICommand | undefined)}\n */\n getCommand(id: string): ICommand | undefined {\n const list = this.commands.get(id);\n if (!list || list.isEmpty()) {\n return undefined;\n }\n return list[Symbol.iterator]().next().value;\n }\n\n /**\n * 获取所有指令\n *\n * @author chitanda\n * @date 2022-07-21 16:07:20\n * @return {*} {ICommandsMap}\n */\n getCommands(): ICommandsMap {\n const result = new Map<string, ICommand>();\n const keys = this.commands.keys();\n for (const key of keys) {\n const command = this.getCommand(key);\n if (command) {\n result.set(key, command);\n }\n }\n return result;\n }\n\n /**\n * 获取指令配置参数\n *\n * @author chitanda\n * @date 2022-07-21 16:07:27\n * @param {string} id\n * @return {*} {(ICommandOption | undefined)}\n */\n getCommandOpt(id: string): ICommandOption | undefined {\n const cmd = this.getCommand(id);\n return cmd?.opts;\n }\n}\n","import { ICommandHandler, ICommandOption, IDisposable } from './interface';\nimport { CommandsRegistry } from './command-register';\n\n/**\n * 指令控制器\n *\n * @author chitanda\n * @date 2022-06-28 19:06:51\n * @export\n * @class CommandController\n */\nexport class CommandController {\n private commandRegister = new CommandsRegistry();\n\n /**\n * 注册指令\n *\n * @author chitanda\n * @date 2022-06-28 19:06:45\n * @param {string} id\n * @param {ICommandHandler} handler\n * @param {ICommandOption} [opts]\n * @return {*} {IDisposable}\n */\n register(\n id: string,\n handler: ICommandHandler,\n opts?: ICommandOption,\n ): IDisposable {\n return this.commandRegister.registerCommand(id, handler, opts);\n }\n\n /**\n * 执行指令\n *\n * @author chitanda\n * @date 2022-06-28 19:06:38\n * @template T\n * @param {string} id\n * @param {...unknown[]} args\n * @return {*} {Promise<T>}\n */\n async execute<T = undefined>(id: string, ...args: unknown[]): Promise<T> {\n const command = this.commandRegister.getCommand(id);\n if (command) {\n return command.handler(...args) as T | Promise<T>;\n }\n throw new Error(`未注册指令: ${id},请先注册指令`);\n }\n\n /**\n * 判断指令是否存在,可直接抛出异常\n *\n * @author chitanda\n * @date 2022-06-28 19:06:11\n * @param {string} id\n * @param {boolean} [err]\n * @return {*} {boolean}\n */\n hasCommand(id: string, err?: boolean): boolean {\n const bol = !!this.commandRegister.hasCommand(id);\n if (err === true && bol === true) {\n throw new Error(`未注册指令: ${id},请先注册指令`);\n }\n return bol;\n }\n\n /**\n * 获取指令配置参数\n *\n * @author chitanda\n * @date 2022-07-21 17:07:11\n * @param {string} id\n * @return {*} {(ICommandOption | undefined)}\n */\n getCommandOpts(id: string): ICommandOption | undefined {\n return this.commandRegister.getCommandOpt(id);\n }\n}\n","import { CommandController } from './command';\n\nexport * from './interface';\nexport * from './utils';\nexport { CommandsRegistry } from './command-register';\nexport { CommandController } from './command';\n\n/**\n * 命令控制器\n */\nexport const commands = new CommandController();\n","/**\n * 核心全局静态变量\n *\n * @author chitanda\n * @date 2022-07-14 17:07:25\n * @export\n * @enum {number}\n */\nexport class CoreConst {\n /**\n * 默认模型服务标识\n */\n static readonly DEFAULT_MODEL_SERVICE_TAG = 'default';\n\n /**\n * 访问令牌标识\n *\n * @author chitanda\n * @date 2022-07-20 15:07:28\n * @static\n */\n static readonly TOKEN = 'ibzuaa-token';\n\n /**\n * 访问令牌标识过期时间\n *\n * @author lxm\n * @date 2023-02-13 07:11:33\n * @static\n * @memberof CoreConst\n */\n static readonly TOKEN_EXPIRES = 'ibzuaa-token-expires';\n}\n","/* eslint-disable @typescript-eslint/no-empty-function */\n/**\n * 无操作函数\n */\nexport const NOOP = (): void => {};\n","/**\n * 请求状态码文本\n */\nexport const HttpStatusMessageConst: Record<number, string> = {\n 200: '服务器成功返回请求的数据。',\n 201: '新建或修改数据成功。',\n 202: '一个请求已经进入后台排队(异步任务)。',\n 204: '删除数据成功。',\n 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',\n 401: '用户没有权限(令牌、用户名、密码错误)。',\n 403: '用户得到授权,但是访问是被禁止的。',\n 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',\n 406: '请求的格式不可得。',\n 410: '请求的资源被永久删除,且不会再得到的。',\n 422: '当创建一个对象时,发生一个验证错误。',\n 500: '服务器发生错误,请检查服务器。',\n 502: '网关错误。',\n 503: '服务不可用,服务器暂时过载或维护。',\n 504: '网关超时。',\n};\n","/* eslint-disable no-shadow */\n/**\n * 登录模式\n *\n * @author lxm\n * @date 2022-10-12 14:10:56\n * @export\n * @enum {number}\n */\nexport enum LoginMode {\n /**\n * 默认标准登录\n */\n DEFAULT = 'DEFAULT',\n /**\n * 自定义登录\n */\n CUSTOM = 'CUSTOM',\n /**\n * 中央认证登录\n */\n CAS = 'CAS',\n}\n","/* eslint-disable no-shadow */\n/**\n * 菜单权限校验模式\n *\n * @author lxm\n * @date 2022-10-12 14:10:56\n * @export\n * @enum {number}\n */\nexport enum MenuPermissionMode {\n /**\n * 混合模式(默认)\n */\n MIXIN = 'MIXIN',\n /**\n * 统一资源模式\n */\n RESOURCE = 'RESOURCE',\n /**\n * RT模式\n */\n RT = 'RT',\n}\n","import { clone } from 'ramda';\n\n/**\n * 上下文处理类\n *\n * @author chitanda\n * @date 2022-07-14 10:07:24\n * @export\n * @class IBizContext\n */\nexport class IBizContext implements IContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string | symbol]: any;\n\n /**\n * clone 后引用的上下文实例,需要在实例销毁时,同时销毁\n *\n * @author chitanda\n * @date 2023-03-13 16:03:31\n * @protected\n * @type {IBizContext[]}\n */\n protected declare _associationContext: IBizContext[];\n\n /**\n * 修改的父上下文\n *\n * @author lxm\n * @date 2022-12-08 18:12:16\n * @protected\n * @type {IData}\n */\n protected declare _context: IData;\n\n /**\n * 父的上下文源对象\n *\n * @author lxm\n * @date 2022-12-08 18:12:31\n * @type {IContext}\n */\n declare _parent?: IContext;\n\n /**\n * Creates an instance of IBizContext.\n *\n * @author chitanda\n * @date 2022-07-14 10:07:15\n * @param {IData} [context={}] 自身的上下文\n * @param {IContext} [parent]\n */\n // eslint-disable-next-line default-param-last\n private constructor(context: IData = {}, parent?: IContext) {\n Object.defineProperty(this, '_associationContext', {\n enumerable: false,\n value: [],\n });\n\n if (parent) {\n this.initWithParent(parent);\n }\n\n // 合并给入上下文\n Object.assign(this, context);\n }\n\n private initWithParent(parent: IContext): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n // 定义私有变量,存放父上下文源对象\n Object.defineProperty(this, '_parent', {\n enumerable: false,\n writable: true,\n value: parent,\n });\n\n // 定义私有变量,用于存储对父已有上下文的修改。\n Object.defineProperty(this, '_context', {\n enumerable: false,\n writable: true,\n value: {},\n });\n // 监控父上下文参数,自身不存在时从父取\n const properties: { [key: string]: PropertyDescriptor } = {};\n const keys = Object.keys(parent);\n keys.forEach(key => {\n if (Object.prototype.hasOwnProperty.call(this, key)) {\n // !已经定义的不重复定义,会报错\n return;\n }\n properties[key] = {\n enumerable: true,\n set(val: unknown): void {\n if (val == null) {\n self._context[key] = null;\n } else {\n self._context[key] = val;\n }\n },\n get(): IContext {\n if (self._context[key] !== undefined) {\n return self._context[key];\n }\n return self._parent![key];\n },\n };\n });\n Object.defineProperties(this, properties);\n }\n\n /**\n * 返回自身的上下文,独有的和与父有差异的。\n *\n * @author lxm\n * @date 2022-12-08 17:12:26\n * @returns {*} {IData}\n */\n getOwnContext(): IData {\n const result: IData = {};\n Object.keys(this).forEach(key => {\n // 父没有的,或者修改了父的上下文\n // 父不存在则返回所有自身的属性\n if (\n !this._parent ||\n !Object.prototype.hasOwnProperty.call(this._parent, key) ||\n Object.prototype.hasOwnProperty.call(this._context, key)\n ) {\n result[key] = this[key];\n }\n });\n return result;\n }\n\n /**\n * 销毁当前上下文对象\n *\n * @author chitanda\n * @date 2023-03-13 15:03:04\n */\n destroy(): void {\n this._parent = undefined;\n this._context = {};\n this._associationContext.forEach(item => {\n item.destroy();\n });\n }\n\n /**\n * 在非视图中,需要断开视图上下文联系时。只能使用 clone 创建新的局部上下文\n *\n * @author chitanda\n * @date 2023-03-13 16:03:13\n * @return {*} {IBizContext}\n */\n clone(): IBizContext {\n const newContext = new IBizContext(\n clone(this.getOwnContext()),\n this._parent,\n );\n this._associationContext.push(newContext);\n return newContext;\n }\n\n /**\n * 在不改变对象引用的情况下,重置上下文\n * 等效于重新实例化,但是引用不变\n * @author lxm\n * @date 2023-05-24 10:30:40\n * @param {IData} [context={}]\n * @param {IContext} [parent]\n */\n // eslint-disable-next-line default-param-last\n reset(context: IData = {}, parent?: IContext): void {\n // 清空_associationContext\n this._associationContext.forEach(item => {\n item.destroy();\n });\n // 置空parent相关属性\n if (this._parent) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this._parent = {} as any;\n this._context = {};\n }\n // 删除自身的属性,define的删不掉,上面置空了就不管了\n Object.keys(this).forEach(key => {\n try {\n delete this[key];\n } catch (error) {\n // 删不掉的不管了,上面已经变成uneducated了\n }\n });\n if (parent) {\n this.initWithParent(parent);\n }\n // 合并默认值\n Object.assign(this, context);\n }\n\n /**\n * 上下文只有在视图初始化时,调用 create 方法\n *\n * @author chitanda\n * @date 2023-03-13 16:03:32\n * @static\n * @param {IData} [context]\n * @param {IContext} [parent]\n * @return {*} {IContext}\n */\n static create(context?: IData, parent?: IContext): IBizContext {\n return new IBizContext(context, parent);\n }\n}\n","/* eslint-disable no-constructor-return */\n/**\n * 视图参数类\n * @author lxm\n * @date 2023-10-27 03:39:12\n * @export\n * @class IBizParams\n * @implements {IParams}\n */\nexport class IBizParams implements IParams {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string | symbol]: any;\n\n /**\n * 自身的属性\n * @author lxm\n * @date 2023-10-27 04:09:25\n * @protected\n * @type {IParams}\n */\n protected declare _params: IParams;\n\n /**\n * 父视图参数\n * @author lxm\n * @date 2023-10-27 04:08:59\n * @protected\n * @type {IParams}\n */\n protected declare _parent?: IParams;\n\n constructor(params?: IParams, parent?: IParams) {\n // 定义私有变量,存放父视图参数源对象\n Object.defineProperty(this, '_parent', {\n enumerable: false,\n configurable: true,\n writable: true,\n value: parent,\n });\n\n // 定义私有变量,用于存储对父已有视图参数的修改。\n Object.defineProperty(this, '_params', {\n enumerable: false,\n configurable: true,\n writable: true,\n value: params || {},\n });\n\n return this.createProxy();\n }\n\n /**\n * 创建代理\n *\n * @author lxm\n * @date 2023-10-27 03:53:14\n * @protected\n * @return {*} {IBizParams}\n */\n protected createProxy(): IBizParams {\n // 更新属性,缺的补充定义\n function updateKeyDefine(target: IParams, keys: string[]): void {\n keys.forEach(key => {\n if (!Object.prototype.hasOwnProperty.call(target, key)) {\n Object.defineProperty(target, key, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: undefined,\n });\n }\n });\n }\n\n return new Proxy(this, {\n set(target: IBizParams, p: string, value: unknown): boolean {\n if (['_params', '_parent'].includes(p)) {\n target[p] = value;\n } else {\n target._params[p] = value;\n }\n return true;\n },\n\n get(target: IBizParams, p: string | symbol, _receiver: unknown): unknown {\n if (target[p] !== undefined) {\n return target[p];\n }\n if (target._params[p] !== undefined) {\n return target._params[p];\n }\n if (target._parent && target._parent[p] !== undefined) {\n return target._parent[p];\n }\n },\n\n ownKeys(target: IBizParams): ArrayLike<string | symbol> {\n // 整合所有并排重\n const allKeys = [\n ...new Set([\n ...Object.keys(target._params),\n ...Object.keys(target._parent || {}),\n ]),\n ];\n updateKeyDefine(target, allKeys);\n return allKeys;\n },\n });\n }\n\n /**\n * 在不改变对象引用的情况下,重置视图参数\n * 等效于重新实例化,但是引用不变\n * @author lxm\n * @date 2023-10-27 05:24:45\n * @param {IParams} [params]\n * @param {IParams} [parent]\n */\n reset(params?: IParams, parent?: IParams): void {\n this._params = params || {};\n this._parent = parent;\n }\n\n /**\n * 销毁上下文,避免内存泄漏\n *\n * @author lxm\n * @date 2023-10-27 03:57:44\n */\n destroy(): void {\n this._params = {};\n this._parent = undefined;\n }\n}\n","import { LoginMode, MenuPermissionMode } from '../constant';\nimport { IEnvironment } from '../interface';\n\n/**\n * 环境变量\n */\nexport const Environment: IEnvironment = {\n dev: false,\n hub: true,\n enableMqtt: false,\n mqttUrl: '/portal/mqtt/mqtt',\n isEnableMultiLan: false,\n logLevel: 'ERROR',\n baseUrl: '/api',\n appId: '',\n pluginBaseUrl: './plugins',\n isLocalModel: false,\n remoteModelUrl: '/remotemodel',\n assetsUrl: './assets',\n dcSystem: '',\n downloadFileUrl: '/ibizutil/download',\n uploadFileUrl: '/ibizutil/upload',\n casLoginUrl: '',\n loginMode: LoginMode.DEFAULT,\n menuPermissionMode: MenuPermissionMode.MIXIN,\n enablePermission: true,\n routePlaceholder: '-',\n enableWfAllHistory: false,\n isMob: false,\n isSaaSMode: true,\n AppTitle: '应用',\n favicon: './favicon.ico',\n};\n","import { AxiosError, AxiosResponse } from 'axios';\n\n/**\n * 请求异常\n *\n * @author chitanda\n * @date 2022-09-18 17:09:10\n * @export\n * @class HttpError\n * @implements {Error}\n */\nexport class HttpError extends Error {\n name: string = 'HttpError';\n\n message: string;\n\n status: number;\n\n response?: AxiosResponse;\n\n constructor(err: AxiosError) {\n super('HttpError');\n const res = err.response;\n this.response = err.response;\n if (res) {\n if (res.data) {\n this.message = (res.data as IData).message;\n } else {\n this.message = res.statusText;\n }\n if (!this.message) {\n this.message = '网络异常,请稍后重试!';\n }\n this.status = res.status;\n } else {\n this.message = err.message;\n this.status = 500;\n }\n }\n}\n","/**\n * 未支持的模型\n *\n * @author chitanda\n * @date 2022-08-30 16:08:03\n * @export\n * @class ModelError\n */\nexport class ModelError extends Error {\n name: string = '未支持的模型';\n\n /**\n * Creates an instance of ModelError.\n *\n * @author chitanda\n * @date 2022-08-30 16:08:38\n * @param {IModelObject} model 模板未支持的模型\n * @param {string} [msg]\n */\n constructor(\n public model: IData,\n msg?: string,\n ) {\n super(`「${model.id}」模型${msg ? `: ${msg}` : ''}`);\n }\n}\n","/**\n * 运行时异常\n *\n * @author lxm\n * @date 2022-09-21 18:09:09\n * @export\n * @class RuntimeError\n * @implements {Error}\n */\nexport class RuntimeError extends Error {\n name: string = 'Runtime Error';\n\n constructor(public message: string) {\n super(message);\n }\n}\n","/**\n * 模型配置缺失\n *\n * @author chitanda\n * @date 2022-08-30 16:08:15\n * @export\n * @class DefectModelError\n * @extends {Error}\n */\nexport class RuntimeModelError extends Error {\n name: string = '模型配置缺失';\n\n /**\n * Creates an instance of DefectModelError.\n *\n * @author chitanda\n * @date 2022-08-30 16:08:58\n * @param {IModelObject} model 丢失配置的模型\n * @param {string} [msg] 缺失配置描述\n */\n constructor(\n public model: IData,\n msg?: string,\n ) {\n super(`「${model.id}」模型${msg ? `: ${msg}` : ''}`);\n }\n}\n","/**\n * 纯输出通知信息的异常\n *\n * @author lxm\n * @date 2022-09-21 18:09:09\n * @export\n * @class NoticeError\n * @implements {Error}\n */\nexport class NoticeError extends Error {\n name: string = 'notice Error';\n\n constructor(\n public message: string,\n public duration?: number,\n ) {\n super(message);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { debounce } from 'lodash-es';\nimport { getCookie } from 'qx-util';\nimport { isNotNil, isNil } from 'ramda';\nimport { CoreConst } from '../../constant';\n\n/**\n * 获取认证令牌\n *\n * @author chitanda\n * @date 2022-07-20 18:07:39\n * @export\n * @return {*} {(string | null)}\n */\nexport function getToken(): string | null {\n return getCookie(CoreConst.TOKEN);\n}\n\n/**\n * 判断两个数组是否有相同的元素\n *\n * @author lxm\n * @date 2022-09-20 19:09:29\n * @export\n * @param {any[]} arr1\n * @param {any[]} arr2\n * @returns {*} {boolean}\n */\nexport function isOverlap(arr1: any[], arr2: any[]): boolean {\n const newArr = Array.from(new Set([...arr1, ...arr2]));\n return newArr.length !== arr1.length + arr2.length;\n}\n\n/**\n * 是否元素相同\n * @author lxm\n * @date 2023-05-22 12:50:53\n * @export\n * @param {any[]} arr1\n * @param {any[]} arr2\n * @param {string} [field] 比较元素里的某个固定属性\n * @return {*} {boolean}\n */\nexport function isElementSame(\n arr1: any[],\n arr2: any[],\n field?: string,\n): boolean {\n if (arr1.length !== arr2.length) {\n return false;\n }\n const allElements = field\n ? [...arr1.map(item => item[field]), ...arr2.map(item => item[field])]\n : [...arr1, ...arr2];\n\n const newArr = Array.from(new Set(allElements));\n return newArr.length === arr1.length;\n}\n\n/**\n * 防抖并合并每次的参数,\n * 最后一次才会执行\n *\n * @author lxm\n * @date 2022-09-20 21:09:53\n * @export\n * @template T\n * @param {T} func 要防抖的函数\n * @param {(\n * oldParams: Parameters<T>,\n * newParams: Parameters<T>,\n * ) => Parameters<T>} mergeFunc 合并的回调函数\n * @param {number} [wait] 防抖的延迟毫秒数\n * @returns {*}\n */\nexport function debounceAndMerge<T extends (...args: any[]) => any>(\n func: T,\n mergeFunc: (\n oldParams: Parameters<T>,\n newParams: Parameters<T>,\n ) => Parameters<T>,\n wait?: number,\n): (...args: Parameters<T>) => any {\n // 缓存上一次的函数参数\n let oldParams: Parameters<T> | undefined;\n const debounceFunc = debounce((...params: Parameters<T>) => {\n // 防抖函数执行的时候清空缓存参数\n oldParams = undefined;\n return func(...params);\n }, wait);\n return (...args: Parameters<T>) => {\n // 合并参数,并把参数缓存到oldParams里,用新参数调用防抖函数\n let newParams = args;\n if (oldParams) {\n newParams = mergeFunc(oldParams, newParams);\n }\n oldParams = newParams;\n return debounceFunc(...newParams);\n };\n}\n\n/**\n * 防抖并合并每次的参数,最后一次才会执行\n * 绑定方法为异步方法,给每次调用返回最终执行那次的结果\n *\n * @author lxm\n * @date 2022-09-20 21:09:53\n * @export\n * @template T\n * @param {T} func 要防抖的函数\n * @param {(\n * oldParams: Parameters<T>,\n * newParams: Parameters<T>,\n * ) => Parameters<T>} mergeFunc 合并的回调函数\n * @param {number} [wait] 防抖的延迟毫秒数\n * @returns {*}\n */\nexport function debounceAndAsyncMerge<\n T extends (...args: any[]) => Promise<any>,\n>(\n func: T,\n mergeFunc: (\n oldParams: Parameters<T>,\n newParams: Parameters<T>,\n ) => Parameters<T>,\n wait?: number,\n): T {\n // 缓存上一次的函数参数\n let oldParams: Parameters<T> | undefined;\n let promises: Array<{ resolve: any; reject: any }> = [];\n const debounceFunc = debounce(async (...params: Parameters<T>) => {\n // 防抖函数执行的时候清空缓存参数\n oldParams = undefined;\n try {\n const result = await func(...params);\n promises.forEach(promise => {\n promise.resolve(result);\n });\n promises = [];\n return result;\n } catch (error) {\n promises.forEach(promise => {\n promise.reject(error);\n });\n promises = [];\n }\n }, wait);\n const fun = async (...args: Parameters<T>): Promise<unknown> => {\n // 合并参数,并把参数缓存到oldParams里,用新参数调用防抖函数\n let newParams = args;\n if (oldParams) {\n newParams = mergeFunc(oldParams, newParams);\n }\n oldParams = newParams;\n // 执行防抖函数\n debounceFunc(...newParams);\n return new Promise((resolve, reject) => {\n // 阻塞当前调用,当防抖函数被执行后返回\n promises.push({ resolve, reject });\n });\n };\n return fun as T;\n}\n\n/**\n * 把右侧的对象里非空的属性合并到左侧对象里\n * @author lxm\n * @date 2023-05-16 02:23:39\n * @param {IData} l\n * @param {IData} r\n */\nexport function mergeInLeft(l: IData, r: IData): void {\n Object.keys(r).forEach(key => {\n if (isNotNil(r[key])) {\n l[key] = r[key];\n }\n });\n}\n\n/**\n * 把右侧的对象里非空的属性合并到左侧对象属性为空里\n *\n * @author zk\n * @date 2023-06-01 02:06:36\n * @export\n * @param {IData} l\n * @param {IData} r\n */\nexport function mergeDefaultInLeft(l: IData, r: IData): void {\n Object.keys(r).forEach(key => {\n if (isNotNil(r[key]) && isNil(l[key])) {\n l[key] = r[key];\n }\n });\n}\n\n/**\n * 比较两个数组集合,找出相同和不同的元素\n * @author lxm\n * @date 2023-05-29 12:33:55\n * @export\n * @param {IData[]} arr1 数组一\n * @param {IData[]} arr2 数组二\n * @param {string} [keyField] 主键属性,有主键比较主键\n * @return {*} {{\n * more: IData[]; arr1多的元素\n * less: IData[]; arr1少的元素\n * same: IData[]; 相同的元素\n * }}\n */\nexport function compareArr(\n arr1: IData[],\n arr2: IData[],\n keyField?: string,\n): {\n more: IData[];\n less: IData[];\n same: IData[];\n} {\n const all = new Set([...arr1, ...arr2]);\n const more: IData[] = [];\n const less: IData[] = [];\n const same: IData[] = [];\n\n if (keyField) {\n const arr1Keys = arr1.map(item => item[keyField]);\n const arr2Keys = arr2.map(item => item[keyField]);\n all.forEach(item => {\n if (!arr1Keys.includes(item[keyField])) {\n less.push(item);\n return;\n }\n if (!arr2Keys.includes(item[keyField])) {\n more.push(item);\n return;\n }\n same.push(item);\n });\n } else {\n all.forEach(item => {\n if (!arr1.includes(item)) {\n less.push(item);\n return;\n }\n if (!arr2.includes(item)) {\n more.push(item);\n return;\n }\n same.push(item);\n });\n }\n\n return {\n more,\n less,\n same,\n };\n}\n\n/**\n * 转换为数字或undefined\n * - 如果是undefined或null 返回undefined\n * - 其他情况转成数字,能转成数字的返回数字,NaN的返回undefined\n * @author lxm\n * @date 2023-06-08 06:30:57\n * @param {unknown} value 值\n * @return {*} {(number | undefined)}\n */\nexport function toNumberOrNil(value: unknown): number | undefined {\n if (isNil(value)) {\n return undefined;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n return undefined;\n }\n return num;\n}\n\nconst SvgPattern = /<svg\\b[^>]*>[\\s\\S]*?<\\/svg>/;\n\n/**\n * 判断字符串是否是svg的格式\n * @author lxm\n * @date 2023-10-17 02:04:28\n * @export\n * @param {string} str\n * @return {*} {boolean}\n */\nexport function isSvg(str: string): boolean {\n return SvgPattern.test(str);\n}\n\n/**\n * 处理浮点数相加\n * @param {number} a\n * @param {number} b\n * @return {*}\n * @author: zhujiamin\n * @Date: 2023-11-08 17:04:09\n */\nexport function plus(a: number, b: number): number {\n let c;\n let d;\n try {\n c = a.toString().split('.')[1].length;\n } catch (f) {\n c = 0;\n }\n try {\n d = b.toString().split('.')[1].length;\n } catch (f) {\n d = 0;\n }\n const e = 10 ** Math.max(c, d);\n return (a * e + b * e) / e;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n AxiosInstance,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\n\n/**\n * 拦截器基类\n *\n * @author chitanda\n * @date 2022-07-20 18:07:11\n * @export\n * @class Interceptor\n */\nexport class Interceptor {\n /**\n * 请求拦截器绑定标识\n *\n * @author lxm\n * @date 2022-10-27 17:10:20\n * @private\n * @type {number}\n */\n private requestTag?: number;\n\n /**\n * 响应拦截器绑定标识\n *\n * @author lxm\n * @date 2022-10-27 17:10:19\n * @private\n * @type {number}\n */\n private responseTag?: number;\n\n /**\n * 请求之前处理\n *\n * @author lxm\n * @date 2022-10-27 17:10:41\n * @protected\n * @param {InternalAxiosRequestConfig} config\n * @returns {*} {Promise<InternalAxiosRequestConfig>}\n */\n protected async onBeforeRequest(\n config: InternalAxiosRequestConfig,\n ): Promise<InternalAxiosRequestConfig> {\n return config;\n }\n\n /**\n * 请求失败之后处理\n *\n * @author lxm\n * @date 2022-10-27 17:10:40\n * @protected\n * @param {*} error\n */\n protected onRequestError(error: Error): Promise<never> {\n // 处理请求错误\n return Promise.reject(error);\n }\n\n /**\n * 响应成功之后处理\n *\n * @author lxm\n * @date 2022-10-27 17:10:38\n * @protected\n * @param {AxiosResponse} config\n * @returns {*} {Promise<AxiosRequestConfig>}\n */\n protected async onResponseSuccess(\n config: AxiosResponse,\n ): Promise<AxiosResponse> {\n return config;\n }\n\n /**\n * 响应失败之后处理\n *\n * @author lxm\n * @date 2022-10-27 17:10:37\n * @protected\n * @param {*} _error\n */\n protected onResponseError(error: Error): Promise<never> {\n // 处理响应错误\n return Promise.reject(error);\n }\n\n /**\n * 使用拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:28\n * @param {AxiosInstance} instance\n */\n use(instance: AxiosInstance): void {\n this.requestTag = instance.interceptors.request.use(\n this.onBeforeRequest,\n this.onRequestError,\n );\n this.responseTag = instance.interceptors.response.use(\n this.onResponseSuccess,\n this.onResponseError,\n );\n }\n\n /**\n * 移出拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:27\n * @param {AxiosInstance} instance\n */\n eject(instance: AxiosInstance): void {\n if (this.requestTag) {\n instance.interceptors.request.eject(this.requestTag);\n }\n if (this.responseTag) {\n instance.interceptors.response.eject(this.responseTag);\n }\n }\n}\n","import { InternalAxiosRequestConfig } from 'axios';\nimport { getToken } from '../util/util';\nimport { Interceptor } from './interceptor';\n\n/**\n * 核心包拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:48\n * @export\n * @class CoreInterceptor\n * @extends {Interceptor}\n */\nexport class CoreInterceptor extends Interceptor {\n protected async onBeforeRequest(\n config: InternalAxiosRequestConfig,\n ): Promise<InternalAxiosRequestConfig> {\n config = await super.onBeforeRequest(config);\n\n const { headers } = config;\n\n // Set the access token.\n headers.set('Authorization', `Bearer ${getToken()}`);\n\n // Set the system ID.\n let systemId = ibiz.env.dcSystem;\n const { orgData } = ibiz;\n if (orgData) {\n if (orgData.systemid) {\n systemId = orgData.systemid;\n }\n if (orgData.orgid) {\n headers.set('srforgid', orgData.orgid);\n }\n }\n headers.set('srfsystemid', systemId);\n\n return config;\n }\n}\n","import { QXEvent } from 'qx-util';\nimport { IPortalMessage } from '../../../interface';\n\n/**\n * 消息事件\n *\n * @author chitanda\n * @date 2023-09-05 16:09:17\n * @interface MessageCenterEvent\n */\ninterface MessageCenterEvent {\n all: (msg: IPortalMessage) => void;\n}\n\n/**\n * 消息基类,各个类型消息继承此类\n *\n * @author chitanda\n * @date 2023-09-05 16:09:41\n * @export\n * @class MessageBase\n */\nexport abstract class MessageBase {\n /**\n * 事件\n *\n * @author chitanda\n * @date 2023-09-05 16:09:58\n * @protected\n * @type {QXEvent<MessageCenterEvent>}\n */\n protected evt: QXEvent<MessageCenterEvent> = new QXEvent(1000);\n\n constructor(protected parent?: MessageBase) {}\n\n /**\n * 推送标准结构消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:40\n * @param {IPortalMessage} msg\n */\n next(msg: IPortalMessage): void {\n this.evt.emit('all', msg);\n if (this.parent) {\n this.nextParent(msg);\n }\n }\n\n /**\n * 私有方法,专门向父级推送消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:08\n * @protected\n * @param {IPortalMessage} msg\n */\n protected nextParent(msg: IPortalMessage): void {\n if (this.parent) {\n this.parent.evt.emit('all', msg);\n this.parent.nextParent(msg);\n }\n }\n\n /**\n * 订阅消息\n *\n * @author chitanda\n * @date 2023-09-05 15:09:21\n * @param {(msg: IPortalMessage) => void} evt\n */\n on(cb: (msg: IPortalMessage) => void): void {\n this.evt.on('all', cb);\n }\n\n /**\n * 取消订阅\n *\n * @author chitanda\n * @date 2023-09-05 15:09:50\n * @param {(msg: IPortalMessage) => void} cb\n */\n off(cb: (msg: IPortalMessage) => void): void {\n this.evt.off('all', cb);\n }\n}\n","import { MessageBase } from './message-base';\n\n/**\n * 所有消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:34\n * @export\n * @class MessageAll\n * @extends {MessageBase}\n */\nexport class MessageAll extends MessageBase {}\n","import { createUUID } from 'qx-util';\nimport { IPortalMessage } from '../../../../interface';\nimport { MessageBase } from '../../base/message-base';\n\n/**\n * 指令消息基类\n *\n * @author chitanda\n * @date 2023-09-05 16:09:11\n * @export\n * @class CommandBase\n * @extends {MessageBase}\n */\nexport class CommandBase extends MessageBase {\n /**\n * 发送指令消息\n * @param data 更新的数据\n * @param subtype 数据更新 | 数据删除 | 数据创建\n */\n protected sendCommand(data: IData, subtype: IPortalMessage['subtype']): void {\n const msg: IPortalMessage = {\n messageid: createUUID(),\n messagename: 'command',\n type: 'COMMAND',\n subtype,\n data,\n };\n this.next(msg);\n }\n}\n","import { IAppDataEntity } from '../../interface';\nimport { CommandBase } from '../command-base/command-base';\n\n/**\n * 创建指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:57\n * @export\n * @class CommandCreate\n * @extends {CommandBase}\n */\nexport class CommandCreate extends CommandBase {\n /**\n * 发送新建的数据\n *\n * @author chitanda\n * @date 2023-09-05 17:09:13\n * @param {IAppDataEntity} data\n */\n send(data: IAppDataEntity): void {\n this.sendCommand(data, 'OBJECTCREATED');\n }\n}\n","import { IAppDataEntity } from '../../interface';\nimport { CommandBase } from '../command-base/command-base';\n\n/**\n * 更新指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:54\n * @export\n * @class CommandUpdate\n * @extends {CommandBase}\n */\nexport class CommandUpdate extends CommandBase {\n /**\n * 发送更新的数据\n *\n * @author chitanda\n * @date 2023-09-05 17:09:37\n * @param {IAppDataEntity} data\n */\n send(data: IAppDataEntity): void {\n this.sendCommand(data, 'OBJECTUPDATED');\n }\n}\n","import { IAppDataEntity } from '../../interface';\nimport { CommandBase } from '../command-base/command-base';\n\n/**\n * 删除指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:03\n * @export\n * @class CommandRemove\n * @extends {CommandBase}\n */\nexport class CommandRemove extends CommandBase {\n /**\n * 发送删除的数据\n *\n * @author chitanda\n * @date 2023-09-05 17:09:29\n * @param {IAppDataEntity} data\n */\n send(data: IAppDataEntity): void {\n this.sendCommand(data, 'OBJECTREMOVED');\n }\n}\n","import { CommandBase } from '../command-base/command-base';\n\n/**\n * 数据变更指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:49\n * @export\n * @class CommandChange\n * @extends {CommandBase}\n */\nexport class CommandChange extends CommandBase {}\n","import { IPortalAsyncAction } from '../../../../interface';\nimport { CommandBase } from '../command-base/command-base';\n\n/**\n * 异步作业指令消息\n *\n * @author chitanda\n * @date 2023-10-23 17:10:28\n * @export\n * @class CommandAsyncAction\n * @extends {CommandBase}\n */\nexport class CommandAsyncAction extends CommandBase {\n /**\n * 发送 异步作业 指令消息\n *\n * @author chitanda\n * @date 2023-10-23 17:10:46\n * @param {IPortalAsyncAction} data\n */\n send(data: IPortalAsyncAction): void {\n this.sendCommand(data, 'ASYNCACTION');\n }\n}\n","import { createUUID } from 'qx-util';\nimport { IPortalMessage } from '../../../interface';\nimport { MessageBase } from '../base/message-base';\nimport { CommandCreate } from './create/command-create';\nimport { CommandUpdate } from './update/command-update';\nimport { CommandRemove } from './remove/command-remove';\nimport { CommandChange } from './change/command-change';\nimport { CommandAsyncAction } from './async-action/command-async-action';\n\n/**\n * 指令消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:41\n * @export\n * @class MessageCommand\n * @extends {MessageBase}\n */\nexport class MessageCommand extends MessageBase {\n /**\n * 数据变更指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:15\n * @type {CommandChange}\n */\n readonly change: CommandChange = new CommandChange();\n\n /**\n * 新建消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:55\n * @type {CommandCreate}\n */\n readonly create: CommandCreate = new CommandCreate(this);\n\n /**\n * 更新消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:01\n * @type {CommandUpdate}\n */\n readonly update: CommandUpdate = new CommandUpdate(this);\n\n /**\n * 删除消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:05\n * @type {CommandRemove}\n */\n readonly remove: CommandRemove = new CommandRemove(this);\n\n /**\n * 异步作业指令消息\n *\n * @author chitanda\n * @date 2023-10-23 17:10:56\n * @type {CommandAsyncAction}\n */\n readonly asyncAction: CommandAsyncAction = new CommandAsyncAction(this);\n\n /**\n * 推送指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:50\n * @param {IPortalMessage} msg\n */\n next(msg: IPortalMessage): void {\n // 消息分子类型,子类型发完消息后,会让父发消息\n // 所以子类型有父时,会一级一级的往上发消息。不需要在此处发全局消息\n // change 特殊处理,不给父发消息\n switch (msg.subtype) {\n case 'OBJECTCREATED':\n this.create.next(msg);\n this.change.next(msg);\n break;\n case 'OBJECTUPDATED':\n this.update.next(msg);\n this.change.next(msg);\n break;\n case 'OBJECTREMOVED':\n this.remove.next(msg);\n this.change.next(msg);\n break;\n default:\n super.next(msg);\n }\n }\n\n protected nextParent(msg: IPortalMessage): void {\n switch (msg.subtype) {\n case 'OBJECTCREATED':\n this.change.next(msg);\n break;\n case 'OBJECTUPDATED':\n this.change.next(msg);\n break;\n case 'OBJECTREMOVED':\n this.change.next(msg);\n break;\n default:\n }\n super.nextParent(msg);\n }\n\n /**\n * 发送指令消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:35\n * @param {IData} data\n * @param {IPortalMessage['subtype']} subtype\n */\n send(data: IData, subtype: IPortalMessage['subtype']): void {\n const msg: IPortalMessage = {\n messageid: createUUID(),\n messagename: 'command',\n type: 'COMMAND',\n subtype,\n data,\n };\n this.next(msg);\n }\n}\n","import { createUUID } from 'qx-util';\nimport { IPortalMessage } from '../../../interface';\nimport { MessageBase } from '../base/message-base';\n\n/**\n * 日志消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:33\n * @export\n * @class MessageConsole\n * @extends {MessageBase}\n */\nexport class MessageConsole extends MessageBase {\n /**\n * 发送日志消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:25\n * @param {(IData | string)} data\n */\n send(data: IData | string): void {\n const msg: IPortalMessage = {\n messageid: createUUID(),\n messagename: 'console',\n type: 'CONSOLE',\n data,\n };\n this.next(msg);\n }\n}\n","import { IPortalMessage } from '../../interface';\nimport { MessageAll } from './base/message-all';\nimport { MessageCommand } from './command/message-command';\nimport { MessageConsole } from './console/message-console';\n\n/**\n * 界面消息中心\n *\n * @author chitanda\n * @date 2023-09-05 15:09:14\n * @export\n * @class MessageCenter\n */\nexport class MessageCenter {\n /**\n * 所有消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:12\n * @type {MessageAll}\n */\n protected all: MessageAll = new MessageAll();\n\n /**\n * 指令消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:28\n * @type {MessageCommand}\n */\n readonly command: MessageCommand = new MessageCommand(this.all);\n\n /**\n * 日志消息\n *\n * @author chitanda\n * @date 2023-09-05 16:09:48\n * @type {MessageConsole}\n */\n readonly console: MessageConsole = new MessageConsole(this.all);\n\n /**\n * 发送消息\n *\n * @author chitanda\n * @date 2023-09-05 15:09:49\n * @param {IPortalMessage} msg\n */\n next(msg: IPortalMessage): void {\n // 消息分子类型,子类型发完消息后,会让父发消息\n // 所以子类型有父时,会一级一级的往上发消息。不需要在此处发全局消息\n if (msg.type === 'COMMAND') {\n this.command.next(msg);\n } else if (msg.type === 'CONSOLE') {\n this.console.next(msg);\n } else {\n this.all.next(msg);\n }\n }\n\n /**\n * 订阅消息\n *\n * @author chitanda\n * @date 2023-09-05 17:09:32\n * @param {(msg: IPortalMessage) => void} callback\n */\n on(callback: (msg: IPortalMessage) => void): void {\n this.all.on(callback);\n }\n\n /**\n * 取消订阅\n *\n * @author chitanda\n * @date 2023-09-05 17:09:38\n * @param {(msg: IPortalMessage) => void} callback\n */\n off(callback: (msg: IPortalMessage) => void): void {\n this.all.off(callback);\n }\n}\n","export const defaultNamespace = 'ibiz';\nconst statePrefix = 'is-';\n\n/**\n * css bem 命名规则拼接\n * _bem('ibiz', 'layout') => ibiz-layout\n * _bem('ibiz', 'layout', '', 'title') => ibiz-layout__title\n * _bem('ibiz', 'layout', '', '', 'right') => ibiz-layout--right\n * _bem('ibiz', 'layout', '', 'title', 'right') => ibiz-layout__title--right\n * _bem('ibiz', 'layout', 'header', 'title', 'right') => ibiz-layout-header__title--right\n *\n * @author chitanda\n * @date 2022-09-06 11:09:42\n * @param {string} namespace 命名空间\n * @param {string} block 块\n * @param {string} blockSuffix 块后缀\n * @param {string} element 元素\n * @param {string} modifier 修饰符\n * @return {*} {string}\n */\nfunction _bem(\n namespace: string,\n block: string,\n blockSuffix?: string,\n element?: string,\n modifier?: string,\n): string {\n let cls = `${namespace}-${block}`;\n if (blockSuffix) {\n cls += `-${blockSuffix}`;\n }\n if (element) {\n cls += `__${element}`;\n }\n if (modifier) {\n cls += `--${modifier}`;\n }\n return cls;\n}\n\n/**\n * 全局样式处理命名空间\n *\n * @author chitanda\n * @date 2022-09-06 11:09:50\n * @export\n * @class Namespace\n */\nexport class Namespace {\n /**\n * 命名空间\n *\n * @author chitanda\n * @date 2022-09-06 12:09:01\n * @type {string}\n */\n namespace: string;\n\n /**\n * Creates an instance of Namespace.\n *\n * @author chitanda\n * @date 2022-09-06 12:09:12\n * @param {string} block 当前命名空间的根模块,例如组件的名称\n * @param {string} [namespace] 指定命名空间,未指定使用默认值 ibiz\n */\n constructor(\n protected block: string,\n namespace?: string,\n ) {\n this.namespace = namespace || defaultNamespace;\n }\n\n /**\n * namespace-block\n * namespace-block-blockSuffix\n *\n * @author chitanda\n * @date 2022-09-06 12:09:08\n * @param {string} [blockSuffix='']\n * @return {*} {string}\n */\n b(blockSuffix: string = ''): string {\n return _bem(this.namespace, this.block, blockSuffix, '', '');\n }\n\n /**\n * namespace-block__element\n *\n * @author chitanda\n * @date 2022-09-06 12:09:48\n * @param {string} [element]\n * @return {*} {string}\n */\n e(element?: string): string {\n return element ? _bem(this.namespace, this.block, '', element, '') : '';\n }\n\n /**\n * namespace-block--modifier\n *\n * @author chitanda\n * @date 2022-09-06 12:09:37\n * @param {string} [modifier]\n * @return {*} {string}\n */\n m(modifier?: string): string {\n return modifier ? _bem(this.namespace, this.block, '', '', modifier) : '';\n }\n\n /**\n * namespace-block-blockSuffix__element\n *\n * @author chitanda\n * @date 2022-09-06 12:09:52\n * @param {string} [blockSuffix]\n * @param {string} [element]\n * @return {*} {string}\n */\n be(blockSuffix?: string, element?: string): string {\n return blockSuffix && element\n ? _bem(this.namespace, this.block, blockSuffix, element, '')\n : '';\n }\n\n /**\n * namespace-block__element--modifier\n *\n * @author chitanda\n * @date 2022-09-06 12:09:19\n * @param {string} [element]\n * @param {string} [modifier]\n * @return {*} {string}\n */\n em(element?: string, modifier?: string): string {\n return element && modifier\n ? _bem(this.namespace, this.block, '', element, modifier)\n : '';\n }\n\n /**\n * namespace-block-blockSuffix--modifier\n *\n * @author chitanda\n * @date 2022-09-06 12:09:59\n * @param {string} [blockSuffix]\n * @param {string} [modifier]\n * @return {*} {string}\n */\n bm(blockSuffix?: string, modifier?: string): string {\n return blockSuffix && modifier\n ? _bem(this.namespace, this.block, blockSuffix, '', modifier)\n : '';\n }\n\n /**\n * namespace-block-blockSuffix__element--modifier\n *\n * @author chitanda\n * @date 2022-09-06 12:09:37\n * @param {string} [blockSuffix]\n * @param {string} [element]\n * @param {string} [modifier]\n * @return {*} {string}\n */\n bem(blockSuffix?: string, element?: string, modifier?: string): string {\n return blockSuffix && element && modifier\n ? _bem(this.namespace, this.block, blockSuffix, element, modifier)\n : '';\n }\n\n /**\n * 返回状态 class\n *\n * is('loading', false) => '';\n * is('loading', true) => 'is-loading';\n *\n * @author chitanda\n * @date 2022-09-06 12:09:57\n * @param {string} name\n * @param {boolean} [state]\n * @return {*} {string}\n */\n is(name: string, state?: boolean): string {\n return name && state ? `${statePrefix}${name}` : '';\n }\n\n /**\n * 生成使用到的 css 变量 style 对象\n *\n * @author chitanda\n * @date 2022-09-06 15:09:41\n * @param {Record<string, string>} object\n * @return {*} {Record<string, string>}\n */\n cssVar(object: Record<string, string>): Record<string, string> {\n const styles: Record<string, string> = {};\n for (const key in object) {\n if (object[key]) {\n styles[this.cssVarName(key)] = object[key];\n }\n }\n return styles;\n }\n\n /**\n * 生成使用到的 css block 变量 style 对象\n *\n * @author chitanda\n * @date 2022-09-06 15:09:03\n * @param {Record<string, string>} object\n * @return {*} {Record<string, string>}\n */\n cssVarBlock(object: Record<string, string>): Record<string, string> {\n const styles: Record<string, string> = {};\n for (const key in object) {\n if (object[key]) {\n styles[this.cssVarBlockName(key)] = object[key];\n }\n }\n return styles;\n }\n\n /**\n * 生成 css var 变量名称\n *\n * @author chitanda\n * @date 2022-09-06 15:09:21\n * @param {string} name\n * @return {*} {string}\n */\n cssVarName(name: string): string {\n return `--${this.namespace}-${name}`;\n }\n\n /**\n * 生成块 css var 变量名称\n *\n * @author chitanda\n * @date 2022-09-06 15:09:35\n * @param {string} name\n * @return {*} {string}\n */\n cssVarBlockName(name: string): string {\n return `--${this.namespace}-${this.block}-${name}`;\n }\n}\n","import axios, {\n AxiosResponse,\n AxiosResponseHeaders,\n InternalAxiosRequestConfig,\n RawAxiosResponseHeaders,\n} from 'axios';\n\n/**\n * Http请求返回接口\n *\n * @author chitanda\n * @date 2022-08-21 17:08:06\n * @export\n * @interface IHttpResponse\n * @extends {AxiosResponse}\n * @template T\n */\nexport interface IHttpResponse<T = IData> extends AxiosResponse {\n /**\n * 是否请求成功\n *\n * @description 当状态码为 200-299 时认为成功\n * @author chitanda\n * @date 2022-07-14 16:07:59\n * @type {boolean}\n */\n ok: boolean;\n /**\n * 是否为本地仿造响应\n *\n * @description 只有当值为 true 时, 才认为是本地仿造响应\n * @author chitanda\n * @date 2022-08-18 15:08:44\n * @type {boolean}\n */\n local: boolean;\n\n data: T;\n\n /**\n * 当前页\n */\n page?: number;\n\n /**\n * 分页条数\n */\n size?: number;\n\n /**\n * 总条数\n */\n total?: number;\n}\n\n/**\n * 本地请求仿造响应\n *\n * @author chitanda\n * @date 2022-08-21 17:08:00\n * @export\n * @class HttpResponse\n * @implements {IHttpResponse<T>}\n * @template T\n */\nexport class HttpResponse<T = IData> implements IHttpResponse<T> {\n /**\n * 本地仿造响应\n *\n * @author chitanda\n * @date 2022-08-18 15:08:06\n */\n local = true;\n\n ok = false;\n\n data: T;\n\n status: number;\n\n statusText: string;\n\n headers: RawAxiosResponseHeaders | AxiosResponseHeaders = {};\n\n config: InternalAxiosRequestConfig<IData> = {\n headers: new axios.AxiosHeaders(),\n };\n\n /**\n * Creates an instance of HttpResponse.\n *\n * @author chitanda\n * @date 2022-08-18 15:08:11\n * @param {unknown} [data] 返回的数据\n * @param {number} [status] 状态码 (默认为 200)\n * @param {string} [statusText] 状态描述 (默认为空字符)\n */\n constructor(data?: unknown, status?: number, statusText?: string) {\n this.data = data as T;\n this.status = status || 200;\n this.statusText = statusText || '';\n if (this.status >= 200 && this.status < 300) {\n this.ok = true;\n }\n }\n}\n","import axios, {\n AxiosError,\n RawAxiosRequestHeaders,\n AxiosResponse,\n AxiosRequestConfig,\n AxiosInstance,\n CreateAxiosDefaults,\n} from 'axios';\nimport {\n FetchEventSourceInit,\n fetchEventSource,\n} from '@microsoft/fetch-event-source';\nimport { merge } from 'lodash-es';\nimport qs from 'qs';\nimport { isNilOrEmpty, notNilEmpty } from 'qx-util';\nimport { mergeDeepRight } from 'ramda';\nimport { HttpError } from '../../error';\nimport { CoreInterceptor } from '../interceptor';\nimport { Interceptor } from '../interceptor/interceptor';\nimport { IHttpResponse } from './http-response';\nimport { getToken } from '../util/util';\n\n/**\n * 全局请求工具类\n *\n * @author chitanda\n * @date 2022-07-14 15:07:42\n * @export\n * @class Net\n */\nexport class Net {\n /**\n * axios实例\n *\n * @author lxm\n * @date 2022-10-27 17:10:18\n * @protected\n * @type {AxiosInstance}\n */\n protected instance: AxiosInstance;\n\n /**\n * 是否为 http || https 开头\n *\n * @author chitanda\n * @date 2022-11-07 14:11:28\n * @protected\n */\n protected urlReg = /^http[s]?:\\/\\/[^\\s]*/;\n\n /**\n * 请求等待队列,防止重复请求。当有完全相同请求参数的请求时,会等待上一个请求完成后把结果返回给当前请求,不会重复请求\n * key: 由请求的 config 生成的字符串,用于唯一标识请求\n * value: 当前正在请求的 Promise\n *\n * @author chitanda\n * @date 2023-06-07 14:06:19\n * @protected\n */\n protected waitRequest = new Map<string, Promise<AxiosResponse>>();\n\n protected get baseUrl(): string {\n return (\n this.instance.defaults.baseURL || `${ibiz.env.baseUrl}/${ibiz.env.appId}`\n );\n }\n\n /**\n * Creates an instance of Net.\n * @author lxm\n * @date 2022-10-27 16:10:05\n * @param {CreateAxiosDefaults} [config] 创建实例用的默认配置\n */\n constructor(config?: CreateAxiosDefaults) {\n this.instance = axios.create(config);\n this.addInterceptor('Default', new CoreInterceptor());\n }\n\n /**\n * 注册的拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:18\n * @type {Map<string, Interceptor>}\n */\n interceptors: Map<string, Interceptor> = new Map();\n\n /**\n * 添加拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:42\n * @param {string} name 唯一标识\n * @param {Interceptor} interceptor 拦截器\n */\n addInterceptor(name: string, interceptor: Interceptor): void {\n interceptor.use(this.instance);\n this.interceptors.set(name, interceptor);\n }\n\n /**\n * 删除拦截器\n *\n * @author lxm\n * @date 2022-10-27 17:10:27\n * @param {string} name 唯一标识\n */\n removeInterceptor(name: string): void {\n const interceptor = this.interceptors.get(name);\n if (interceptor) {\n interceptor.eject(this.instance);\n this.interceptors.delete(name);\n }\n }\n\n /**\n * 预置config,绑定动态的配置\n *\n * @author lxm\n * @date 2022-10-27 16:10:48\n * @readonly\n * @protected\n * @type {AxiosRequestConfig}\n */\n protected get presetConfig(): AxiosRequestConfig {\n return {\n // 请求前缀路径\n baseURL: this.baseUrl,\n headers: {\n 'Content-Type': 'application/json;charset=UTF-8',\n Accept: 'application/json',\n },\n };\n }\n\n /**\n * 从左到右递归合并配置参数(内置第一个合并的预置参数)\n *\n * @author lxm\n * @date 2022-10-27 16:10:09\n * @protected\n * @param {...AxiosRequestConfig[]} configs\n * @returns {*}\n */\n protected mergeConfig(...configs: AxiosRequestConfig[]): AxiosRequestConfig {\n const config = this.presetConfig;\n if (configs.length === 0) {\n return config;\n }\n const { url } = configs[0];\n if (url && this.urlReg.test(url)) {\n delete config.baseURL;\n }\n return merge(config, ...configs);\n }\n\n /**\n * Post 请求\n *\n * @author chitanda\n * @date 2022-10-19 11:10:30\n * @param {string} url\n * @param {IData} data\n * @param {IParams} [params={}]\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async post(\n url: string,\n data: IData,\n params: IParams = {},\n headers: RawAxiosRequestHeaders = {},\n ): Promise<IHttpResponse> {\n url = this.handleAppPresetParam(url, params);\n try {\n const response = await this.request(url, {\n method: 'post',\n data,\n headers,\n });\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * Get 请求\n *\n * @author chitanda\n * @date 2022-10-19 11:10:24\n * @param {string} url\n * @param {IParams} [params={}]\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @param {IParams} [option={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async get(\n url: string,\n params: IParams = {},\n headers: RawAxiosRequestHeaders = {},\n option: AxiosRequestConfig = {},\n ): Promise<IHttpResponse> {\n url = this.attachUrlParam(url, params);\n try {\n const response = await this.request(\n url,\n merge({ method: 'get', headers }, option),\n );\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * Delete 请求\n *\n * @author chitanda\n * @date 2022-10-19 11:10:17\n * @param {string} url\n * @param {IParams} [params]\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async delete(\n url: string,\n params?: IParams,\n headers: RawAxiosRequestHeaders = {},\n ): Promise<IHttpResponse> {\n url = this.handleAppPresetParam(url, params);\n try {\n const response = await this.request(url, { method: 'delete', headers });\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * Put 请求\n *\n * @author chitanda\n * @date 2022-10-19 11:10:11\n * @param {string} url\n * @param {IData} data\n * @param {IParams} [params={}]\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async put(\n url: string,\n data: IData,\n params: IParams = {},\n headers: RawAxiosRequestHeaders = {},\n ): Promise<IHttpResponse> {\n url = this.handleAppPresetParam(url, params);\n try {\n const response = await this.request(url, {\n method: 'put',\n data,\n headers,\n });\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * 获取模型数据\n *\n * @author chitanda\n * @date 2022-07-14 15:07:15\n * @param {string} url\n * @param {RawAxiosRequestHeaders} [headers={}]\n * @return {*} {Promise<IHttpResponse>}\n */\n async getModel(\n url: string,\n headers: RawAxiosRequestHeaders = {},\n ): Promise<IHttpResponse> {\n try {\n const response = await this.instance.get(url, {\n headers,\n });\n return this.doResponseResult(response);\n } catch (error) {\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * 基础请求方法,会合并预置配置\n *\n * @author lxm\n * @date 2022-10-27 14:10:06\n * @param {string} url\n * @param {AxiosRequestConfig} [config={}]\n * @returns {*} {Promise<IHttpResponse>}\n */\n async request(\n url: string,\n config: AxiosRequestConfig = {},\n ): Promise<IHttpResponse> {\n // axios 请求参数配置\n const cfg = this.mergeConfig({ url }, config);\n // 当前请求的唯一标识\n const key = JSON.stringify(cfg);\n try {\n let requestPromise: Promise<AxiosResponse> | null = null;\n if (!this.waitRequest.has(key)) {\n requestPromise = this.instance.request(cfg);\n this.waitRequest.set(key, requestPromise);\n } else {\n requestPromise = this.waitRequest.get(key)!;\n }\n const response = await requestPromise;\n // 当第一个请求完成后就删除等待队列中的请求\n if (this.waitRequest.has(key)) {\n this.waitRequest.delete(key);\n }\n return this.doResponseResult(response);\n } catch (error) {\n // 请求异常删除等待队列中的请求体\n if (this.waitRequest.has(key)) {\n this.waitRequest.delete(key);\n }\n throw new HttpError(error as AxiosError);\n }\n }\n\n /**\n * 创建标准 axios 请求\n *\n * @author chitanda\n * @date 2023-01-30 15:01:27\n * @param {AxiosRequestConfig<IData>} config\n * @return {*}\n */\n axios(config: AxiosRequestConfig<IData>): Promise<AxiosResponse> {\n return axios(config);\n }\n\n /**\n * 触发 sse 请求\n *\n * @author chitanda\n * @date 2023-10-10 16:10:08\n * @param {string} url\n * @param {IParams} params\n * @param {FetchEventSourceInit} [options={}]\n * @return {*} {Promise<void>}\n */\n async sse(\n url: string,\n params: IParams,\n options: FetchEventSourceInit = {},\n ): Promise<void> {\n url = this.attachUrlParam(this.baseUrl + url, params);\n if (!options.headers) {\n options.headers = {};\n }\n const headers = options.headers!;\n // 补充基本认证信息\n {\n headers.Authorization = `Bearer ${getToken()}`;\n let systemId = ibiz.env.dcSystem;\n const { orgData } = ibiz;\n if (orgData) {\n if (orgData.systemid) {\n systemId = orgData.systemid;\n }\n if (orgData.orgid) {\n headers.srforgid = orgData.orgid;\n }\n }\n headers.srfsystemid = systemId;\n }\n const config = mergeDeepRight(\n {\n openWhenHidden: true,\n method: 'POST',\n },\n options,\n );\n await fetchEventSource(url, config);\n }\n\n /**\n * 统一处理请求返回\n *\n * @author chitanda\n * @date 2022-07-14 16:07:23\n * @private\n * @param {AxiosResponse} response\n * @return {*} {IHttpResponse}\n */\n private doResponseResult(response: AxiosResponse): IHttpResponse {\n const res = response as IHttpResponse;\n if (res.status >= 200 && res.status <= 299) {\n res.ok = true;\n if (isNilOrEmpty(res.data)) {\n res.data = undefined as unknown as IData;\n }\n }\n return res;\n }\n\n /**\n * 处理平台预定义参数\n *\n * @author chitanda\n * @date 2022-07-14 15:07:12\n * @private\n * @param {string} url\n * @param {IParams} [params]\n * @return {*} {string}\n */\n private handleAppPresetParam(url: string, params?: IParams): string {\n if (params) {\n const keys = Object.keys(params);\n const tempParam: IParams = {};\n keys.forEach((item: string) => {\n if (item.startsWith('srf') && notNilEmpty(params[item])) {\n tempParam[item] = params[item];\n }\n });\n return this.attachUrlParam(url, params);\n }\n return url;\n }\n\n /**\n * url 附加请求参数,并处理路径的字符转换 encode\n *\n * @author chitanda\n * @date 2022-07-14 15:07:34\n * @private\n * @param {string} url\n * @param {IParams} params\n * @return {*} {string}\n */\n private attachUrlParam(url: string, params: IParams): string {\n {\n // url 转码\n const urlSplit = url.split('?');\n urlSplit[0] = urlSplit[0]\n .split('/')\n .map(item => encodeURIComponent(item))\n .join('/');\n url = urlSplit.length > 1 ? urlSplit.join('?') : urlSplit[0];\n }\n const strParams: string = qs.stringify(params);\n if (notNilEmpty(strParams)) {\n if (url.endsWith('?')) {\n url = `${url}${strParams}`;\n } else if (url.indexOf('?') !== -1 && url.endsWith('&')) {\n url = `${url}${strParams}`;\n } else if (url.indexOf('?') !== -1 && !url.endsWith('&')) {\n url = `${url}&${strParams}`;\n } else {\n url = `${url}?${strParams}`;\n }\n }\n return url;\n }\n}\n","import { notNilEmpty } from 'qx-util';\n\n/**\n * 字符串工具类\n *\n * @author chitanda\n * @date 2021-04-23 20:04:27\n * @export\n * @class StringUtil\n */\nexport class StringUtil {\n /**\n * 上下文替换正则\n *\n * @author chitanda\n * @date 2021-04-23 20:04:01\n * @static\n */\n static contextReg = /\\$\\{context.[a-zA-Z_$][a-zA-Z0-9_$]{1,}\\}/g;\n\n /**\n * 数据替换正则\n *\n * @author chitanda\n * @date 2021-04-23 20:04:09\n * @static\n */\n static dataReg = /\\$\\{data.[a-zA-Z_$][a-zA-Z0-9_$]{1,}\\}/g;\n\n /**\n * 填充字符串中的数据\n *\n * @author chitanda\n * @date 2021-04-23 20:04:17\n * @static\n * @param {string} str\n * @param {*} [context]\n * @param {*} [data]\n * @return {*} {string}\n */\n static fill(str: string, context?: IContext, data?: IData): string {\n if (notNilEmpty(str)) {\n if (notNilEmpty(context)) {\n const strArr = str.match(this.contextReg);\n strArr?.forEach(_key => {\n const key = _key.slice(10, _key.length - 1);\n str = str.replace(`\\${context.${key}}`, context![key] || '');\n });\n }\n if (notNilEmpty(data)) {\n const strArr = str.match(this.dataReg);\n strArr?.forEach(_key => {\n const key = _key.slice(7, _key.length - 1);\n str = str.replace(`\\${data.${key}}`, data![key] || '');\n });\n }\n }\n return str;\n }\n}\n","/**\n * 路径解析助手\n *\n * @author lxm\n * @date 2022-10-11 14:10:12\n * @export\n * @class UrlHelper\n */\nexport class UrlHelper {\n /**\n * 路由路径前面的基础路径\n * 如:http://172.16.103.120:30061/portalwebapp/#/index/appportalview?params=123\n * 返回:http://172.16.103.120:30061/portalwebapp/#\n *\n * @author lxm\n * @date 2022-10-11 20:10:29\n * @returns {*}\n */\n static get routeBase(): string {\n const hashIndex = window.location.href.lastIndexOf('#/');\n return window.location.href.slice(0, hashIndex + 1);\n }\n\n /**\n * 应用的的基础路径\n * 如:http://172.16.103.120:30061/portalwebapp/#/index/appportalview?params=123\n * 返回:http://172.16.103.120:30061/portalwebapp\n *\n * @author lxm\n * @date 2022-10-11 20:10:29\n * @returns {*}\n */\n static get appBase(): string {\n const { origin, pathname } = window.location;\n return `${origin}${pathname}`.replace(/\\/$/, '');\n }\n\n /**\n * #开始到末尾,即路由地址\n * 如:http://172.16.103.120:30061/portalwebapp/#/index/appportalview?params=123\n * 返回:/index/appportalview?params=123\n *\n * @author lxm\n * @date 2022-10-11 16:10:40\n * @returns {*}\n */\n static get routePath(): string {\n return window.location.hash.replace('#', '');\n }\n\n /**\n * 当前地址的全路径,包含域名和参数\n * 如:http://172.16.103.120:30061/portalwebapp/#/index/appportalview?params=123\n *\n * @author lxm\n * @date 2022-10-11 21:10:39\n * @readonly\n * @static\n */\n static get fullPath(): string {\n return window.location.href;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { NOOP } from '../../constant';\n\n/**\n * 计算event的composedPath返回事件路径(兼容了IE)\n *\n * @author lxm\n * @date 2022-10-28 17:10:14\n * @param {MouseEvent} event\n * @returns {*}\n */\nexport function eventPath(event: MouseEvent): (EventTarget | null)[] {\n const path = ((event.composedPath && event.composedPath()) ||\n (event as any).path) as HTMLElement[] | undefined;\n\n if (path != null) return path;\n\n // 浏览器没有提供的,自己递归计算\n function getParents(\n node: HTMLElement,\n memo: HTMLElement[] = [],\n ): HTMLElement[] {\n const parentNode = node.parentNode as HTMLElement | null;\n\n return parentNode\n ? getParents(parentNode, memo.concat([parentNode]))\n : memo;\n }\n\n return [event.target].concat(getParents(event.target as HTMLElement));\n}\n\n/**\n * 监听JS原生事件,返回cleanup回调,调用后删除该监听\n *\n * @author lxm\n * @date 2022-10-28 18:10:36\n * @export\n * @param {EventTarget} target 监听对象\n * @param {string} eventName 监听事件名称\n * @param {(..._args: any[]) => any} listener 监听回调\n * @param {AddEventListenerOptions} options 额外参数\n * @returns {*} {() => void}\n */\nexport function listenJSEvent(\n target: EventTarget,\n eventName: string,\n listener: (..._args: any[]) => any,\n options: AddEventListenerOptions = {},\n): () => void {\n target.addEventListener(eventName, listener, options);\n\n let cleanup = (): void => {\n target.removeEventListener(eventName, listener, options);\n // cleanup方法只能调用一次\n cleanup = NOOP;\n };\n\n return () => {\n cleanup();\n };\n}\n\n/**\n * event是否是在目标元素内部触发的\n *\n * @author lxm\n * @date 2022-10-31 11:10:49\n * @export\n * @param {MouseEvent} event 原生事件\n * @param {HTMLElement} el 目标元素\n * @returns {*} {boolean}\n */\nexport function isEventInside(event: MouseEvent, el: HTMLElement): boolean {\n return el && (event.target === el || eventPath(event).includes(el));\n}\n","import { RuntimeError } from '../../error';\nimport {\n OnClickOutsideHandler,\n OnClickOutsideOptions,\n OnClickOutsideResult,\n} from '../../interface';\nimport { eventPath, isEventInside, listenJSEvent } from '../event/event';\n\nconst defaultWindow = typeof window !== 'undefined' ? window : undefined;\n\n/**\n * 监听目标元素之外的点击事件回调\n *\n * @author lxm\n * @date 2022-10-28 18:10:25\n * @export\n * @param {HTMLElement} target 目标元素\n * @param {OnClickOutsideHandler} handler 触发的时间回调\n * @param {OnClickOutsideOptions} [options={}] 额外配置参数\n * @returns {*} {OnClickOutsideResult}\n */\nexport function onClickOutside(\n target: HTMLElement,\n handler: OnClickOutsideHandler,\n options: OnClickOutsideOptions = {},\n): OnClickOutsideResult {\n const { window = defaultWindow, ignore = [], capture = true } = options;\n\n if (!target) throw new RuntimeError('target元素不存在');\n if (!window) throw new RuntimeError('找不到window');\n\n /** 是否需要监听,为false时handler不会执行 */\n let shouldListen = true;\n\n /**\n * 判断event的触发是否是在元素的外部(排除了ignore元素)\n * @param event 事件对象\n * @returns\n */\n const isOutside = (event: MouseEvent): boolean => {\n // 有一个判断是在内部,则不算外部,返回false\n return ![target, ...ignore].some(el => {\n return isEventInside(event, el);\n });\n };\n\n /** 暂停,所有监听的回调都不执行,用于增强某些ignore无法实现的场景 */\n let isPaused = false;\n const pause = (): void => {\n isPaused = true;\n };\n const proceed = (): void => {\n isPaused = false;\n };\n\n /** pointerup延时触发标识 */\n let fallback: number;\n\n /**\n * 事件监听处理回调\n * @param event 事件对象\n * @returns\n */\n const listener = (event: MouseEvent): void => {\n if (isPaused) return;\n window.clearTimeout(fallback);\n\n // 当需要监听并且最终触发在外部时才需要执行回调\n if (!(shouldListen && isOutside(event))) return;\n\n handler(event);\n };\n\n // 鼠标左键单击先后触发pointerdown,pointerup,click\n // 鼠标右键单击先后触发pointerdown,pointerup\n const cleanups = [\n listenJSEvent(window, 'click', listener, { passive: true, capture }),\n listenJSEvent(\n window,\n 'pointerdown',\n e => {\n if (isPaused) return;\n // 当pointerdown是在内部触发则不需要后续监听\n shouldListen = isOutside(e);\n },\n { passive: true },\n ),\n listenJSEvent(\n window,\n 'pointerup',\n e => {\n if (isPaused) return;\n // 鼠标左键触发才执行\n if (e.button === 0) {\n // 锁死结果避免延时执行时变更\n const path = eventPath(e);\n e.composedPath = (): (EventTarget | null)[] => path;\n fallback = window.setTimeout(() => listener(e), 50);\n }\n },\n { passive: true },\n ),\n ].filter(Boolean);\n\n /**\n * 停止事件监听,移除监听\n */\n const stop = (): void => cleanups.forEach(fn => fn());\n return { stop, pause, proceed };\n}\n","/* eslint-disable no-bitwise */\n/* eslint-disable no-nested-ternary */\nconst r = Math.round;\n\n/**\n * 把颜色字符串转成RGBA数组\n *\n * @param {string} color 颜色字符串\n * @returns {*} {number[]}\n */\nfunction toRGBA(color: string): number[] {\n const l = color.length;\n const rgba = [];\n if (color.slice(0, 3).toLowerCase() === 'rgb') {\n const d = color.match(/([\\d|.%]{1,3})/g)!;\n rgba[0] = parseInt(d[0], 10);\n rgba[1] = parseInt(d[1], 10);\n rgba[2] = parseInt(d[2], 10);\n rgba[3] = d[3]\n ? d[3].indexOf('%') !== -1\n ? parseInt(d[3], 10) / 100\n : parseFloat(d[3])\n : 1;\n } else {\n let d: number;\n if (l < 6)\n d = parseInt(\n String(color[1]) +\n color[1] +\n color[2] +\n color[2] +\n color[3] +\n color[3] +\n (l > 4 ? String(color[4]) + color[4] : ''),\n 16,\n );\n else d = parseInt(color.slice(1), 16);\n rgba[0] = (d >> 16) & 255;\n rgba[1] = (d >> 8) & 255;\n rgba[2] = d & 255;\n rgba[3] =\n l === 9 || l === 5 ? r((((d >> 24) & 255) / 255) * 10000) / 10000 : 1;\n }\n return rgba;\n}\n\n/**\n * 混合两种颜色,颜色格式支持hex和rgb\n * 如:#46b5d555,#fff\n * rgb(245 245 245 / 80%)\n *\n * @param {string} color1 颜色1\n * @param {string} color2 颜色2\n * @param {number} [p=0.5] 颜色1占多少百分比,小数格式\n * @param {(\"hex\" | \"rgb\")} [format=\"hex\"] 输出的格式,hex或rgb\n * @returns {*}\n */\nexport function colorBlend(\n color1: string,\n color2: string,\n p = 0.5,\n format: 'hex' | 'rgb' = 'hex',\n): string {\n color1 = color1.trim();\n color2 = color2.trim();\n const c1 = toRGBA(color1);\n const c2 = toRGBA(color2);\n const result = [\n r((1 - p) * c1[0] + p * c2[0]),\n r((1 - p) * c1[1] + p * c2[1]),\n r((1 - p) * c1[2] + p * c2[2]),\n (1 - p) * c1[3] + p * c2[3],\n ];\n if (format === 'hex') {\n const hex = [\n result[0].toString(16),\n result[1].toString(16),\n result[2].toString(16),\n result[3] === 0 ? '00' : r(result[3] * 255).toString(16),\n ];\n return `#${hex[0]}${hex[1]}${hex[2]}${hex[3]}`;\n }\n return `rgb(${result[0]} ${result[1]} ${result[2]} / ${result[3]})`;\n}\n","/**\n * 根据文件名称计算Mime类型\n *\n * @author lxm\n * @date 2022-11-16 22:11:02\n * @export\n * @param {string} fileName\n * @returns {*}\n */\nexport function calcMimeByFileName(fileName: string): string {\n const ext = fileName.split('.').pop();\n let mime = '';\n switch (ext) {\n case '.wps':\n mime = 'application/kswps';\n break;\n case '.doc':\n mime = 'application/msword';\n break;\n case '.docx':\n mime =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n break;\n case '.txt':\n mime = 'text/plain';\n break;\n case '.zip':\n mime = 'application/zip';\n break;\n case '.png':\n mime = 'image/png';\n break;\n case '.gif':\n mime = 'image/gif';\n break;\n case '.jpeg':\n mime = 'image/jpeg';\n break;\n case '.jpg':\n mime = 'image/jpeg';\n break;\n case '.rtf':\n mime = 'application/rtf';\n break;\n case '.avi':\n mime = 'video/x-msvideo';\n break;\n case '.gz':\n mime = 'application/x-gzip';\n break;\n case '.tar':\n mime = 'application/x-tar';\n break;\n case '.xlsx':\n mime = 'application/vnd.ms-excel';\n break;\n default:\n mime = '';\n }\n return mime;\n}\n\n/**\n * 判断是否是图片格式\n *\n * @author lxm\n * @date 2022-11-21 13:11:23\n * @export\n * @param {string} fileName\n * @returns {*} {boolean}\n */\nexport function isImage(fileName: string): boolean {\n const ext = fileName.split('.').pop();\n if (!ext) {\n return false;\n }\n const imageTypes = ['.jpeg', 'jpg', 'gif', 'png', 'bmp', 'svg'];\n return imageTypes.includes(ext);\n}\n\n/**\n * 纯JS触发下载文件\n *\n * @author lxm\n * @date 2022-11-16 22:11:24\n * @export\n * @param {Blob} file 文件流Blob\n * @param {string} fileName 文件名称\n */\nexport function downloadFileFromBlob(file: Blob, fileName: string): void {\n // 获取文件名\n const filetype = calcMimeByFileName(fileName);\n // 用blob对象获取文件流\n const blob = new Blob([file], { type: filetype });\n // 通过文件流创建下载链接\n const href = URL.createObjectURL(blob);\n // 创建一个a元素并设置相关属性\n const a = document.createElement('a');\n a.href = href;\n a.download = fileName;\n // 添加a元素到当前网页\n document.body.appendChild(a);\n // 触发a元素的点击事件,实现下载\n a.click();\n // 从当前网页移除a元素\n document.body.removeChild(a);\n // 释放blob对象\n URL.revokeObjectURL(href);\n}\n","import { merge } from 'lodash-es';\n\n/**\n * 文件List转数组\n *\n * @author lxm\n * @date 2022-11-18 13:11:03\n * @export\n * @param {FileList} fileList\n * @returns {*}\n */\nexport function fileListToArr(fileList: FileList): File[] {\n const files = [];\n for (let i = 0; i < fileList.length; i++) {\n files.push(fileList[i]);\n }\n return files;\n}\n\n/**\n * JS打开文件上传操作配置参数\n *\n * @author lxm\n * @date 2022-11-20 21:11:47\n * @export\n * @interface SelectFileOpts\n */\nexport interface SelectFileOpts {\n /**\n * 接受的文件类型\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @type {string}\n */\n accept?: string;\n /**\n * 是否支持多选\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @type {boolean}\n */\n multiple?: boolean;\n /**\n * 选中文件后回调\n *\n * @author lxm\n * @date 2022-11-20 21:11:50\n */\n onSelected: (_fileList: File[]) => void;\n}\n\n/**\n * JS打开文件上传操作\n *\n * @author lxm\n * @date 2022-11-20 21:11:31\n * @export\n * @param {SelectFileOpts} _opts 配置参数\n */\nexport function selectFile(_opts: SelectFileOpts): void {\n const opts: Required<SelectFileOpts> = merge(\n {\n multiple: true,\n accept: '',\n },\n _opts,\n );\n const input = document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('multiple', `${opts.multiple}`);\n input.setAttribute('accept', opts.accept);\n input.onchange = (e): void => {\n const inputEl = e.target as HTMLInputElement;\n const files = inputEl.files ? fileListToArr(inputEl.files) : [];\n if (files.length === 0) {\n return;\n }\n opts.onSelected(files);\n inputEl.value = ''; // 如果不置空,相同的文件不会触发change事件\n };\n document.body.appendChild(input);\n input.click();\n document.body.removeChild(input);\n}\n","/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable no-param-reassign */\nimport { cloneDeep, isFunction, merge, round, uniqueId } from 'lodash-es';\nimport { RuntimeError } from '../../error';\nimport { HttpResponse } from '../net/http-response';\nimport { selectFile } from './select-file';\n\nexport interface IUploadFile {\n name: string;\n uid: string;\n status: 'uploading' | 'finished' | 'fail' | 'cancel';\n percentage: number;\n response?: HttpResponse;\n error?: unknown;\n}\n\nexport interface IUploadFileOpts {\n uploadUrl: string;\n /**\n * 接受的文件类型\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @type {string}\n */\n accept?: string;\n /**\n * 是否支持多选\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @type {Boolean}\n */\n multiple?: boolean;\n separate?: string;\n request?: (_files: File[]) => Promise<HttpResponse>;\n beforeUpload?: (_fileData: File[], _files: IUploadFile[]) => boolean;\n finish?: (_resultFiles: IUploadFile[]) => void;\n success?: (_resultFiles: IUploadFile[], _res: HttpResponse) => void;\n error?: (_resultFiles: IUploadFile[], _error: unknown) => void;\n progress?: (_files: IUploadFile[]) => void;\n}\n\n/**\n * 使用上传文件逻辑\n *\n * @author lxm\n * @date 2022-11-20 21:11:52\n * @export\n * @param {IUploadFileOpts} _opts\n * @returns {*}\n */\nexport function uploadFile(_opts: IUploadFileOpts): void {\n const opts: Required<IUploadFileOpts> = merge(\n {\n multiple: true,\n accept: '',\n separate: true,\n beforeUpload: (_fileData: File[], _files: IUploadFile[]) => true,\n finish: (_resultFiles: IUploadFile[]) => {},\n success: (_resultFiles: IUploadFile[], _res: HttpResponse) => {},\n error: (_resultFiles: IUploadFile[], _error: unknown) => {},\n progress: (_files: IUploadFile[]) => {},\n },\n _opts,\n );\n\n /**\n * 进度条回调\n *\n * @author lxm\n * @date 2022-11-20 21:11:47\n * @param {IParams} event\n * @param {IUploadFile[]} files\n */\n const onUploadProgress = (event: IParams, files: IUploadFile[]): void => {\n files.forEach(file => {\n file.percentage = round(event.progress * 100);\n });\n opts.progress(cloneDeep(files));\n };\n\n /**\n * 上传请求方法,返回响应对象\n *\n * @author lxm\n * @date 2022-11-18 13:11:57\n * @param {File[]} files\n * @returns {*} {Promise<HttpResponse>}\n */\n const uploadRequest = async (\n files: File[],\n _onProgress: (_event: IParams) => void,\n ): Promise<HttpResponse> => {\n // 自定义上传请求\n if (opts.request && isFunction(opts.request)) {\n return opts.request(files);\n }\n\n // 默认每次单个文件上传,可能存在接口一次上传多个文件,\n const data = new FormData();\n files.forEach(file => {\n data.append('file', file);\n });\n // const res = await ibiz.net.request(opts.uploadUrl, {\n // method: 'post',\n // baseURL: '',\n // data,\n // headers: { 'Content-Type': 'multipart/form-data' },\n // onUploadProgress: onProgress,\n // });\n // return res;\n throw new RuntimeError(`多应用模式等待重新实现请求`);\n };\n\n /**\n * 执行一次上传,可能是一个文件也可能是多个文件\n *\n * @author lxm\n * @date 2022-11-18 14:11:54\n * @param {File[]} files 此次上传文件的集合\n * @returns {*} {Promise<IUploadFile[]>}\n */\n const executeSingleUpload = async (files: File[]): Promise<IUploadFile[]> => {\n const resultFiles: IUploadFile[] = files.map(file => {\n return {\n status: 'uploading',\n name: file.name,\n uid: uniqueId(),\n percentage: 0,\n };\n });\n\n // 上传前回调,可以取消此次下载\n const pass = opts.beforeUpload(files, resultFiles);\n if (!pass) {\n resultFiles.forEach(file => {\n file.status = 'cancel';\n });\n ibiz.log.debug('取消上传', resultFiles);\n return resultFiles;\n }\n\n try {\n const res = await uploadRequest(files, event => {\n onUploadProgress(event, resultFiles);\n });\n resultFiles.forEach(file => {\n file.status = 'finished';\n });\n // 上传成功事件\n opts.success(resultFiles, res);\n resultFiles.forEach(file => {\n file.response = res;\n });\n } catch (error) {\n resultFiles.forEach(file => {\n file.status = 'fail';\n });\n // 上传失败事件\n opts.error(resultFiles, error);\n resultFiles.forEach(file => {\n file.error = error;\n });\n ibiz.log.error(error);\n ibiz.log.error(`${files.map(file => file.name).join(',')}上传失败`);\n }\n return resultFiles;\n };\n\n /**\n * 执行上传文件逻辑\n *\n * @author lxm\n * @date 2022-11-18 13:11:21\n * @param {files} File[] 文件集合\n */\n const uploadFiles = async (files: File[]): Promise<void> => {\n const uploadSequence = opts.separate ? files.map(file => [file]) : [files];\n const res = await Promise.allSettled(\n uploadSequence.map(async sequence => {\n return executeSingleUpload(sequence);\n }),\n );\n\n // 整合所有的返回文件\n const resultFiles: IUploadFile[] = [];\n res.forEach(result => {\n if (result.status === 'fulfilled') {\n resultFiles.push(...result.value);\n }\n });\n\n opts.finish(resultFiles);\n };\n\n const select = (): void => {\n selectFile({\n accept: opts.accept,\n multiple: opts.multiple,\n onSelected: files => {\n uploadFiles(files);\n },\n });\n };\n\n select();\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * 设置延迟wait毫米后执行fun方法,返回fun的返回值\n *\n * @author lxm\n * @date 2023-03-06 08:20:57\n * @export\n * @template T\n * @param {number} wait\n * @param {T} fun\n * @param {any[]} params\n * @returns {*} {Promise<ReturnType<T>>}\n */\nexport async function awaitTimeout<T extends (...args: any) => any>(\n wait: number,\n fun?: T,\n params?: any[],\n): Promise<ReturnType<T> | undefined> {\n await new Promise(resolve => {\n setTimeout(() => {\n resolve(true);\n }, wait);\n });\n if (fun) {\n return fun(...(params || []));\n }\n}\n","import { RuntimeError } from '../../error';\n\n/**\n * 计数插销工具类\n *\n * @author lxm\n * @date 2022-11-24 19:11:49\n * @export\n * @class CountLatch\n */\nexport class CountLatch {\n private promise: Promise<void> | null = null;\n\n private resolve: ((value: void) => void) | null = null;\n\n /**\n * 计数,当前等待的异步逻辑个数\n *\n * @author lxm\n * @date 2022-11-24 19:11:59\n * @type {number}\n */\n count: number = 0;\n\n /**\n * 开启promise\n *\n * @author lxm\n * @date 2022-11-24 19:11:32\n * @private\n */\n private startPromise(): void {\n this.promise = new Promise(resolve => {\n this.resolve = resolve;\n });\n }\n\n /**\n * 结束promise\n *\n * @author lxm\n * @date 2022-11-24 19:11:44\n * @private\n */\n private endPromise(): void {\n if (this.resolve) {\n this.resolve();\n this.resolve = null;\n this.promise = null;\n }\n }\n\n /**\n * 上锁,计数加一\n * 第一次计数,开启异步\n *\n * @author lxm\n * @date 2022-11-24 19:11:27\n */\n lock(): void {\n this.count += 1;\n if (!this.promise) {\n this.startPromise();\n }\n }\n\n /**\n * 解锁,计数减一\n * 归零时结束异步\n *\n * @author lxm\n * @date 2022-11-24 19:11:47\n */\n unlock(): void {\n if (this.count < 1) {\n throw new RuntimeError('lock和unlock次数不匹配!');\n }\n this.count -= 1;\n if (this.count === 0) {\n this.endPromise();\n }\n }\n\n /**\n * 等待,计数归零异步结束\n *\n * @author lxm\n * @date 2022-11-24 19:11:20\n */\n async await(): Promise<void> {\n if (this.promise) {\n await this.promise;\n }\n }\n}\n","/**\n * 设置远程样式表\n *\n * @author lxm\n * @date 2023-02-09 05:46:49\n * @export\n * @param {string} url\n * @returns {*} {Promise<void>}\n */\nexport async function setRemoteStyle(url: string): Promise<void> {\n try {\n const res = await ibiz.net.get(url);\n const styleDom = document.createElement('style');\n styleDom.setAttribute('title', 'app-style-css');\n styleDom.innerText = res.data as unknown as string;\n document.head.appendChild(styleDom);\n } catch (error) {\n ibiz.log.debug('加载远程样式表失败', url);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { mergeDeepRight } from 'ramda';\n\n/** 默认配置参数 */\nconst IterateOpts = {\n /** 子集合属性数组 */\n childrenFields: ['children'],\n};\n\nconst BreakError = new Error('中断操作');\n\n/**\n * 获取子属性集合\n * @author lxm\n * @date 2023-04-20 08:54:32\n * @param {IData} parent\n * @param {string[]} fields 子集合可能的属性名称\n * @return {*} {(IData[] | undefined)}\n */\nfunction getChildField(parent: IData, fields: string[]): IData[] | undefined {\n for (const field of fields) {\n if (parent[field]?.length) {\n return parent[field];\n }\n }\n}\n\nfunction _recursiveIterate(\n parent: IData,\n callback: (item: any) => boolean | void,\n opts?: Partial<typeof IterateOpts>,\n): void {\n const { childrenFields } = mergeDeepRight(IterateOpts, opts || {});\n const children = getChildField(parent, childrenFields);\n if (children?.length) {\n for (const child of children) {\n // 递归自身的子成员\n const isBreak = callback(child);\n // 如果回调返回true则退出\n if (isBreak) {\n throw BreakError;\n }\n\n // 递归孙的成员\n recursiveIterate(child, callback, opts);\n }\n }\n}\n\n/**\n * 递归遍历子元素\n * @author lxm\n * @date 2023-04-23 09:07:06\n * @export\n * @param {IData} parent 父元素\n * @param {(item: any) => boolean} callback 每一个子元素的回调\n * @param {Partial<typeof IterateOpts>} [opts]\n */\nexport function recursiveIterate(\n parent: IData,\n callback: (item: any) => boolean | void,\n opts?: Partial<typeof IterateOpts>,\n): void {\n try {\n _recursiveIterate(parent, callback, opts);\n } catch (error) {\n if (error !== BreakError) {\n throw error;\n }\n }\n}\n\n/** 默认配置参数 */\nconst CompareOpts = {\n ...IterateOpts,\n /** 比较的属性 */\n compareField: 'name',\n};\n\ntype ICompareOpts = Partial<typeof CompareOpts> & {\n /**\n * 自定义比较回调\n * @author lxm\n * @date 2023-04-23 09:06:42\n */\n compareCallback?: (\n child: IData,\n key: string,\n compareField: string,\n ) => boolean;\n};\n\n/**\n * 递归查找子元素\n * @author lxm\n * @date 2023-04-20 08:53:35\n * @export\n * @param {IData} parent 父对象\n * @param {string} key 子元素的比较属性的值\n * @param {ICompareOpts} [opts]\n * @return {*} {(IData | undefined)}\n */\nexport function findRecursiveChild(\n parent: IData,\n key: string,\n opts?: ICompareOpts,\n): IData | undefined {\n const { compareField, compareCallback } = mergeDeepRight(\n CompareOpts,\n opts || {},\n );\n\n // 默认比较方法\n const _compareCallback =\n compareCallback ||\n ((child: IData): boolean => {\n return child[compareField] === key;\n });\n\n // 递归遍历,找到后中断遍历,返回找到项\n let find;\n recursiveIterate(\n parent,\n item => {\n if (_compareCallback(item, key, compareField)) {\n find = item;\n return true;\n }\n },\n opts,\n );\n return find;\n}\n","/**\n * 数据类型转换识别工具类\n * @author lxm\n * @date 2023-08-25 04:33:49\n * @export\n * @class DataTypes\n */\nexport class DataTypes {\n /**\n * 数字类型映射字符串类型\n * @author lxm\n * @date 2023-08-25 04:49:52\n * @static\n * @type {{ [p: number]: string }}\n */\n static readonly typeMap: { [p: number]: string } = {\n 0: 'UNKNOWN',\n 1: 'BIGINT',\n 2: 'BINARY',\n 3: 'BIT',\n 4: 'CHAR',\n 5: 'DATETIME',\n 6: 'DECIMAL',\n 7: 'FLOAT',\n 8: 'IMAGE',\n 9: 'INT',\n 10: 'MONEY',\n 11: 'NCHAR',\n 12: 'NTEXT',\n 13: 'NVARCHAR',\n 14: 'NUMERIC',\n 15: 'REAL',\n 16: 'SMALLDATETIME',\n 17: 'SMALLINT',\n 18: 'SMALLMONEY',\n 19: 'SQL_VARIANT',\n 20: 'SYSNAME',\n 21: 'TEXT',\n 22: 'TIMESTAMP',\n 23: 'TINYINT',\n 24: 'VARBINARY',\n 25: 'VARCHAR',\n 26: 'UNIQUEIDENTIFIER',\n 27: 'DATE', // 纯日期型\n 28: 'TIME', // 纯时间\n 29: 'BIGDECIMAL', // 大数值\n };\n\n /**\n * 是否是数值类型\n * @author lxm\n * @date 2023-08-25 04:53:30\n * @static\n * @param {number} dataType 数据类型(数值)\n * @return {*} {boolean}\n */\n public static isNumber(dataType: number): boolean {\n const numberTypes = [\n 'BIGINT',\n 'BINARY',\n 'DECIMAL',\n 'FLOAT',\n 'INT',\n 'MONEY',\n 'NUMERIC',\n 'REAL',\n 'SMALLINT',\n 'SMALLMONEY',\n 'TINYINT',\n 'VARBINARY',\n ];\n return numberTypes.includes(this.toString(dataType));\n }\n\n /**\n * 是否是日期类型数据\n *\n * @static\n * @param {number} dataType\n * @return {*}\n * @memberof DataTypes\n */\n public static isDate(dataType: number): boolean {\n const dateTypes = ['DATETIME', 'SMALLDATETIME', 'DATE', 'TIME'];\n return dateTypes.includes(this.toString(dataType));\n }\n\n /**\n * 获取字符串数据类型\n * @author lxm\n * @date 2023-08-25 04:53:58\n * @static\n * @param {number} dataType 数据类型(数值)\n * @return {*} {string}\n */\n public static toString(dataType: number): string {\n return this.typeMap[dataType];\n }\n}\n","import { cloneDeepWith, cloneWith, isFunction, isObject } from 'lodash-es';\nimport { mergeDeepRight } from 'ramda';\n\n/**\n * 自定义克隆逻辑,有clone方法的拿clone方法,否则直接用lodash的clone\n * @author lxm\n * @date 2023-10-25 06:12:23\n * @param {unknown} value\n * @return {*} {unknown}\n */\nfunction customizeFn<T>(value: T): T | undefined {\n if (isObject(value) && isFunction((value as IData).clone)) {\n return (value as IData).clone();\n }\n}\n\nexport type CloneOpts = {\n deep?: boolean;\n};\n\nconst DefaultCloneOpts: CloneOpts = {\n deep: true,\n} as const;\n\n/**\n * 克隆方法(如果对象有clone方法会用clone方法调用clone)\n * @author lxm\n * @date 2023-10-25 06:24:18\n * @export\n * @template T\n * @param {readonly} value\n * @param {*} T\n * @param {*} []\n * @param {CloneOpts} [opts]\n * @return {*} {T[]}\n */\nexport function clone<T>(value: T, opts?: CloneOpts): T {\n const options = mergeDeepRight(DefaultCloneOpts, opts || {})!;\n if (options.deep) {\n return cloneDeepWith(value, customizeFn);\n }\n return cloneWith(value, customizeFn);\n}\n","/* eslint-disable default-param-last */\n/* eslint-disable no-bitwise */\n\nimport { RuntimeError } from '../../error';\n\n/**\n * 检查权限码是否有效\n * @author lxm\n * @date 2023-11-10 10:49:57\n * @static\n * @param {number} permission\n */\nfunction validate(permission: number): boolean {\n return !!permission && !(permission & (permission - 1));\n}\n\n/**\n * 检查权限码是否有效,无效抛错\n * @author lxm\n * @date 2023-11-10 10:56:00\n * @private\n * @static\n * @param {number} permission\n */\nfunction validateAndThrow(permission: number): void {\n const isPowerOf2 = validate(permission);\n if (!isPowerOf2) {\n throw new RuntimeError(`${permission}不是2的幂`);\n }\n}\n\n/**\n * 设置权限\n * @author lxm\n * @date 2023-11-10 10:50:22\n * @static\n * @param {number} [allPermissions=0] 当前所有权限\n * @param {number} permission 要设置的权限\n * @return {*} {number}\n */\nfunction setPermission(allPermissions: number = 0, permission: number): number {\n validateAndThrow(permission);\n return allPermissions | permission;\n}\n\n/**\n * 移出权限\n * @author lxm\n * @date 2023-11-10 10:50:45\n * @static\n * @param {number} [allPermissions=0] 当前所有权限\n * @param {number} permission 要移出的权限\n * @return {*} {number}\n */\nfunction removePermission(\n allPermissions: number = 0,\n permission: number,\n): number {\n validateAndThrow(permission);\n return allPermissions & ~permission;\n}\n\n/**\n * 检查是否有某个权限\n * @author lxm\n * @date 2023-11-10 10:50:46\n * @static\n * @param {number} [allPermissions=0]\n * @param {number} permission\n * @return {*} {number}\n */\nfunction checkPermission(\n allPermissions: number = 0,\n permission: number,\n): boolean {\n validateAndThrow(permission);\n return (allPermissions & permission) !== 0;\n}\n\nexport const BitMask = {\n validate,\n setPermission,\n removePermission,\n checkPermission,\n};\n","import Logger from 'loglevel';\nimport prefix from 'loglevel-plugin-prefix';\n\nconst logger = Logger.noConflict();\n\nprefix.reg(logger);\n\nprefix.apply(logger);\n\nexport { logger };\n","import { Logger } from 'loglevel';\nimport { CommandController } from './command';\nimport { Environment } from './environment/environment';\nimport { OrgData } from './interface';\nimport { MessageCenter, Net } from './utils';\nimport { logger } from './utils/logger/logger';\n\n/**\n * 全局对象\n *\n * @author chitanda\n * @date 2022-07-19 16:07:50\n * @export\n * @class IBizSys\n */\nexport class IBizSys {\n /**\n * 环境变量\n *\n * @author chitanda\n * @date 2022-07-19 18:07:04\n */\n env = Environment;\n\n /**\n * 日志输出工具类\n *\n * @author chitanda\n * @date 2023-07-10 18:07:05\n * @type {Logger}\n */\n log: Logger = logger;\n\n /**\n * 网络请求工具类(发送默认请求)\n *\n * @author chitanda\n * @date 2022-07-19 17:07:56\n * @type {Net}\n */\n net: Net = new Net();\n\n /**\n * 指令集\n *\n * @author chitanda\n * @date 2022-07-20 10:07:33\n * @type {AuthService}\n */\n commands: CommandController = new CommandController();\n\n /**\n * 界面消息中心\n *\n * @author chitanda\n * @date 2023-09-05 17:09:38\n * @type {MessageCenter}\n */\n mc: MessageCenter = new MessageCenter();\n\n /**\n * sass 模式下的中心系统标识\n *\n * @author chitanda\n * @date 2022-07-19 18:07:23\n * @type {string}\n */\n orgData?: OrgData;\n\n /**\n * 应用数据\n *\n * @author chitanda\n * @date 2022-07-20 19:07:22\n * @type {IData}\n */\n appData?: IData;\n}\n","import { IBizSys } from './ibizsys';\n\n/**\n * 初始化全局对象\n *\n * @author chitanda\n * @date 2022-07-19 17:07:37\n * @export\n */\nexport function install(): void {\n if (window.ibiz) {\n throw new Error('ibiz 已经存在, 无需重复安装');\n }\n window.ibiz = new IBizSys();\n}\n"],"names":["getBytes","stream","onChunk","reader","result","getLines","onLine","buffer","position","fieldLength","discardTrailingNewline","arr","concat","bufLength","lineStart","lineEnd","getMessages","onId","onRetry","onMessage","message","newMessage","decoder","line","field","valueOffset","value","retry","a","b","res","__rest","s","p","i","EventStreamContentType","DefaultRetryInterval","LastEventId","fetchEventSource","input","_a","inputSignal","inputHeaders","inputOnOpen","onmessage","onclose","onerror","openWhenHidden","inputFetch","rest","resolve","reject","headers","curRequestController","onVisibilityChange","create","retryInterval","retryTimer","dispose","fetch","onopen","defaultOnOpen","response","id","err","interval","innerErr","contentType","_Node","element","Node","LinkedList","node","next","atTheEnd","newNode","oldLast","oldFirst","didRemove","anchor","exports","once","fn","_this","didCall","toDisposable","debounce","func","wait","immediate","timer","args","callNow","throttle","CommandsRegistry","idOrCommand","handler","opts","commands","removeFn","list","keys","key","command","CommandController","bol","CoreConst","NOOP","HttpStatusMessageConst","LoginMode","MenuPermissionMode","IBizContext","context","parent","self","properties","val","item","newContext","clone","IBizParams","params","updateKeyDefine","target","_receiver","allKeys","Environment","HttpError","ModelError","model","msg","RuntimeError","RuntimeModelError","NoticeError","duration","getToken","getCookie","isOverlap","arr1","arr2","isElementSame","allElements","debounceAndMerge","mergeFunc","oldParams","debounceFunc","newParams","debounceAndAsyncMerge","promises","promise","error","mergeInLeft","l","r","isNotNil","mergeDefaultInLeft","isNil","compareArr","keyField","all","more","less","same","arr1Keys","arr2Keys","toNumberOrNil","num","SvgPattern","isSvg","str","plus","c","d","e","Interceptor","config","instance","CoreInterceptor","systemId","orgData","MessageBase","QXEvent","cb","MessageAll","CommandBase","data","subtype","createUUID","CommandCreate","CommandUpdate","CommandRemove","CommandChange","CommandAsyncAction","MessageCommand","MessageConsole","MessageCenter","callback","defaultNamespace","statePrefix","_bem","namespace","block","blockSuffix","modifier","cls","Namespace","name","state","object","styles","HttpResponse","status","statusText","axios","Net","interceptor","configs","url","merge","option","cfg","requestPromise","options","mergeDeepRight","isNilOrEmpty","notNilEmpty","urlSplit","strParams","qs","StringUtil","_key","UrlHelper","hashIndex","origin","pathname","eventPath","event","path","getParents","memo","parentNode","listenJSEvent","eventName","listener","cleanup","isEventInside","el","defaultWindow","onClickOutside","window","ignore","capture","shouldListen","isOutside","isPaused","pause","proceed","fallback","cleanups","toRGBA","color","rgba","colorBlend","color1","color2","format","c1","c2","hex","calcMimeByFileName","fileName","ext","mime","isImage","downloadFileFromBlob","file","filetype","blob","href","fileListToArr","fileList","files","selectFile","_opts","inputEl","uploadFile","_fileData","_files","_resultFiles","_res","_error","onUploadProgress","round","cloneDeep","uploadRequest","_onProgress","isFunction","executeSingleUpload","resultFiles","uniqueId","uploadFiles","uploadSequence","sequence","awaitTimeout","fun","CountLatch","setRemoteStyle","styleDom","IterateOpts","BreakError","getChildField","fields","_recursiveIterate","childrenFields","children","child","recursiveIterate","CompareOpts","findRecursiveChild","compareField","compareCallback","_compareCallback","find","DataTypes","dataType","customizeFn","isObject","DefaultCloneOpts","cloneDeepWith","cloneWith","validate","permission","validateAndThrow","setPermission","allPermissions","removePermission","checkPermission","BitMask","logger","Logger","prefix","IBizSys","install"],"mappings":"qmCAAO,eAAeA,EAASC,EAAQC,EAAS,CAC5C,MAAMC,EAASF,EAAO,YACtB,IAAIG,EACJ,KAAO,EAAEA,EAAS,MAAMD,EAAO,KAAI,GAAI,MACnCD,EAAQE,EAAO,KAAK,CAE5B,CACO,SAASC,GAASC,EAAQ,CAC7B,IAAIC,EACAC,EACAC,EACAC,EAAyB,GAC7B,OAAO,SAAiBC,EAAK,CACrBJ,IAAW,QACXA,EAASI,EACTH,EAAW,EACXC,EAAc,IAGdF,EAASK,GAAOL,EAAQI,CAAG,EAE/B,MAAME,EAAYN,EAAO,OACzB,IAAIO,EAAY,EAChB,KAAON,EAAWK,GAAW,CACrBH,IACIH,EAAOC,CAAQ,IAAM,KACrBM,EAAY,EAAEN,GAElBE,EAAyB,IAE7B,IAAIK,EAAU,GACd,KAAOP,EAAWK,GAAaE,IAAY,GAAI,EAAEP,EAC7C,OAAQD,EAAOC,CAAQ,EAAC,CACpB,IAAK,IACGC,IAAgB,KAChBA,EAAcD,EAAWM,GAE7B,MACJ,IAAK,IACDJ,EAAyB,GAC7B,IAAK,IACDK,EAAUP,EACV,KACP,CAEL,GAAIO,IAAY,GACZ,MAEJT,EAAOC,EAAO,SAASO,EAAWC,CAAO,EAAGN,CAAW,EACvDK,EAAYN,EACZC,EAAc,EACjB,CACGK,IAAcD,EACdN,EAAS,OAEJO,IAAc,IACnBP,EAASA,EAAO,SAASO,CAAS,EAClCN,GAAYM,EAExB,CACA,CACO,SAASE,GAAYC,EAAMC,EAASC,EAAW,CAClD,IAAIC,EAAUC,KACd,MAAMC,EAAU,IAAI,YACpB,OAAO,SAAgBC,EAAMd,EAAa,CACtC,GAAIc,EAAK,SAAW,EACsCJ,IAAUC,CAAO,EACvEA,EAAUC,GAAU,UAEfZ,EAAc,EAAG,CACtB,MAAMe,EAAQF,EAAQ,OAAOC,EAAK,SAAS,EAAGd,CAAW,CAAC,EACpDgB,EAAchB,GAAec,EAAKd,EAAc,CAAC,IAAM,GAAK,EAAI,GAChEiB,EAAQJ,EAAQ,OAAOC,EAAK,SAASE,CAAW,CAAC,EACvD,OAAQD,EAAK,CACT,IAAK,OACDJ,EAAQ,KAAOA,EAAQ,KACjBA,EAAQ,KAAO;AAAA,EAAOM,EACtBA,EACN,MACJ,IAAK,QACDN,EAAQ,MAAQM,EAChB,MACJ,IAAK,KACDT,EAAKG,EAAQ,GAAKM,CAAK,EACvB,MACJ,IAAK,QACD,MAAMC,EAAQ,SAASD,EAAO,EAAE,EAC3B,MAAMC,CAAK,GACZT,EAAQE,EAAQ,MAAQO,CAAK,EAEjC,KACP,CACJ,CACT,CACA,CACA,SAASf,GAAOgB,EAAGC,EAAG,CAClB,MAAMC,EAAM,IAAI,WAAWF,EAAE,OAASC,EAAE,MAAM,EAC9C,OAAAC,EAAI,IAAIF,CAAC,EACTE,EAAI,IAAID,EAAGD,EAAE,MAAM,EACZE,CACX,CACA,SAAST,IAAa,CAClB,MAAO,CACH,KAAM,GACN,MAAO,GACP,GAAI,GACJ,MAAO,MACf,CACA,CC5GA,IAAIU,GAAkC,SAAUC,EAAG,EAAG,CAClD,IAAI,EAAI,CAAA,EACR,QAASC,KAAKD,EAAO,OAAO,UAAU,eAAe,KAAKA,EAAGC,CAAC,GAAK,EAAE,QAAQA,CAAC,EAAI,IAC9E,EAAEA,CAAC,EAAID,EAAEC,CAAC,GACd,GAAID,GAAK,MAAQ,OAAO,OAAO,uBAA0B,WACrD,QAASE,EAAI,EAAGD,EAAI,OAAO,sBAAsBD,CAAC,EAAGE,EAAID,EAAE,OAAQC,IAC3D,EAAE,QAAQD,EAAEC,CAAC,CAAC,EAAI,GAAK,OAAO,UAAU,qBAAqB,KAAKF,EAAGC,EAAEC,CAAC,CAAC,IACzE,EAAED,EAAEC,CAAC,CAAC,EAAIF,EAAEC,EAAEC,CAAC,CAAC,GAE5B,OAAO,CACX,EAEa,MAAAC,6BAAyB,mBAAoB,EACpDC,GAAuB,IACvBC,GAAc,gBACb,SAASC,GAAiBC,EAAOC,EAAI,CACxC,GAAI,CAAE,OAAQC,EAAa,QAASC,EAAc,OAAQC,EAAa,UAAAC,EAAW,QAAAC,EAAS,QAAAC,EAAS,eAAAC,EAAgB,MAAOC,CAAU,EAAKR,EAAIS,EAAOlB,GAAOS,EAAI,CAAC,SAAU,UAAW,SAAU,YAAa,UAAW,UAAW,iBAAkB,OAAO,CAAC,EAC7P,OAAO,IAAI,QAAQ,CAACU,EAASC,IAAW,CACpC,MAAMC,EAAU,OAAO,OAAO,CAAE,EAAEV,CAAY,EACzCU,EAAQ,SACTA,EAAQ,OAASjB,GAErB,IAAIkB,EACJ,SAASC,GAAqB,CAC1BD,EAAqB,MAAK,EACrB,SAAS,QACVE,GAEP,CACIR,GACD,SAAS,iBAAiB,mBAAoBO,CAAkB,EAEpE,IAAIE,EAAgBpB,GAChBqB,EAAa,EACjB,SAASC,GAAU,CACf,SAAS,oBAAoB,mBAAoBJ,CAAkB,EACnE,OAAO,aAAaG,CAAU,EAC9BJ,EAAqB,MAAK,CAC7B,CACyDZ,GAAY,iBAAiB,QAAS,IAAM,CAClGiB,IACAR,GACZ,CAAS,EACD,MAAMS,GAAQX,GAA4D,OAAO,MAC3EY,GAASjB,GAA+DkB,GAC9E,eAAeN,GAAS,CACpB,IAAIf,EACJa,EAAuB,IAAI,gBAC3B,GAAI,CACA,MAAMS,EAAW,MAAMH,GAAMpB,EAAO,OAAO,OAAO,OAAO,OAAO,CAAE,EAAEU,CAAI,EAAG,CAAE,QAAAG,EAAS,OAAQC,EAAqB,MAAQ,CAAA,CAAC,EAC5H,MAAMO,GAAOE,CAAQ,EACrB,MAAM9D,EAAS8D,EAAS,KAAMzD,GAASW,GAAY+C,GAAM,CACjDA,EACAX,EAAQf,EAAW,EAAI0B,EAGvB,OAAOX,EAAQf,EAAW,CAEjC,EAAEV,GAAS,CACR6B,EAAgB7B,CACpC,EAAmBiB,CAAS,CAAC,CAAC,EACoCC,MAClDa,IACAR,GACH,OACMc,EAAK,CACR,GAAI,CAACX,EAAqB,OAAO,QAC7B,GAAI,CACA,MAAMY,GAAYzB,EAAuDM,IAAQkB,CAAG,KAAO,MAAQxB,IAAO,OAASA,EAAKgB,EACxH,OAAO,aAAaC,CAAU,EAC9BA,EAAa,OAAO,WAAWF,EAAQU,CAAQ,CAClD,OACMC,EAAU,CACbR,IACAP,EAAOe,CAAQ,CAClB,CAER,CACJ,CACDX,GACR,CAAK,CACL,CACA,SAASM,GAAcC,EAAU,CAC7B,MAAMK,EAAcL,EAAS,QAAQ,IAAI,cAAc,EACvD,GAAI,CAA4DK,GAAY,WAAWhC,CAAsB,EACzG,MAAM,IAAI,MAAM,+BAA+BA,CAAsB,aAAagC,CAAW,EAAE,CAEvG,CCpFA,MAAMC,EAAN,MAAMA,EAAQ,CAUZ,YAAYC,EAAY,CACtB,KAAK,QAAUA,EACf,KAAK,KAAOD,GAAK,UACjB,KAAK,KAAOA,GAAK,SACnB,CACF,EAfMA,EAEY,UAAY,IAAIA,EAAU,MAAS,EAFrD,IAAME,EAANF,EAiBO,MAAMG,EAAc,CAApB,aAAA,CACL,KAAQ,OAAkBD,EAAK,UAE/B,KAAQ,MAAiBA,EAAK,UAE9B,KAAQ,MAAgB,CAAA,CAExB,IAAI,MAAe,CACjB,OAAO,KAAK,KACd,CAEA,SAAmB,CACV,OAAA,KAAK,SAAWA,EAAK,SAC9B,CAEA,OAAc,CACZ,IAAIE,EAAO,KAAK,OACT,KAAAA,IAASF,EAAK,WAAW,CACxB,KAAA,CAAE,KAAAG,CAAS,EAAAD,EACjBA,EAAK,KAAOF,EAAK,UACjBE,EAAK,KAAOF,EAAK,UACVE,EAAAC,CACT,CAEA,KAAK,OAASH,EAAK,UACnB,KAAK,MAAQA,EAAK,UAClB,KAAK,MAAQ,CACf,CAEA,QAAQD,EAAwB,CACvB,OAAA,KAAK,QAAQA,EAAS,EAAK,CACpC,CAEA,KAAKA,EAAwB,CACpB,OAAA,KAAK,QAAQA,EAAS,EAAI,CACnC,CAEQ,QAAQA,EAAYK,EAA+B,CACnD,MAAAC,EAAU,IAAIL,EAAKD,CAAO,EAC5B,GAAA,KAAK,SAAWC,EAAK,UACvB,KAAK,OAASK,EACd,KAAK,MAAQA,UACJD,EAAU,CAEnB,MAAME,EAAU,KAAK,MACrB,KAAK,MAAQD,EACbA,EAAQ,KAAOC,EACfA,EAAQ,KAAOD,CAAA,KACV,CAEL,MAAME,EAAW,KAAK,OACtB,KAAK,OAASF,EACdA,EAAQ,KAAOE,EACfA,EAAS,KAAOF,CAClB,CACA,KAAK,OAAS,EAEd,IAAIG,EAAY,GAChB,MAAO,IAAM,CACNA,IACSA,EAAA,GACZ,KAAK,QAAQH,CAAO,EACtB,CAEJ,CAEA,OAAuB,CACjB,GAAA,KAAK,SAAWL,EAAK,UAChB,OAEH,MAAAxC,EAAM,KAAK,OAAO,QACnB,YAAA,QAAQ,KAAK,MAAM,EACjBA,CACT,CAEA,KAAqB,CACf,GAAA,KAAK,QAAUwC,EAAK,UACf,OAEH,MAAAxC,EAAM,KAAK,MAAM,QAClB,YAAA,QAAQ,KAAK,KAAK,EAChBA,CACT,CAEQ,QAAQ0C,EAAqB,CACnC,GAAIA,EAAK,OAASF,EAAK,WAAaE,EAAK,OAASF,EAAK,UAAW,CAEhE,MAAMS,EAASP,EAAK,KACpBO,EAAO,KAAOP,EAAK,KACnBA,EAAK,KAAK,KAAOO,CAAA,MACRP,EAAK,OAASF,EAAK,WAAaE,EAAK,OAASF,EAAK,WAE5D,KAAK,OAASA,EAAK,UACnB,KAAK,MAAQA,EAAK,WACTE,EAAK,OAASF,EAAK,WAEvB,KAAA,MAAQ,KAAK,MAAO,KACpB,KAAA,MAAM,KAAOA,EAAK,WACdE,EAAK,OAASF,EAAK,YAEvB,KAAA,OAAS,KAAK,OAAQ,KACtB,KAAA,OAAO,KAAOA,EAAK,WAI1B,KAAK,OAAS,CAChB,CAEA,EAAE,OAAO,QAAQ,GAAiB,CAChC,IAAIE,EAAO,KAAK,OACT,KAAAA,IAASF,EAAK,WACnB,MAAME,EAAK,QACXA,EAAOA,EAAK,IAEhB,CACF,CAAAQ,EAAA,aAAAT,EAAA,ECjIO,SAASU,GAAwCC,EAAU,CAEhE,MAAMC,EAAQ,KACd,IAAIC,EAAU,GACVhF,EAEJ,OAAO,UAAY,CACjB,OAAIgF,IAIMA,EAAA,GACDhF,EAAA8E,EAAG,MAAMC,EAAO,SAAS,GAE3B/E,CAAA,CAEX,CAEO,SAASiF,GAAaH,EAA6B,CAMjD,MALM,CACX,QAASD,GAAK,IAAM,CACfC,GAAA,CACJ,CAAA,CAGL,CAagB,SAAAI,GACdC,EACAC,EACAC,EAC8B,CAC1B,IAAAC,EAEJ,OAAO,YAA4BC,EAAuB,CAIxD,GAHID,GACF,aAAaA,CAAe,EAE1BD,EAAW,CACb,MAAMG,EAAU,CAACF,EACjBA,EAAQ,WAAW,IAAM,CACfA,EAAA,MACPF,CAAI,EACHI,GACGL,EAAA,MAAM,KAAMI,CAAI,CACvB,MAEAD,EAAQ,WAAW,IAAM,CAClBH,EAAA,MAAM,KAAMI,CAAI,GACpBH,CAAI,CACT,CAEJ,CAYgB,SAAAK,GACdX,EACAM,EAC8B,CAC9B,IAAIE,EAAiB,KACrB,OAAO,YAA4BC,EAAuB,CACnDD,IACHA,EAAQ,WAAW,IAAM,CACpBR,EAAA,MAAM,KAAMS,CAAI,EACXD,EAAA,MACPF,CAAI,EACT,CAEJ,CC3EO,MAAMM,EAA6C,CAAnD,aAAA,CAQY,KAAA,aAAe,GAAkC,CAWlE,gBACEC,EACAC,EACAC,EACa,CACb,GAAI,CAACF,EACG,MAAA,IAAI,MAAM,iBAAiB,EAG/B,GAAA,OAAOA,GAAgB,SAAU,CACnC,GAAI,CAACC,EACG,MAAA,IAAI,MAAM,iBAAiB,EAEnC,OAAO,KAAK,gBAAgB,CAAE,GAAID,EAAa,QAAAC,EAAS,KAAAC,EAAM,CAChE,CAEM,KAAA,CAAE,GAAAlC,CAAO,EAAAgC,EAEf,IAAIG,EAAW,KAAK,SAAS,IAAInC,CAAE,EAC9BmC,IACHA,EAAW,IAAI3B,GACV,KAAA,SAAS,IAAIR,EAAImC,CAAQ,GAG1B,MAAAC,EAAWD,EAAS,QAAQH,CAAW,EAUtC,OARKV,GAAa,IAAM,CACpBc,IACO,KAAK,SAAS,IAAIpC,CAAE,GACvB,WACN,KAAA,SAAS,OAAOA,CAAE,CACzB,CACD,CAGH,CAUA,WAAWA,EAAqB,CACvB,OAAA,KAAK,SAAS,IAAIA,CAAE,CAC7B,CAUA,WAAWA,EAAkC,CAC3C,MAAMqC,EAAO,KAAK,SAAS,IAAIrC,CAAE,EACjC,GAAI,GAACqC,GAAQA,EAAK,WAGlB,OAAOA,EAAK,OAAO,QAAQ,EAAE,EAAE,KAAO,EAAA,KACxC,CASA,aAA4B,CACpB,MAAAhG,MAAa,IACbiG,EAAO,KAAK,SAAS,KAAK,EAChC,UAAWC,KAAOD,EAAM,CAChB,MAAAE,EAAU,KAAK,WAAWD,CAAG,EAC/BC,GACKnG,EAAA,IAAIkG,EAAKC,CAAO,CAE3B,CACO,OAAAnG,CACT,CAUA,cAAc2D,EAAwC,CAEpD,OADY,KAAK,WAAWA,CAAE,GAClB,IACd,CACF,CAAAiB,EAAA,mBAAAc,EAAA,EC3HO,MAAMU,CAAkB,CAAxB,aAAA,CACG,KAAA,gBAAkB,IAAIV,EAAiB,CAY/C,SACE/B,EACAiC,EACAC,EACa,CACb,OAAO,KAAK,gBAAgB,gBAAgBlC,EAAIiC,EAASC,CAAI,CAC/D,CAYA,MAAM,QAAuBlC,KAAe4B,EAA6B,CACvE,MAAMY,EAAU,KAAK,gBAAgB,WAAWxC,CAAE,EAClD,GAAIwC,EACK,OAAAA,EAAQ,QAAQ,GAAGZ,CAAI,EAEhC,MAAM,IAAI,MAAM,mCAAU5B,CAAE,4CAAS,CACvC,CAWA,WAAWA,EAAYC,EAAwB,CAC7C,MAAMyC,EAAM,CAAC,CAAC,KAAK,gBAAgB,WAAW1C,CAAE,EAC5C,GAAAC,IAAQ,IAAQyC,IAAQ,GAC1B,MAAM,IAAI,MAAM,mCAAU1C,CAAE,4CAAS,EAEhC,OAAA0C,CACT,CAUA,eAAe1C,EAAwC,CAC9C,OAAA,KAAK,gBAAgB,cAAcA,CAAE,CAC9C,CACF,CAAAiB,EAAA,oBAAAwB,CAAA,ECpEa,MAAAN,GAAWlB,EAAA,WAAA,IAAIwB,CAAkB,ECFvC,MAAME,CAAU,CAwBvB,CAAA1B,EAAA,YAAA0B,CAAA,EAxBaA,EAIK,0BAA4B,UAJjCA,EAaK,MAAQ,eAbbA,EAuBK,cAAgB,uBC3BrB,MAAAC,YAAO,IAAY,CAAC,CAAA,ECDpBC,GAAiD5B,EAAA,yBAAA,CAC5D,IAAK,iFACL,IAAK,+DACL,IAAK,qHACL,IAAK,6CACL,IAAK,qKACL,IAAK,2HACL,IAAK,yGACL,IAAK,+JACL,IAAK,yDACL,IAAK,qHACL,IAAK,+GACL,IAAK,6FACL,IAAK,iCACL,IAAK,yGACL,IAAK,gCACP,CAAA,ECVY,IAAA6B,GAAL7B,EAAA,aAAK6B,IAIVA,EAAA,QAAU,UAIVA,EAAA,OAAS,SAITA,EAAA,IAAM,MAZIA,IAAAA,IAAA,CAAA,CAAA,CAAA,ECAAC,GAAL9B,EAAA,sBAAK8B,IAIVA,EAAA,MAAQ,QAIRA,EAAA,SAAW,WAIXA,EAAA,GAAK,KAZKA,IAAAA,IAAA,CAAA,CAAA,CAAA,ECCL,MAAMC,CAAgC,CA0CnC,YAAYC,EAAiB,CAAC,EAAGC,EAAmB,CACnD,OAAA,eAAe,KAAM,sBAAuB,CACjD,WAAY,GACZ,MAAO,CAAC,CAAA,CACT,EAEGA,GACF,KAAK,eAAeA,CAAM,EAIrB,OAAA,OAAO,KAAMD,CAAO,CAC7B,CAEQ,eAAeC,EAAwB,CAE7C,MAAMC,EAAO,KAGN,OAAA,eAAe,KAAM,UAAW,CACrC,WAAY,GACZ,SAAU,GACV,MAAOD,CAAA,CACR,EAGM,OAAA,eAAe,KAAM,WAAY,CACtC,WAAY,GACZ,SAAU,GACV,MAAO,CAAC,CAAA,CACT,EAED,MAAME,EAAoD,CAAA,EAC7C,OAAO,KAAKF,CAAM,EAC1B,QAAeX,GAAA,CACd,OAAO,UAAU,eAAe,KAAK,KAAMA,CAAG,IAIlDa,EAAWb,CAAG,EAAI,CAChB,WAAY,GACZ,IAAIc,EAAoB,CAClBA,GAAO,KACJF,EAAA,SAASZ,CAAG,EAAI,KAEhBY,EAAA,SAASZ,CAAG,EAAIc,CAEzB,EACA,KAAgB,CACd,OAAIF,EAAK,SAASZ,CAAG,IAAM,OAClBY,EAAK,SAASZ,CAAG,EAEnBY,EAAK,QAASZ,CAAG,CAC1B,CAAA,EACF,CACD,EACM,OAAA,iBAAiB,KAAMa,CAAU,CAC1C,CASA,eAAuB,CACrB,MAAM/G,EAAgB,CAAA,EACtB,cAAO,KAAK,IAAI,EAAE,QAAekG,GAAA,EAI7B,CAAC,KAAK,SACN,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,QAASA,CAAG,GACvD,OAAO,UAAU,eAAe,KAAK,KAAK,SAAUA,CAAG,KAEhDlG,EAAAkG,CAAG,EAAI,KAAKA,CAAG,EACxB,CACD,EACMlG,CACT,CAQA,SAAgB,CACd,KAAK,QAAU,OACf,KAAK,SAAW,GACX,KAAA,oBAAoB,QAAgBiH,GAAA,CACvCA,EAAK,QAAQ,CAAA,CACd,CACH,CASA,OAAqB,CACnB,MAAMC,EAAa,IAAIP,EACrBQ,GAAM,KAAK,eAAe,EAC1B,KAAK,OAAA,EAEF,YAAA,oBAAoB,KAAKD,CAAU,EACjCA,CACT,CAWA,MAAMN,EAAiB,CAAC,EAAGC,EAAyB,CAE7C,KAAA,oBAAoB,QAAgBI,GAAA,CACvCA,EAAK,QAAQ,CAAA,CACd,EAEG,KAAK,UAEP,KAAK,QAAU,GACf,KAAK,SAAW,IAGlB,OAAO,KAAK,IAAI,EAAE,QAAef,GAAA,CAC3B,GAAA,CACF,OAAO,KAAKA,CAAG,OACD,CAEhB,CAAA,CACD,EACGW,GACF,KAAK,eAAeA,CAAM,EAGrB,OAAA,OAAO,KAAMD,CAAO,CAC7B,CAYA,OAAO,OAAOA,EAAiBC,EAAgC,CACtD,OAAA,IAAIF,EAAYC,EAASC,CAAM,CACxC,CACF,CAAAjC,EAAA,cAAA+B,CAAA,EC3MO,MAAMS,EAA8B,CAsBzC,YAAYC,EAAkBR,EAAkB,CAEvC,cAAA,eAAe,KAAM,UAAW,CACrC,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAOA,CAAA,CACR,EAGM,OAAA,eAAe,KAAM,UAAW,CACrC,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAOQ,GAAU,CAAC,CAAA,CACnB,EAEM,KAAK,aACd,CAUU,aAA0B,CAEzB,SAAAC,EAAgBC,EAAiBtB,EAAsB,CAC9DA,EAAK,QAAeC,GAAA,CACb,OAAO,UAAU,eAAe,KAAKqB,EAAQrB,CAAG,GAC5C,OAAA,eAAeqB,EAAQrB,EAAK,CACjC,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAO,MAAA,CACR,CACH,CACD,CACH,CAEO,OAAA,IAAI,MAAM,KAAM,CACrB,IAAIqB,EAAoB1F,EAAWP,EAAyB,CAC1D,MAAI,CAAC,UAAW,SAAS,EAAE,SAASO,CAAC,EACnC0F,EAAO1F,CAAC,EAAIP,EAELiG,EAAA,QAAQ1F,CAAC,EAAIP,EAEf,EACT,EAEA,IAAIiG,EAAoB1F,EAAoB2F,EAA6B,CACnE,GAAAD,EAAO1F,CAAC,IAAM,OAChB,OAAO0F,EAAO1F,CAAC,EAEjB,GAAI0F,EAAO,QAAQ1F,CAAC,IAAM,OACjB,OAAA0F,EAAO,QAAQ1F,CAAC,EAEzB,GAAI0F,EAAO,SAAWA,EAAO,QAAQ1F,CAAC,IAAM,OACnC,OAAA0F,EAAO,QAAQ1F,CAAC,CAE3B,EAEA,QAAQ0F,EAAgD,CAEtD,MAAME,EAAU,CACd,OAAO,IAAI,CACT,GAAG,OAAO,KAAKF,EAAO,OAAO,EAC7B,GAAG,OAAO,KAAKA,EAAO,SAAW,CAAA,CAAE,CAAA,CACpC,CAAA,EAEH,OAAAD,EAAgBC,EAAQE,CAAO,EACxBA,CACT,CAAA,CACD,CACH,CAUA,MAAMJ,EAAkBR,EAAwB,CACzC,KAAA,QAAUQ,GAAU,GACzB,KAAK,QAAUR,CACjB,CAQA,SAAgB,CACd,KAAK,QAAU,GACf,KAAK,QAAU,MACjB,CACF,CAAAjC,EAAA,aAAAwC,EAAA,EC/HO,MAAMM,GAA4B9C,EAAA,cAAA,CACvC,IAAK,GACL,IAAK,GACL,WAAY,GACZ,QAAS,oBACT,iBAAkB,GAClB,SAAU,QACV,QAAS,OACT,MAAO,GACP,cAAe,YACf,aAAc,GACd,eAAgB,eAChB,UAAW,WACX,SAAU,GACV,gBAAiB,qBACjB,cAAe,mBACf,YAAa,GACb,UAAW6B,GAAU,QACrB,mBAAoBC,GAAmB,MACvC,iBAAkB,GAClB,iBAAkB,IAClB,mBAAoB,GACpB,MAAO,GACP,WAAY,GACZ,SAAU,eACV,QAAS,eACX,CAAA,ECrBO,MAAMiB,UAAkB,KAAM,CASnC,YAAY/D,EAAiB,CAC3B,MAAM,WAAW,EATJ,KAAA,KAAA,YAUb,MAAMlC,EAAMkC,EAAI,SAChB,KAAK,SAAWA,EAAI,SAChBlC,GACEA,EAAI,KACD,KAAA,QAAWA,EAAI,KAAe,QAEnC,KAAK,QAAUA,EAAI,WAEhB,KAAK,UACR,KAAK,QAAU,iEAEjB,KAAK,OAASA,EAAI,SAElB,KAAK,QAAUkC,EAAI,QACnB,KAAK,OAAS,IAElB,CACF,CAAAgB,EAAA,YAAA+C,CAAA,EC/BO,MAAMC,WAAmB,KAAM,CAWpC,YACSC,EACPC,EACA,CACM,MAAA,SAAID,EAAM,EAAE,qBAAMC,EAAM,UAAKA,CAAG,GAAK,EAAE,EAAE,EAHxC,KAAA,MAAAD,EAXM,KAAA,KAAA,sCAef,CACF,CAAAjD,EAAA,aAAAgD,EAAA,EChBO,MAAMG,UAAqB,KAAM,CAGtC,YAAmB/G,EAAiB,CAClC,MAAMA,CAAO,EADI,KAAA,QAAAA,EAFJ,KAAA,KAAA,eAIf,CACF,CAAA4D,EAAA,eAAAmD,CAAA,ECNO,MAAMC,WAA0B,KAAM,CAW3C,YACSH,EACPC,EACA,CACM,MAAA,SAAID,EAAM,EAAE,qBAAMC,EAAM,UAAKA,CAAG,GAAK,EAAE,EAAE,EAHxC,KAAA,MAAAD,EAXM,KAAA,KAAA,sCAef,CACF,CAAAjD,EAAA,oBAAAoD,EAAA,ECjBO,MAAMC,WAAoB,KAAM,CAGrC,YACSjH,EACAkH,EACP,CACA,MAAMlH,CAAO,EAHN,KAAA,QAAAA,EACA,KAAA,SAAAkH,EAJM,KAAA,KAAA,cAOf,CACF,CAAAtD,EAAA,cAAAqD,EAAA,ECJO,SAASE,GAA0B,CACjC,OAAAC,GAAU9B,EAAU,KAAK,CAClC,CAYgB,SAAA+B,GAAUC,EAAaC,EAAsB,CAE3D,OADe,MAAM,KAAS,IAAA,IAAI,CAAC,GAAGD,EAAM,GAAGC,CAAI,CAAC,CAAC,EACvC,SAAWD,EAAK,OAASC,EAAK,MAC9C,CAYgB,SAAAC,GACdF,EACAC,EACAnH,EACS,CACL,GAAAkH,EAAK,SAAWC,EAAK,OAChB,MAAA,GAEH,MAAAE,EAAcrH,EAChB,CAAC,GAAGkH,EAAK,IAAYrB,GAAAA,EAAK7F,CAAK,CAAC,EAAG,GAAGmH,EAAK,IAAItB,GAAQA,EAAK7F,CAAK,CAAC,CAAC,EACnE,CAAC,GAAGkH,EAAM,GAAGC,CAAI,EAGd,OADQ,MAAM,KAAK,IAAI,IAAIE,CAAW,CAAC,EAChC,SAAWH,EAAK,MAChC,CAkBgB,SAAAI,GACdvD,EACAwD,EAIAvD,EACiC,CAE7B,IAAAwD,EACE,MAAAC,EAAe3D,EAAS,IAAImC,KAEpBuB,EAAA,OACLzD,EAAK,GAAGkC,CAAM,GACpBjC,CAAI,EACP,MAAO,IAAIG,IAAwB,CAEjC,IAAIuD,EAAYvD,EAChB,OAAIqD,IACUE,EAAAH,EAAUC,EAAWE,CAAS,GAEhCF,EAAAE,EACLD,EAAa,GAAGC,CAAS,CAAA,CAEpC,CAkBgB,SAAAC,GAGd5D,EACAwD,EAIAvD,EACG,CAEC,IAAAwD,EACAI,EAAiD,CAAA,EAC/C,MAAAH,EAAe3D,EAAS,SAAUmC,IAA0B,CAEpDuB,EAAA,OACR,GAAA,CACF,MAAM5I,EAAS,MAAMmF,EAAK,GAAGkC,CAAM,EACnC,OAAA2B,EAAS,QAAmBC,GAAA,CAC1BA,EAAQ,QAAQjJ,CAAM,CAAA,CACvB,EACDgJ,EAAW,CAAA,EACJhJ,QACAkJ,EAAO,CACdF,EAAS,QAAmBC,GAAA,CAC1BA,EAAQ,OAAOC,CAAK,CAAA,CACrB,EACDF,EAAW,CAAA,CACb,GACC5D,CAAI,EAeA,MAdK,UAAUG,IAA0C,CAE9D,IAAIuD,EAAYvD,EAChB,OAAIqD,IACUE,EAAAH,EAAUC,EAAWE,CAAS,GAEhCF,EAAAE,EAEZD,EAAa,GAAGC,CAAS,EAClB,IAAI,QAAQ,CAAChG,EAASC,IAAW,CAEtCiG,EAAS,KAAK,CAAE,QAAAlG,EAAS,OAAAC,CAAQ,CAAA,CAAA,CAClC,CAAA,CAGL,CASgB,SAAAoG,GAAYC,EAAUC,EAAgB,CACpD,OAAO,KAAKA,CAAC,EAAE,QAAenD,GAAA,CACxBoD,EAASD,EAAEnD,CAAG,CAAC,IACfkD,EAAAlD,CAAG,EAAImD,EAAEnD,CAAG,EAChB,CACD,CACH,CAWgB,SAAAqD,GAAmBH,EAAUC,EAAgB,CAC3D,OAAO,KAAKA,CAAC,EAAE,QAAenD,GAAA,CACxBoD,EAASD,EAAEnD,CAAG,CAAC,GAAKsD,EAAMJ,EAAElD,CAAG,CAAC,IAChCkD,EAAAlD,CAAG,EAAImD,EAAEnD,CAAG,EAChB,CACD,CACH,CAgBgB,SAAAuD,GACdnB,EACAC,EACAmB,EAKA,CACM,MAAAC,MAAU,IAAI,CAAC,GAAGrB,EAAM,GAAGC,CAAI,CAAC,EAChCqB,EAAgB,CAAA,EAChBC,EAAgB,CAAA,EAChBC,EAAgB,CAAA,EAEtB,GAAIJ,EAAU,CACZ,MAAMK,EAAWzB,EAAK,IAAYrB,GAAAA,EAAKyC,CAAQ,CAAC,EAC1CM,EAAWzB,EAAK,IAAYtB,GAAAA,EAAKyC,CAAQ,CAAC,EAChDC,EAAI,QAAgB1C,GAAA,CAClB,GAAI,CAAC8C,EAAS,SAAS9C,EAAKyC,CAAQ,CAAC,EAAG,CACtCG,EAAK,KAAK5C,CAAI,EACd,MACF,CACA,GAAI,CAAC+C,EAAS,SAAS/C,EAAKyC,CAAQ,CAAC,EAAG,CACtCE,EAAK,KAAK3C,CAAI,EACd,MACF,CACA6C,EAAK,KAAK7C,CAAI,CAAA,CACf,CAAA,MAED0C,EAAI,QAAgB1C,GAAA,CAClB,GAAI,CAACqB,EAAK,SAASrB,CAAI,EAAG,CACxB4C,EAAK,KAAK5C,CAAI,EACd,MACF,CACA,GAAI,CAACsB,EAAK,SAAStB,CAAI,EAAG,CACxB2C,EAAK,KAAK3C,CAAI,EACd,MACF,CACA6C,EAAK,KAAK7C,CAAI,CAAA,CACf,EAGI,MAAA,CACL,KAAA2C,EACA,KAAAC,EACA,KAAAC,CAAA,CAEJ,CAWO,SAASG,GAAc3I,EAAoC,CAC5D,GAAAkI,EAAMlI,CAAK,EACN,OAEH,MAAA4I,EAAM,OAAO5I,CAAK,EACpB,GAAA,QAAO,MAAM4I,CAAG,EAGb,OAAAA,CACT,CAEA,MAAMC,GAAa,8BAUZ,SAASC,GAAMC,EAAsB,CACnC,OAAAF,GAAW,KAAKE,CAAG,CAC5B,CAUgB,SAAAC,GAAK9I,EAAWC,EAAmB,CAC7C,IAAA8I,EACAC,EACA,GAAA,CACFD,EAAI/I,EAAE,WAAW,MAAM,GAAG,EAAE,CAAC,EAAE,YACrB,CACN+I,EAAA,CACN,CACI,GAAA,CACFC,EAAI/I,EAAE,WAAW,MAAM,GAAG,EAAE,CAAC,EAAE,YACrB,CACN+I,EAAA,CACN,CACA,MAAMC,EAAI,IAAM,KAAK,IAAIF,EAAGC,CAAC,EACrB,OAAAhJ,EAAIiJ,EAAIhJ,EAAIgJ,GAAKA,CAC3B,CC7SO,MAAMC,EAAY,CA8BvB,MAAgB,gBACdC,EACqC,CAC9B,OAAAA,CACT,CAUU,eAAezB,EAA8B,CAE9C,OAAA,QAAQ,OAAOA,CAAK,CAC7B,CAWA,MAAgB,kBACdyB,EACwB,CACjB,OAAAA,CACT,CAUU,gBAAgBzB,EAA8B,CAE/C,OAAA,QAAQ,OAAOA,CAAK,CAC7B,CASA,IAAI0B,EAA+B,CAC5B,KAAA,WAAaA,EAAS,aAAa,QAAQ,IAC9C,KAAK,gBACL,KAAK,cAAA,EAEF,KAAA,YAAcA,EAAS,aAAa,SAAS,IAChD,KAAK,kBACL,KAAK,eAAA,CAET,CASA,MAAMA,EAA+B,CAC/B,KAAK,YACPA,EAAS,aAAa,QAAQ,MAAM,KAAK,UAAU,EAEjD,KAAK,aACPA,EAAS,aAAa,SAAS,MAAM,KAAK,WAAW,CAEzD,CACF,CAAAhG,EAAA,cAAA8F,EAAA,EChHO,MAAMG,WAAwBH,EAAY,CAC/C,MAAgB,gBACdC,EACqC,CAC5BA,EAAA,MAAM,MAAM,gBAAgBA,CAAM,EAErC,KAAA,CAAE,QAAA3H,CAAY,EAAA2H,EAGpB3H,EAAQ,IAAI,gBAAiB,UAAUmF,EAAA,CAAU,EAAE,EAG/C,IAAA2C,EAAW,KAAK,IAAI,SAClB,KAAA,CAAE,QAAAC,CAAY,EAAA,KACpB,OAAIA,IACEA,EAAQ,WACVD,EAAWC,EAAQ,UAEjBA,EAAQ,OACF/H,EAAA,IAAI,WAAY+H,EAAQ,KAAK,GAGjC/H,EAAA,IAAI,cAAe8H,CAAQ,EAE5BH,CACT,CACF,CAAA/F,EAAA,kBAAAiG,EAAA,ECjBO,MAAeG,CAAY,CAWhC,YAAsBnE,EAAsB,CAAtB,KAAA,OAAAA,EAFZ,KAAA,IAAmC,IAAIoE,GAAQ,GAAI,CAEhB,CAS7C,KAAKnD,EAA2B,CACzB,KAAA,IAAI,KAAK,MAAOA,CAAG,EACpB,KAAK,QACP,KAAK,WAAWA,CAAG,CAEvB,CAUU,WAAWA,EAA2B,CAC1C,KAAK,SACP,KAAK,OAAO,IAAI,KAAK,MAAOA,CAAG,EAC1B,KAAA,OAAO,WAAWA,CAAG,EAE9B,CASA,GAAGoD,EAAyC,CACrC,KAAA,IAAI,GAAG,MAAOA,CAAE,CACvB,CASA,IAAIA,EAAyC,CACtC,KAAA,IAAI,IAAI,MAAOA,CAAE,CACxB,CACF,CC1EO,MAAMC,WAAmBH,CAAY,CAAC,CCEtC,MAAMI,UAAoBJ,CAAY,CAMjC,YAAYK,EAAaC,EAA0C,CAC3E,MAAMxD,EAAsB,CAC1B,UAAWyD,EAAW,EACtB,YAAa,UACb,KAAM,UACN,QAAAD,EACA,KAAAD,CAAA,EAEF,KAAK,KAAKvD,CAAG,CACf,CACF,CCjBO,MAAM0D,WAAsBJ,CAAY,CAQ7C,KAAKC,EAA4B,CAC1B,KAAA,YAAYA,EAAM,eAAe,CACxC,CACF,CCXO,MAAMI,WAAsBL,CAAY,CAQ7C,KAAKC,EAA4B,CAC1B,KAAA,YAAYA,EAAM,eAAe,CACxC,CACF,CCXO,MAAMK,WAAsBN,CAAY,CAQ7C,KAAKC,EAA4B,CAC1B,KAAA,YAAYA,EAAM,eAAe,CACxC,CACF,CCZO,MAAMM,WAAsBP,CAAY,CAAC,CCCzC,MAAMQ,WAA2BR,CAAY,CAQlD,KAAKC,EAAgC,CAC9B,KAAA,YAAYA,EAAM,aAAa,CACtC,CACF,CCLO,MAAMQ,WAAuBb,CAAY,CAAzC,aAAA,CAAA,MAAA,GAAA,SAAA,EAQI,KAAA,OAAwB,IAAIW,GAS5B,KAAA,OAAwB,IAAIH,GAAc,IAAI,EAS9C,KAAA,OAAwB,IAAIC,GAAc,IAAI,EAS9C,KAAA,OAAwB,IAAIC,GAAc,IAAI,EAS9C,KAAA,YAAkC,IAAIE,GAAmB,IAAI,CAAA,CAStE,KAAK9D,EAA2B,CAI9B,OAAQA,EAAI,QAAS,CACnB,IAAK,gBACE,KAAA,OAAO,KAAKA,CAAG,EACf,KAAA,OAAO,KAAKA,CAAG,EACpB,MACF,IAAK,gBACE,KAAA,OAAO,KAAKA,CAAG,EACf,KAAA,OAAO,KAAKA,CAAG,EACpB,MACF,IAAK,gBACE,KAAA,OAAO,KAAKA,CAAG,EACf,KAAA,OAAO,KAAKA,CAAG,EACpB,MACF,QACE,MAAM,KAAKA,CAAG,CAClB,CACF,CAEU,WAAWA,EAA2B,CAC9C,OAAQA,EAAI,QAAS,CACnB,IAAK,gBACE,KAAA,OAAO,KAAKA,CAAG,EACpB,MACF,IAAK,gBACE,KAAA,OAAO,KAAKA,CAAG,EACpB,MACF,IAAK,gBACE,KAAA,OAAO,KAAKA,CAAG,EACpB,KAEJ,CACA,MAAM,WAAWA,CAAG,CACtB,CAUA,KAAKuD,EAAaC,EAA0C,CAC1D,MAAMxD,EAAsB,CAC1B,UAAWyD,EAAW,EACtB,YAAa,UACb,KAAM,UACN,QAAAD,EACA,KAAAD,CAAA,EAEF,KAAK,KAAKvD,CAAG,CACf,CACF,CClHO,MAAMgE,WAAuBd,CAAY,CAQ9C,KAAKK,EAA4B,CAC/B,MAAMvD,EAAsB,CAC1B,UAAWyD,EAAW,EACtB,YAAa,UACb,KAAM,UACN,KAAAF,CAAA,EAEF,KAAK,KAAKvD,CAAG,CACf,CACF,CCjBO,MAAMiE,EAAc,CAApB,aAAA,CAQK,KAAA,IAAkB,IAAIZ,GAShC,KAAS,QAA0B,IAAIU,GAAe,KAAK,GAAG,EAS9D,KAAS,QAA0B,IAAIC,GAAe,KAAK,GAAG,CAAA,CAS9D,KAAKhE,EAA2B,CAG1BA,EAAI,OAAS,UACV,KAAA,QAAQ,KAAKA,CAAG,EACZA,EAAI,OAAS,UACjB,KAAA,QAAQ,KAAKA,CAAG,EAEhB,KAAA,IAAI,KAAKA,CAAG,CAErB,CASA,GAAGkE,EAA+C,CAC3C,KAAA,IAAI,GAAGA,CAAQ,CACtB,CASA,IAAIA,EAA+C,CAC5C,KAAA,IAAI,IAAIA,CAAQ,CACvB,CACF,CAAApH,EAAA,gBAAAmH,EAAA,ECjFO,MAAME,GAAmB,OAC1BC,GAAc,MAmBpB,SAASC,EACPC,EACAC,EACAC,EACArI,EACAsI,EACQ,CACR,IAAIC,EAAM,GAAGJ,CAAS,IAAIC,CAAK,GAC/B,OAAIC,IACFE,GAAO,IAAIF,CAAW,IAEpBrI,IACFuI,GAAO,KAAKvI,CAAO,IAEjBsI,IACFC,GAAO,KAAKD,CAAQ,IAEfC,CACT,CAUO,MAAMC,EAAU,CAkBrB,YACYJ,EACVD,EACA,CAFU,KAAA,MAAAC,EAGV,KAAK,UAAYD,GAAaH,EAChC,CAWA,EAAEK,EAAsB,GAAY,CAClC,OAAOH,EAAK,KAAK,UAAW,KAAK,MAAOG,EAAa,GAAI,EAAE,CAC7D,CAUA,EAAErI,EAA0B,CACnB,OAAAA,EAAUkI,EAAK,KAAK,UAAW,KAAK,MAAO,GAAIlI,EAAS,EAAE,EAAI,EACvE,CAUA,EAAEsI,EAA2B,CACpB,OAAAA,EAAWJ,EAAK,KAAK,UAAW,KAAK,MAAO,GAAI,GAAII,CAAQ,EAAI,EACzE,CAWA,GAAGD,EAAsBrI,EAA0B,CAC1C,OAAAqI,GAAerI,EAClBkI,EAAK,KAAK,UAAW,KAAK,MAAOG,EAAarI,EAAS,EAAE,EACzD,EACN,CAWA,GAAGA,EAAkBsI,EAA2B,CACvC,OAAAtI,GAAWsI,EACdJ,EAAK,KAAK,UAAW,KAAK,MAAO,GAAIlI,EAASsI,CAAQ,EACtD,EACN,CAWA,GAAGD,EAAsBC,EAA2B,CAC3C,OAAAD,GAAeC,EAClBJ,EAAK,KAAK,UAAW,KAAK,MAAOG,EAAa,GAAIC,CAAQ,EAC1D,EACN,CAYA,IAAID,EAAsBrI,EAAkBsI,EAA2B,CAC9D,OAAAD,GAAerI,GAAWsI,EAC7BJ,EAAK,KAAK,UAAW,KAAK,MAAOG,EAAarI,EAASsI,CAAQ,EAC/D,EACN,CAcA,GAAGG,EAAcC,EAAyB,CACxC,OAAOD,GAAQC,EAAQ,GAAGT,EAAW,GAAGQ,CAAI,GAAK,EACnD,CAUA,OAAOE,EAAwD,CAC7D,MAAMC,EAAiC,CAAA,EACvC,UAAW3G,KAAO0G,EACZA,EAAO1G,CAAG,IACZ2G,EAAO,KAAK,WAAW3G,CAAG,CAAC,EAAI0G,EAAO1G,CAAG,GAGtC,OAAA2G,CACT,CAUA,YAAYD,EAAwD,CAClE,MAAMC,EAAiC,CAAA,EACvC,UAAW3G,KAAO0G,EACZA,EAAO1G,CAAG,IACZ2G,EAAO,KAAK,gBAAgB3G,CAAG,CAAC,EAAI0G,EAAO1G,CAAG,GAG3C,OAAA2G,CACT,CAUA,WAAWH,EAAsB,CAC/B,MAAO,KAAK,KAAK,SAAS,IAAIA,CAAI,EACpC,CAUA,gBAAgBA,EAAsB,CACpC,MAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAIA,CAAI,EAClD,CACF,CAAA9H,EAAA,YAAA6H,EAAA,ECrLO,MAAMK,EAAoD,CAgC/D,YAAYzB,EAAgB0B,EAAiBC,EAAqB,CAzB1D,KAAA,MAAA,GAEH,KAAA,GAAA,GAQL,KAAA,QAA0D,GAEd,KAAA,OAAA,CAC1C,QAAS,IAAIC,EAAM,YAAa,EAahC,KAAK,KAAO5B,EACZ,KAAK,OAAS0B,GAAU,IACxB,KAAK,WAAaC,GAAc,GAC5B,KAAK,QAAU,KAAO,KAAK,OAAS,MACtC,KAAK,GAAK,GAEd,CACF,CAAApI,EAAA,eAAAkI,EAAA,EC3EO,MAAMI,EAAI,CA2Cf,YAAYvC,EAA8B,CAzB1C,KAAU,OAAS,uBAWT,KAAA,gBAAkB,IA0B5B,KAAA,iBAA6C,IAXtC,KAAA,SAAWsC,EAAM,OAAOtC,CAAM,EACnC,KAAK,eAAe,UAAW,IAAIE,EAAiB,CACtD,CAfA,IAAc,SAAkB,CAE5B,OAAA,KAAK,SAAS,SAAS,SAAW,GAAG,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,EAE3E,CA8BA,eAAe6B,EAAcS,EAAgC,CAC/CA,EAAA,IAAI,KAAK,QAAQ,EACxB,KAAA,aAAa,IAAIT,EAAMS,CAAW,CACzC,CASA,kBAAkBT,EAAoB,CACpC,MAAMS,EAAc,KAAK,aAAa,IAAIT,CAAI,EAC1CS,IACUA,EAAA,MAAM,KAAK,QAAQ,EAC1B,KAAA,aAAa,OAAOT,CAAI,EAEjC,CAWA,IAAc,cAAmC,CACxC,MAAA,CAEL,QAAS,KAAK,QACd,QAAS,CACP,eAAgB,iCAChB,OAAQ,kBACV,CAAA,CAEJ,CAWU,eAAeU,EAAmD,CAC1E,MAAMzC,EAAS,KAAK,aAChB,GAAAyC,EAAQ,SAAW,EACd,OAAAzC,EAET,KAAM,CAAE,IAAA0C,CAAA,EAAQD,EAAQ,CAAC,EACzB,OAAIC,GAAO,KAAK,OAAO,KAAKA,CAAG,GAC7B,OAAO1C,EAAO,QAET2C,EAAM3C,EAAQ,GAAGyC,CAAO,CACjC,CAaA,MAAM,KACJC,EACAhC,EACAhE,EAAkB,CAAC,EACnBrE,EAAkC,GACV,CAClBqK,EAAA,KAAK,qBAAqBA,EAAKhG,CAAM,EACvC,GAAA,CACF,MAAM3D,EAAW,MAAM,KAAK,QAAQ2J,EAAK,CACvC,OAAQ,OACR,KAAAhC,EACA,QAAArI,CAAA,CACD,EACM,OAAA,KAAK,iBAAiBU,CAAQ,QAC9BwF,EAAO,CACR,MAAA,IAAIvB,EAAUuB,CAAmB,CACzC,CACF,CAaA,MAAM,IACJmE,EACAhG,EAAkB,CAAA,EAClBrE,EAAkC,CAAC,EACnCuK,EAA6B,GACL,CAClBF,EAAA,KAAK,eAAeA,EAAKhG,CAAM,EACjC,GAAA,CACI,MAAA3D,EAAW,MAAM,KAAK,QAC1B2J,EACAC,EAAM,CAAE,OAAQ,MAAO,QAAAtK,CAAA,EAAWuK,CAAM,CAAA,EAEnC,OAAA,KAAK,iBAAiB7J,CAAQ,QAC9BwF,EAAO,CACR,MAAA,IAAIvB,EAAUuB,CAAmB,CACzC,CACF,CAYA,MAAM,OACJmE,EACAhG,EACArE,EAAkC,CAAA,EACV,CAClBqK,EAAA,KAAK,qBAAqBA,EAAKhG,CAAM,EACvC,GAAA,CACI,MAAA3D,EAAW,MAAM,KAAK,QAAQ2J,EAAK,CAAE,OAAQ,SAAU,QAAArK,CAAA,CAAS,EAC/D,OAAA,KAAK,iBAAiBU,CAAQ,QAC9BwF,EAAO,CACR,MAAA,IAAIvB,EAAUuB,CAAmB,CACzC,CACF,CAaA,MAAM,IACJmE,EACAhC,EACAhE,EAAkB,CAAC,EACnBrE,EAAkC,GACV,CAClBqK,EAAA,KAAK,qBAAqBA,EAAKhG,CAAM,EACvC,GAAA,CACF,MAAM3D,EAAW,MAAM,KAAK,QAAQ2J,EAAK,CACvC,OAAQ,MACR,KAAAhC,EACA,QAAArI,CAAA,CACD,EACM,OAAA,KAAK,iBAAiBU,CAAQ,QAC9BwF,EAAO,CACR,MAAA,IAAIvB,EAAUuB,CAAmB,CACzC,CACF,CAWA,MAAM,SACJmE,EACArK,EAAkC,GACV,CACpB,GAAA,CACF,MAAMU,EAAW,MAAM,KAAK,SAAS,IAAI2J,EAAK,CAC5C,QAAArK,CAAA,CACD,EACM,OAAA,KAAK,iBAAiBU,CAAQ,QAC9BwF,EAAO,CACR,MAAA,IAAIvB,EAAUuB,CAAmB,CACzC,CACF,CAWA,MAAM,QACJmE,EACA1C,EAA6B,GACL,CAExB,MAAM6C,EAAM,KAAK,YAAY,CAAE,IAAAH,CAAA,EAAO1C,CAAM,EAEtCzE,EAAM,KAAK,UAAUsH,CAAG,EAC1B,GAAA,CACF,IAAIC,EAAgD,KAC/C,KAAK,YAAY,IAAIvH,CAAG,EAIVuH,EAAA,KAAK,YAAY,IAAIvH,CAAG,GAHxBuH,EAAA,KAAK,SAAS,QAAQD,CAAG,EACrC,KAAA,YAAY,IAAItH,EAAKuH,CAAc,GAI1C,MAAM/J,EAAW,MAAM+J,EAEvB,OAAI,KAAK,YAAY,IAAIvH,CAAG,GACrB,KAAA,YAAY,OAAOA,CAAG,EAEtB,KAAK,iBAAiBxC,CAAQ,QAC9BwF,EAAO,CAEd,MAAI,KAAK,YAAY,IAAIhD,CAAG,GACrB,KAAA,YAAY,OAAOA,CAAG,EAEvB,IAAIyB,EAAUuB,CAAmB,CACzC,CACF,CAUA,MAAMyB,EAA2D,CAC/D,OAAOsC,EAAMtC,CAAM,CACrB,CAYA,MAAM,IACJ0C,EACAhG,EACAqG,EAAgC,CAAA,EACjB,CACfL,EAAM,KAAK,eAAe,KAAK,QAAUA,EAAKhG,CAAM,EAC/CqG,EAAQ,UACXA,EAAQ,QAAU,IAEpB,MAAM1K,EAAU0K,EAAQ,QAExB,CACU1K,EAAA,cAAgB,UAAUmF,EAAA,CAAU,GACxC,IAAA2C,EAAW,KAAK,IAAI,SAClB,KAAA,CAAE,QAAAC,CAAY,EAAA,KAChBA,IACEA,EAAQ,WACVD,EAAWC,EAAQ,UAEjBA,EAAQ,QACV/H,EAAQ,SAAW+H,EAAQ,QAG/B/H,EAAQ,YAAc8H,CACxB,CACA,MAAMH,EAASgD,EACb,CACE,eAAgB,GAChB,OAAQ,MACV,EACAD,CAAA,EAEI,MAAAxL,GAAiBmL,EAAK1C,CAAM,CACpC,CAWQ,iBAAiBjH,EAAwC,CAC/D,MAAMhC,EAAMgC,EACZ,OAAIhC,EAAI,QAAU,KAAOA,EAAI,QAAU,MACrCA,EAAI,GAAK,GACLkM,GAAalM,EAAI,IAAI,IACvBA,EAAI,KAAO,SAGRA,CACT,CAYQ,qBAAqB2L,EAAahG,EAA0B,CAClE,OAAIA,GACW,OAAO,KAAKA,CAAM,EAE1B,QAASJ,GAAiB,CACzBA,EAAK,WAAW,KAAK,GAAK4G,EAAYxG,EAAOJ,CAAI,CAAC,GAClCI,EAAOJ,CAAI,CAC/B,CACD,EACM,KAAK,eAAeoG,EAAKhG,CAAM,GAEjCgG,CACT,CAYQ,eAAeA,EAAahG,EAAyB,CAC3D,CAEQ,MAAAyG,EAAWT,EAAI,MAAM,GAAG,EAC9BS,EAAS,CAAC,EAAIA,EAAS,CAAC,EACrB,MAAM,GAAG,EACT,OAAY,mBAAmB7G,CAAI,CAAC,EACpC,KAAK,GAAG,EACLoG,EAAAS,EAAS,OAAS,EAAIA,EAAS,KAAK,GAAG,EAAIA,EAAS,CAAC,CAC7D,CACM,MAAAC,EAAoBC,GAAG,UAAU3G,CAAM,EACzC,OAAAwG,EAAYE,CAAS,IACnBV,EAAI,SAAS,GAAG,EACZA,EAAA,GAAGA,CAAG,GAAGU,CAAS,GACfV,EAAI,QAAQ,GAAG,IAAM,IAAMA,EAAI,SAAS,GAAG,EAC9CA,EAAA,GAAGA,CAAG,GAAGU,CAAS,GACfV,EAAI,QAAQ,GAAG,IAAM,IAAM,CAACA,EAAI,SAAS,GAAG,EAC/CA,EAAA,GAAGA,CAAG,IAAIU,CAAS,GAEnBV,EAAA,GAAGA,CAAG,IAAIU,CAAS,IAGtBV,CACT,CACF,CAAAzI,EAAA,MAAAsI,EAAA,ECzcO,MAAMe,CAAW,CA8BtB,OAAO,KAAK5D,EAAazD,EAAoByE,EAAsB,CAC7D,OAAAwC,EAAYxD,CAAG,IACbwD,EAAYjH,CAAO,GACNyD,EAAI,MAAM,KAAK,UAAU,GAChC,QAAgB6D,GAAA,CACtB,MAAMhI,EAAMgI,EAAK,MAAM,GAAIA,EAAK,OAAS,CAAC,EACpC7D,EAAAA,EAAI,QAAQ,cAAcnE,CAAG,IAAKU,EAASV,CAAG,GAAK,EAAE,CAAA,CAC5D,EAEC2H,EAAYxC,CAAI,GACHhB,EAAI,MAAM,KAAK,OAAO,GAC7B,QAAgB6D,GAAA,CACtB,MAAMhI,EAAMgI,EAAK,MAAM,EAAGA,EAAK,OAAS,CAAC,EACnC7D,EAAAA,EAAI,QAAQ,WAAWnE,CAAG,IAAKmF,EAAMnF,CAAG,GAAK,EAAE,CAAA,CACtD,GAGEmE,CACT,CACF,CAAAzF,EAAA,aAAAqJ,CAAA,EAjDaA,EAQJ,WAAa,6CARTA,EAiBJ,QAAU,0CCnBZ,MAAME,EAAU,CAUrB,WAAW,WAAoB,CAC7B,MAAMC,EAAY,OAAO,SAAS,KAAK,YAAY,IAAI,EACvD,OAAO,OAAO,SAAS,KAAK,MAAM,EAAGA,EAAY,CAAC,CACpD,CAWA,WAAW,SAAkB,CAC3B,KAAM,CAAE,OAAAC,EAAQ,SAAAC,GAAa,OAAO,SACpC,MAAO,GAAGD,CAAM,GAAGC,CAAQ,GAAG,QAAQ,MAAO,EAAE,CACjD,CAWA,WAAW,WAAoB,CAC7B,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAK,EAAE,CAC7C,CAWA,WAAW,UAAmB,CAC5B,OAAO,OAAO,SAAS,IACzB,CACF,CAAA1J,EAAA,YAAAuJ,EAAA,EClDO,SAASI,EAAUC,EAA2C,CACnE,MAAMC,EAASD,EAAM,cAAgBA,EAAM,gBACxCA,EAAc,KAEjB,GAAIC,GAAQ,KAAa,OAAAA,EAGzB,SAASC,EACPtK,EACAuK,EAAsB,GACP,CACf,MAAMC,EAAaxK,EAAK,WAEjB,OAAAwK,EACHF,EAAWE,EAAYD,EAAK,OAAO,CAACC,CAAU,CAAC,CAAC,EAChDD,CACN,CAEO,MAAA,CAACH,EAAM,MAAM,EAAE,OAAOE,EAAWF,EAAM,MAAqB,CAAC,CACtE,CAcO,SAASK,EACdtH,EACAuH,EACAC,EACArB,EAAmC,CAAA,EACvB,CACLnG,EAAA,iBAAiBuH,EAAWC,EAAUrB,CAAO,EAEpD,IAAIsB,EAAU,IAAY,CACjBzH,EAAA,oBAAoBuH,EAAWC,EAAUrB,CAAO,EAE7CsB,EAAAzI,EAAA,EAGZ,MAAO,IAAM,CACHyI,GAAA,CAEZ,CAYgB,SAAAC,GAAcT,EAAmBU,EAA0B,CAClE,OAAAA,IAAOV,EAAM,SAAWU,GAAMX,EAAUC,CAAK,EAAE,SAASU,CAAE,EACnE,CCpEA,MAAMC,GAAgB,OAAO,OAAW,IAAc,OAAS,OAaxD,SAASC,GACd7H,EACA3B,EACA8H,EAAiC,CAAA,EACX,CAChB,KAAA,CAAE,OAAA2B,EAASF,GAAe,OAAAG,EAAS,CAAA,EAAI,QAAAC,EAAU,EAAS,EAAA7B,EAEhE,GAAI,CAACnG,EAAc,MAAA,IAAIQ,EAAa,sCAAa,EACjD,GAAI,CAACsH,EAAc,MAAA,IAAItH,EAAa,0BAAW,EAG/C,IAAIyH,EAAe,GAOb,MAAAC,EAAajB,GAEV,CAAC,CAACjH,EAAQ,GAAG+H,CAAM,EAAE,KAAWJ,GAC9BD,GAAcT,EAAOU,CAAE,CAC/B,EAIH,IAAIQ,EAAW,GACf,MAAMC,EAAQ,IAAY,CACbD,EAAA,EAAA,EAEPE,EAAU,IAAY,CACfF,EAAA,EAAA,EAIT,IAAAG,EAOE,MAAAd,EAAYP,GAA4B,CACxCkB,IACJL,EAAO,aAAaQ,CAAQ,EAGtBL,GAAgBC,EAAUjB,CAAK,GAErC5I,EAAQ4I,CAAK,EAAA,EAKTsB,EAAW,CACfjB,EAAcQ,EAAQ,QAASN,EAAU,CAAE,QAAS,GAAM,QAAAQ,EAAS,EACnEV,EACEQ,EACA,cACK5E,GAAA,CACCiF,IAEJF,EAAeC,EAAUhF,CAAC,EAC5B,EACA,CAAE,QAAS,EAAK,CAClB,EACAoE,EACEQ,EACA,YACK5E,GAAA,CACC,GAAA,CAAAiF,GAEAjF,EAAE,SAAW,EAAG,CAEZ,MAAAgE,EAAOF,EAAU9D,CAAC,EACxBA,EAAE,aAAe,IAA8BgE,EAC/CoB,EAAWR,EAAO,WAAW,IAAMN,EAAStE,CAAC,EAAG,EAAE,CACpD,CACF,EACA,CAAE,QAAS,EAAK,CAClB,CAAA,EACA,OAAO,OAAO,EAMT,MAAA,CAAE,KADI,IAAYqF,EAAS,QAAQhL,GAAMA,GAAI,EACrC,MAAA6K,EAAO,QAAAC,EACxB,CC3GA,MAAMvG,EAAI,KAAK,MAQf,SAAS0G,GAAOC,EAAyB,CACvC,MAAM5G,EAAI4G,EAAM,OACVC,EAAO,CAAA,EACb,GAAID,EAAM,MAAM,EAAG,CAAC,EAAE,gBAAkB,MAAO,CACvC,MAAAxF,EAAIwF,EAAM,MAAM,iBAAiB,EACvCC,EAAK,CAAC,EAAI,SAASzF,EAAE,CAAC,EAAG,EAAE,EAC3ByF,EAAK,CAAC,EAAI,SAASzF,EAAE,CAAC,EAAG,EAAE,EAC3ByF,EAAK,CAAC,EAAI,SAASzF,EAAE,CAAC,EAAG,EAAE,EACtByF,EAAA,CAAC,EAAIzF,EAAE,CAAC,EACTA,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAM,GACpB,SAASA,EAAE,CAAC,EAAG,EAAE,EAAI,IACrB,WAAWA,EAAE,CAAC,CAAC,EACjB,CAAA,KACC,CACD,IAAAA,EACApB,EAAI,EACFoB,EAAA,SACF,OAAOwF,EAAM,CAAC,CAAC,EACbA,EAAM,CAAC,EACPA,EAAM,CAAC,EACPA,EAAM,CAAC,EACPA,EAAM,CAAC,EACPA,EAAM,CAAC,GACN5G,EAAI,EAAI,OAAO4G,EAAM,CAAC,CAAC,EAAIA,EAAM,CAAC,EAAI,IACzC,EAAA,EAECxF,EAAI,SAASwF,EAAM,MAAM,CAAC,EAAG,EAAE,EAC/BC,EAAA,CAAC,EAAKzF,GAAK,GAAM,IACjByF,EAAA,CAAC,EAAKzF,GAAK,EAAK,IAChByF,EAAA,CAAC,EAAIzF,EAAI,IACdyF,EAAK,CAAC,EACJ7G,IAAM,GAAKA,IAAM,EAAIC,GAAKmB,GAAK,GAAM,KAAO,IAAO,GAAK,EAAI,IAAQ,CACxE,CACO,OAAAyF,CACT,CAaO,SAASC,GACdC,EACAC,EACAvO,EAAI,GACJwO,EAAwB,MAChB,CACRF,EAASA,EAAO,OAChBC,EAASA,EAAO,OACV,MAAAE,EAAKP,GAAOI,CAAM,EAClBI,EAAKR,GAAOK,CAAM,EAClBpQ,EAAS,CACbqJ,GAAG,EAAIxH,GAAKyO,EAAG,CAAC,EAAIzO,EAAI0O,EAAG,CAAC,CAAC,EAC7BlH,GAAG,EAAIxH,GAAKyO,EAAG,CAAC,EAAIzO,EAAI0O,EAAG,CAAC,CAAC,EAC7BlH,GAAG,EAAIxH,GAAKyO,EAAG,CAAC,EAAIzO,EAAI0O,EAAG,CAAC,CAAC,GAC5B,EAAI1O,GAAKyO,EAAG,CAAC,EAAIzO,EAAI0O,EAAG,CAAC,CAAA,EAE5B,GAAIF,IAAW,MAAO,CACpB,MAAMG,EAAM,CACVxQ,EAAO,CAAC,EAAE,SAAS,EAAE,EACrBA,EAAO,CAAC,EAAE,SAAS,EAAE,EACrBA,EAAO,CAAC,EAAE,SAAS,EAAE,EACrBA,EAAO,CAAC,IAAM,EAAI,KAAOqJ,EAAErJ,EAAO,CAAC,EAAI,GAAG,EAAE,SAAS,EAAE,CAAA,EAEzD,MAAO,IAAIwQ,EAAI,CAAC,CAAC,GAAGA,EAAI,CAAC,CAAC,GAAGA,EAAI,CAAC,CAAC,GAAGA,EAAI,CAAC,CAAC,EAC9C,CACA,MAAO,OAAOxQ,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,MAAMA,EAAO,CAAC,CAAC,GAClE,CC1EO,SAASyQ,GAAmBC,EAA0B,CAC3D,MAAMC,EAAMD,EAAS,MAAM,GAAG,EAAE,IAAI,EACpC,IAAIE,EAAO,GACX,OAAQD,EAAK,CACX,IAAK,OACIC,EAAA,oBACP,MACF,IAAK,OACIA,EAAA,qBACP,MACF,IAAK,QAEDA,EAAA,0EACF,MACF,IAAK,OACIA,EAAA,aACP,MACF,IAAK,OACIA,EAAA,kBACP,MACF,IAAK,OACIA,EAAA,YACP,MACF,IAAK,OACIA,EAAA,YACP,MACF,IAAK,QACIA,EAAA,aACP,MACF,IAAK,OACIA,EAAA,aACP,MACF,IAAK,OACIA,EAAA,kBACP,MACF,IAAK,OACIA,EAAA,kBACP,MACF,IAAK,MACIA,EAAA,qBACP,MACF,IAAK,OACIA,EAAA,oBACP,MACF,IAAK,QACIA,EAAA,2BACP,MACF,QACSA,EAAA,EACX,CACO,OAAAA,CACT,CAWO,SAASC,GAAQH,EAA2B,CACjD,MAAMC,EAAMD,EAAS,MAAM,GAAG,EAAE,IAAI,EACpC,OAAKC,EAGc,CAAC,QAAS,MAAO,MAAO,MAAO,MAAO,KAAK,EAC5C,SAASA,CAAG,EAHrB,EAIX,CAWgB,SAAAG,GAAqBC,EAAYL,EAAwB,CAEjE,MAAAM,EAAWP,GAAmBC,CAAQ,EAEtCO,EAAO,IAAI,KAAK,CAACF,CAAI,EAAG,CAAE,KAAMC,CAAA,CAAU,EAE1CE,EAAO,IAAI,gBAAgBD,CAAI,EAE/BzP,EAAI,SAAS,cAAc,GAAG,EACpCA,EAAE,KAAO0P,EACT1P,EAAE,SAAWkP,EAEJ,SAAA,KAAK,YAAYlP,CAAC,EAE3BA,EAAE,MAAM,EAEC,SAAA,KAAK,YAAYA,CAAC,EAE3B,IAAI,gBAAgB0P,CAAI,CAC1B,CCjGO,SAASC,GAAcC,EAA4B,CACxD,MAAMC,EAAQ,CAAA,EACd,QAASvP,EAAI,EAAGA,EAAIsP,EAAS,OAAQtP,IAC7BuP,EAAA,KAAKD,EAAStP,CAAC,CAAC,EAEjB,OAAAuP,CACT,CA4CO,SAASC,GAAWC,EAA6B,CACtD,MAAM1L,EAAiCyH,EACrC,CACE,SAAU,GACV,OAAQ,EACV,EACAiE,CAAA,EAEIpP,EAAQ,SAAS,cAAc,OAAO,EACtCA,EAAA,aAAa,OAAQ,MAAM,EACjCA,EAAM,aAAa,WAAY,GAAG0D,EAAK,QAAQ,EAAE,EAC3C1D,EAAA,aAAa,SAAU0D,EAAK,MAAM,EAClC1D,EAAA,SAAYsI,GAAY,CAC5B,MAAM+G,EAAU/G,EAAE,OACZ4G,EAAQG,EAAQ,MAAQL,GAAcK,EAAQ,KAAK,EAAI,GACzDH,EAAM,SAAW,IAGrBxL,EAAK,WAAWwL,CAAK,EACrBG,EAAQ,MAAQ,GAAA,EAET,SAAA,KAAK,YAAYrP,CAAK,EAC/BA,EAAM,MAAM,EACH,SAAA,KAAK,YAAYA,CAAK,CACjC,CCjCO,SAASsP,GAAWF,EAA8B,CACvD,MAAM1L,EAAkCyH,EACtC,CACE,SAAU,GACV,OAAQ,GACR,SAAU,GACV,aAAc,CAACoE,EAAmBC,IAA0B,GAC5D,OAASC,GAAgC,CAAC,EAC1C,QAAS,CAACA,EAA6BC,IAAuB,CAAC,EAC/D,MAAO,CAACD,EAA6BE,IAAoB,CAAC,EAC1D,SAAWH,GAA0B,CAAC,CACxC,EACAJ,CAAA,EAWIQ,EAAmB,CAACvD,EAAgB6C,IAA+B,CACvEA,EAAM,QAAgBN,GAAA,CACpBA,EAAK,WAAaiB,GAAMxD,EAAM,SAAW,GAAG,CAAA,CAC7C,EACI3I,EAAA,SAASoM,GAAUZ,CAAK,CAAC,CAAA,EAW1Ba,EAAgB,MACpBb,EACAc,IAC0B,CAE1B,GAAItM,EAAK,SAAWuM,EAAWvM,EAAK,OAAO,EAClC,OAAAA,EAAK,QAAQwL,CAAK,EAIrB,MAAAhG,EAAO,IAAI,SACjB,MAAAgG,EAAM,QAAgBN,GAAA,CACf1F,EAAA,OAAO,OAAQ0F,CAAI,CAAA,CACzB,EASK,IAAIhJ,EAAa,gFAAe,CAAA,EAWlCsK,EAAsB,MAAOhB,GAA0C,CACrE,MAAAiB,EAA6BjB,EAAM,IAAYN,IAC5C,CACL,OAAQ,YACR,KAAMA,EAAK,KACX,IAAKwB,GAAS,EACd,WAAY,CAAA,EAEf,EAID,GAAI,CADS1M,EAAK,aAAawL,EAAOiB,CAAW,EAE/C,OAAAA,EAAY,QAAgBvB,GAAA,CAC1BA,EAAK,OAAS,QAAA,CACf,EACI,KAAA,IAAI,MAAM,2BAAQuB,CAAW,EAC3BA,EAGL,GAAA,CACF,MAAM5Q,EAAM,MAAMwQ,EAAcb,EAAgB7C,GAAA,CAC9CuD,EAAiBvD,EAAO8D,CAAW,CAAA,CACpC,EACDA,EAAY,QAAgBvB,GAAA,CAC1BA,EAAK,OAAS,UAAA,CACf,EAEIlL,EAAA,QAAQyM,EAAa5Q,CAAG,EAC7B4Q,EAAY,QAAgBvB,GAAA,CAC1BA,EAAK,SAAWrP,CAAA,CACjB,QACMwH,EAAO,CACdoJ,EAAY,QAAgBvB,GAAA,CAC1BA,EAAK,OAAS,MAAA,CACf,EAEIlL,EAAA,MAAMyM,EAAapJ,CAAK,EAC7BoJ,EAAY,QAAgBvB,GAAA,CAC1BA,EAAK,MAAQ7H,CAAA,CACd,EACI,KAAA,IAAI,MAAMA,CAAK,EACpB,KAAK,IAAI,MAAM,GAAGmI,EAAM,IAAIN,GAAQA,EAAK,IAAI,EAAE,KAAK,GAAG,CAAC,0BAAM,CAChE,CACO,OAAAuB,CAAA,EAUHE,EAAc,MAAOnB,GAAiC,CACpD,MAAAoB,EAAiB5M,EAAK,SAAWwL,EAAM,IAAYN,GAAA,CAACA,CAAI,CAAC,EAAI,CAACM,CAAK,EACnE3P,EAAM,MAAM,QAAQ,WACxB+Q,EAAe,IAAI,MAAMC,GAChBL,EAAoBK,CAAQ,CACpC,CAAA,EAIGJ,EAA6B,CAAA,EACnC5Q,EAAI,QAAkB1B,GAAA,CAChBA,EAAO,SAAW,aACRsS,EAAA,KAAK,GAAGtS,EAAO,KAAK,CAClC,CACD,EAED6F,EAAK,OAAOyM,CAAW,CAAA,GAGV,IAAY,CACdhB,GAAA,CACT,OAAQzL,EAAK,OACb,SAAUA,EAAK,SACf,WAAqBwL,GAAA,CACnBmB,EAAYnB,CAAK,CACnB,CAAA,CACD,CAAA,IAIL,CClMsB,eAAAsB,GACpBvN,EACAwN,EACAvL,EACoC,CAMpC,GALM,MAAA,IAAI,QAAmBvE,GAAA,CAC3B,WAAW,IAAM,CACfA,EAAQ,EAAI,GACXsC,CAAI,CAAA,CACR,EACGwN,EACF,OAAOA,EAAI,GAAIvL,GAAU,CAAA,CAAG,CAEhC,CChBO,MAAMwL,EAAW,CAAjB,aAAA,CACL,KAAQ,QAAgC,KAExC,KAAQ,QAA0C,KASlC,KAAA,MAAA,CAAA,CASR,cAAqB,CACtB,KAAA,QAAU,IAAI,QAAmB/P,GAAA,CACpC,KAAK,QAAUA,CAAA,CAChB,CACH,CASQ,YAAmB,CACrB,KAAK,UACP,KAAK,QAAQ,EACb,KAAK,QAAU,KACf,KAAK,QAAU,KAEnB,CASA,MAAa,CACX,KAAK,OAAS,EACT,KAAK,SACR,KAAK,aAAa,CAEtB,CASA,QAAe,CACT,GAAA,KAAK,MAAQ,EACT,MAAA,IAAIiF,EAAa,sDAAmB,EAE5C,KAAK,OAAS,EACV,KAAK,QAAU,GACjB,KAAK,WAAW,CAEpB,CAQA,MAAM,OAAuB,CACvB,KAAK,SACP,MAAM,KAAK,OAEf,CACF,CAAAnD,EAAA,aAAAiO,EAAA,ECrFA,eAAsBC,GAAezF,EAA4B,CAC3D,GAAA,CACF,MAAM3L,EAAM,MAAM,KAAK,IAAI,IAAI2L,CAAG,EAC5B0F,EAAW,SAAS,cAAc,OAAO,EACtCA,EAAA,aAAa,QAAS,eAAe,EAC9CA,EAAS,UAAYrR,EAAI,KAChB,SAAA,KAAK,YAAYqR,CAAQ,OACpB,CACT,KAAA,IAAI,MAAM,yDAAa1F,CAAG,CACjC,CACF,CCfA,MAAM2F,GAAc,CAElB,eAAgB,CAAC,UAAU,CAC7B,EAEMC,GAAa,IAAI,MAAM,0BAAM,EAUnC,SAASC,GAAcrM,EAAesM,EAAuC,CAC3E,UAAW/R,KAAS+R,EACd,GAAAtM,EAAOzF,CAAK,GAAG,OACjB,OAAOyF,EAAOzF,CAAK,CAGzB,CAEA,SAASgS,GACPvM,EACAmF,EACAnG,EACM,CACN,KAAM,CAAE,eAAAwN,CAAe,EAAI1F,EAAeqF,GAAanN,GAAQ,CAAA,CAAE,EAC3DyN,EAAWJ,GAAcrM,EAAQwM,CAAc,EACrD,GAAIC,GAAU,OACZ,UAAWC,KAASD,EAAU,CAI5B,GAFgBtH,EAASuH,CAAK,EAGtB,MAAAN,GAISO,EAAAD,EAAOvH,EAAUnG,CAAI,CACxC,CAEJ,CAWgB,SAAA2N,EACd3M,EACAmF,EACAnG,EACM,CACF,GAAA,CACgBuN,GAAAvM,EAAQmF,EAAUnG,CAAI,QACjCqD,EAAO,CACd,GAAIA,IAAU+J,GACN,MAAA/J,CAEV,CACF,CAGA,MAAMuK,GAAc,CAClB,GAAGT,GAEH,aAAc,MAChB,EAyBgB,SAAAU,GACd7M,EACAX,EACAL,EACmB,CACb,KAAA,CAAE,aAAA8N,EAAc,gBAAAC,CAAA,EAAoBjG,EACxC8F,GACA5N,GAAQ,CAAC,CAAA,EAILgO,EACJD,IACEL,GACOA,EAAMI,CAAY,IAAMzN,GAI/B,IAAA4N,EACJ,OAAAN,EACE3M,EACQI,GAAA,CACN,GAAI4M,EAAiB5M,EAAMf,EAAKyN,CAAY,EACnC,OAAAG,EAAA7M,EACA,EAEX,EACApB,CAAA,EAEKiO,CACT,CC7HO,MAAMC,EAAU,CAiDrB,OAAc,SAASC,EAA2B,CAehD,MAdoB,CAClB,SACA,SACA,UACA,QACA,MACA,QACA,UACA,OACA,WACA,aACA,UACA,WAAA,EAEiB,SAAS,KAAK,SAASA,CAAQ,CAAC,CACrD,CAUA,OAAc,OAAOA,EAA2B,CAE9C,MADkB,CAAC,WAAY,gBAAiB,OAAQ,MAAM,EAC7C,SAAS,KAAK,SAASA,CAAQ,CAAC,CACnD,CAUA,OAAc,SAASA,EAA0B,CACxC,OAAA,KAAK,QAAQA,CAAQ,CAC9B,CACF,CAAApP,EAAA,YAAAmP,EAAA,EA3FaA,GAQK,QAAmC,CACjD,EAAG,UACH,EAAG,SACH,EAAG,SACH,EAAG,MACH,EAAG,OACH,EAAG,WACH,EAAG,UACH,EAAG,QACH,EAAG,QACH,EAAG,MACH,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,WACJ,GAAI,UACJ,GAAI,OACJ,GAAI,gBACJ,GAAI,WACJ,GAAI,aACJ,GAAI,cACJ,GAAI,UACJ,GAAI,OACJ,GAAI,YACJ,GAAI,UACJ,GAAI,YACJ,GAAI,UACJ,GAAI,mBACJ,GAAI,OACJ,GAAI,OACJ,GAAI,YACN,ECpCF,SAASE,GAAe3S,EAAyB,CAC/C,GAAI4S,GAAS5S,CAAK,GAAK8Q,EAAY9Q,EAAgB,KAAK,EACtD,OAAQA,EAAgB,OAE5B,CAMA,MAAM6S,GAA8B,CAClC,KAAM,EACR,EAcgB,SAAAhN,GAAS7F,EAAUuE,EAAqB,CAEtD,OADgB8H,EAAewG,GAAkBtO,GAAQ,CAAE,CAAA,EAC/C,KACHuO,GAAc9S,EAAO2S,EAAW,EAElCI,GAAU/S,EAAO2S,EAAW,CACrC,CC9BA,SAASK,GAASC,EAA6B,CAC7C,MAAO,CAAC,CAACA,GAAc,EAAEA,EAAcA,EAAa,EACtD,CAUA,SAASC,EAAiBD,EAA0B,CAElD,GAAI,CADeD,GAASC,CAAU,EAEpC,MAAM,IAAIxM,EAAa,GAAGwM,CAAU,2BAAO,CAE/C,CAWA,SAASE,GAAcC,EAAyB,EAAGH,EAA4B,CAC7E,OAAAC,EAAiBD,CAAU,EACpBG,EAAiBH,CAC1B,CAWA,SAASI,GACPD,EAAyB,EACzBH,EACQ,CACR,OAAAC,EAAiBD,CAAU,EACpBG,EAAiB,CAACH,CAC3B,CAWA,SAASK,GACPF,EAAyB,EACzBH,EACS,CACT,OAAAC,EAAiBD,CAAU,GACnBG,EAAiBH,KAAgB,CAC3C,CAEO,MAAMM,GAAUjQ,EAAA,UAAA,CACrB,SAAA0P,GACA,cAAAG,GACA,iBAAAE,GACA,gBAAAC,EACF,CAAA,ECjFME,EAASC,GAAO,aAEtBC,EAAO,IAAIF,CAAM,EAEjBE,EAAO,MAAMF,CAAM,ECQZ,MAAMG,EAAQ,CAAd,aAAA,CAOC,KAAA,IAAAvN,GASQ,KAAA,IAAAoN,EASd,KAAA,IAAW,IAAI5H,GASf,KAAA,SAA8B,IAAI9G,EASlC,KAAA,GAAoB,IAAI2F,EAAc,CAmBxC,CAAAnH,EAAA,UAAAqQ,EAAA,ECpEO,SAASC,IAAgB,CAC9B,GAAI,OAAO,KACH,MAAA,IAAI,MAAM,qEAAmB,EAE9B,OAAA,KAAO,IAAID,EACpB","x_google_ignoreList":[0,1]}
|