diff --git a/.erb/configs/webpack.config.main.prod.ts b/.erb/configs/webpack.config.main.prod.ts index 4727482..c69a29e 100644 --- a/.erb/configs/webpack.config.main.prod.ts +++ b/.erb/configs/webpack.config.main.prod.ts @@ -2,8 +2,9 @@ * Webpack config for production electron main process */ -import path from 'path'; -import webpack from 'webpack'; +import { join } from 'path'; +import { readFileSync } from 'fs'; +import { Configuration, DefinePlugin, EnvironmentPlugin } from 'webpack'; import { merge } from 'webpack-merge'; import TerserPlugin from 'terser-webpack-plugin'; import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; @@ -15,7 +16,13 @@ import deleteSourceMaps from '../scripts/delete-source-maps'; checkNodeEnv('production'); deleteSourceMaps(); -const configuration: webpack.Configuration = { +const packageJson = JSON.parse( + readFileSync(webpackPaths.appPackagePath, { + encoding: 'utf8', + }) +); + +const configuration: Configuration = { devtool: 'source-map', mode: 'production', @@ -23,8 +30,8 @@ const configuration: webpack.Configuration = { target: 'electron-main', entry: { - main: path.join(webpackPaths.srcMainPath, 'main.ts'), - preload: path.join(webpackPaths.srcMainPath, 'preload.ts'), + main: join(webpackPaths.srcMainPath, 'main.ts'), + preload: join(webpackPaths.srcMainPath, 'preload.ts'), }, output: { @@ -58,13 +65,15 @@ const configuration: webpack.Configuration = { * NODE_ENV should be production so that modules do not perform certain * development checks */ - new webpack.EnvironmentPlugin({ + new EnvironmentPlugin({ NODE_ENV: 'production', DEBUG_PROD: false, START_MINIMIZED: false, + XTORY_PACKAGED: true, + XTORY_VERSION: packageJson.version, }), - new webpack.DefinePlugin({ + new DefinePlugin({ 'process.type': '"browser"', }), ], diff --git a/.eslintrc.js b/.eslintrc.js index 9b5bbca..c4d0a93 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -32,6 +32,9 @@ module.exports = { 'lines-between-class-members': 'off', 'promise/no-callback-in-promise': 'off', }, + globals: { + XTORY_VERSION: 'readonly', + }, parserOptions: { ecmaVersion: 2020, sourceType: 'module', diff --git a/README.md b/README.md index 878aee2..e2fe733 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ In the 2018, I started this project as a fork of [Dialogger](https://github.com/ ## Choice of Stack -In the end, I've chosen the slowest option, which is a react app wrapped in an Electron layer. But to be honest, The problem with many of the greatest Open Source software is poor UI design which prevents them from appealing to a wider audience, [Blender](https://www.blender.org/) transition from 2.7x to 2.8x and [Musescore](https://musescore.org/en) version 3.xx to 4.xx shows this in practice. So With the help of react, Using a web approach to design and borrowing heavily from VSCode UI/UX, I hope it's easier to make a clean and usable UI with less development effort. It also lowers the entry barrier for plugin developers who whish to customize the software for their own needs. +In the end, I've chosen the slowest option, which is a react app wrapped in an Electron layer. But to be honest, The problem with many of the greatest Open Source software is poor UI design which prevents them from appealing to a wider audience, [Blender](https://www.blender.org/) transition from 2.7x to 2.8x and [Musescore](https://musescore.org/en) version 3.xx to 4.xx shows this in practice. So I've decided to sacrifice performance in favor of faster development cycle. Using a web approach to design and borrowing heavily from VSCode UI/UX, I hope it's easier to make a clean and usable UI with less development effort. Coincidentally theming such UI would be an easier task as well. It also lowers the entry barrier for plugin developers who whish to customize the software for their own needs. # Features @@ -42,10 +42,11 @@ Feel free to make issues and/or help with the development. Licensing of this project might not be clear from looking at the Github auto-detected license attribute. The Xtory software itself is licensed under GPL3 for maximizing the openness of the tooling, However all the operational parts such as C runtime, plugins and the plugin API itself are licensed under MIT so you can modify and embed them in your own proprietary engines and workflows without any licensing concerns. -| Project | License | -| ----------------------------- | ------- | -| Xtory Software | GPL3 | -| @xtory/plugin-api | MIT | -| @xtory/plugin-xflow | MIT | -| @xtory/plugin-reference-nodes | MIT | -| xtory C runtime | MIT | +| Project | Description | License | +| ----------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------- | +| Xtory Software | The modular editor | GPL3 | +| @xtory/plugin-api | Plugin API for developing xtory plugins | MIT | +| @xtory/plugin-xflow | Adds support for the main file type in xtory project, xflow is used for writing the plot graphs | MIT | +| @xtory/plugin-xconv | Adds support for the conversation graphs, supporting linear and branching conversations | MIT | +| @xtory/plugin-reference-nodes | Adds a collection of reference nodes for adding developer/writer references to your graphs | MIT | +| xtory C runtime | A single-header, cross-platform, C99 runtime and development kit for integrating xtory into your engine and tooling | MIT | diff --git a/assets/templates/Empty/xtory.json b/assets/templates/Empty/xtory.json index 4dfecd1..27c748e 100644 --- a/assets/templates/Empty/xtory.json +++ b/assets/templates/Empty/xtory.json @@ -4,6 +4,7 @@ "logLevel": 2, "plugins": { "@xtory/plugin-xflow": "*", + "@xtory/plugin-xconv": "*", "@xtory/plugin-reference-nodes": "*" }, "pluginsConfiguration": {} diff --git a/docs/plugin-api.md b/docs/plugin-api.md new file mode 100644 index 0000000..213ea34 --- /dev/null +++ b/docs/plugin-api.md @@ -0,0 +1,149 @@ +# Plugin API + +## Architecture + +A plugin is a npm package with a standard `package.json` file, For a package to actually be registered as a plugin by the xtory, you'll need to have a `xtoryApiVersion` field. + +### Main Entry Point + +Each plugin should have a `main` field which will be loaded on the main xtory process. This main entry point runs in the nodejs context and has full access to the main process environment, can make system call using nodejs API and is freed to import and use any of the package dependencies. + +The main script is expected to have default function exported. This function is called with a single argument of type `PluginContext` which provides both the plugin's logger and the plugin API. + +```ts +import type { PluginContext } from '@xtory/plugin-api'; +import MyService from './myService'; + +export default function ({ logger, api }: PluginContext) { + // Add a service to run in the main process. Renderers can call its public methods using `serviceCall` IPC calls. + api.addService('my-service', () => new MyService(logger)); + + // Adds a new file view for a custom extension + api + .addFileView('flow') // a node graph + .setFileType('myFileExt') + .createMenuItem('New MyFile', 'templates/empty.myFileExt') + .setNodes([ + // List of nodes configurations + ]); + + // Extend an existing file type view, It is especially useful for adding extra nodes to a flow + // introduced by another plugin. For example `@xtory/plugin-reference-nodes` extends `xconv` flows + // only if the file type is already registered via the `@xtory/plugin-xconv` plugin. + api.addFileView('flow').setFileType('xconv').setOptional(true).setNodes([ + // List of nodes that will be added to the `xconv` file type. + ]); +} +``` + +### Renderer Entry Point + +Plugins can optionally have a renderer script configured by adding the `rendererMain` field to the `package.json`. The renderer script will run in a restricted browser process. +The browser process the main or any other window. The renderer script is not allowed to import plugin's dependencies at runtime via relative paths as it evaluated out of the file-system context. Due to this restriction, for importing dependencies we require to use a bundler and create a singular javascript file as the entry point. However it is recommended to avoid using dependencies in the renderer and sticking with it as a tool for pure visual components. + +The renderer process does not provide nodejs integration or file-system access, The main means of communicating with the outside world is the IPC API exposed through `window.electron.ipcRenderer`. + +The IPC calls can be used with a large set of builtin operations, including the `serviceCall`. The `serviceCall` IPC channel can be used to call to any xtory service, including the builtin services, and services introduced by the plugins. You can read more about service calls and other IPC channels in the [IPC documentation(TODO: fix link when added)](#). + +```ts +const myServiceMethodResult = await window.electron.ipcRenderer.invoke( + 'serviceCall', + 'my-service', + 'myServiceMethodName', + ['argument1', 'argument2'] +); +``` + +Since the service is running in the main nodejs process, it is free to use any of the package's dependencies, and the nodejs API. + +### Render APIs + +By nature the of plugin's renderer script running in an restricted manner the compiled JavaScript entry point is not allowed to have any imports/requires which means you're only allowed to import types from the package's dependencies. The only things other than the browser API provided to the plugin's renderer are the global APIs exposed via the `@xtory/plugin-api/renderer`. + +This includes the global `React` instance, and the `window` extensions under `window.renderer` and `window.electron` properties. You can read more about the exposed electron calls in the [IPC documentation(TODO: fix link when added)](#). + +The `window.renderer` is an `XtoryRenderer` object shared across all plugins, providing them with the builtin UI components, exposed modules from the renderer, exposed custom react hooks, logger and other tools required for extending the graphical representation of the xtory. + +This object will replace all of the imports in your script, and can be used with object decustruction for a clean way of accessing the plugin dependencies. + +```ts +const { + modules: { + ReactFlow: { Handle, Position, useReactFlow }, + }, + ui: { icons, TextField, NodeContainer, Button, PickVariable }, + uuidv4, + registerNodeRenderer, +} = window.renderer; +``` + +This object being shared with other plugins is an intentional design desicion so the plugins can extend the builtin functionalities for all plugins. It includes adding new functions, components or editing the existing toolset; for example replacing the default `TextArea` component with a rich text editor or adding support for color coding the nodes. While having a shared object can cause problematic plugin designs and coupling, it also provides many opportunities for extending the application in a way that wouldn't be possible otherwise. Therefore it is up to the plugin developers to use it with caution. + +### Node Renderers + +Plugins can add new types of flow nodes to the xtory, adding a new node usually requires a custom node renderer. While the nodes configurations are set up via the main function, The renderer should be registered in the renderer scripts. This can be done with the `window.renderer.registerNodeRenderer` function. + +A node renderer is just a react component which accepts `Renderer.NodeProps` as its properties. A node renderer is registered under a string ID, this ID can be used in the main function to set up a node for using this custom node renderer. + +```ts +/// + +const { + ui: { NodeContainer, Handle }, + registerNodeRenderer, +} = window.renderer; + +interface MyCustomNodeData { + myData?: string; +} + +registerNodeRenderer( + 'my-plugin-name/my-custom-node-renderer', + function ({ selected, data }: Renderer.NodeProps) { + return ( + + + {data.myData} + + + ); + } +); +``` + +With having a custom renderer registered as demonstrated in the example above, you can use it as your custom node renderer in the main function: + +```ts +import type { PluginContext } from '@xtory/plugin-api'; + +export default function ({ logger, api }: PluginContext) { + api + .addFileView('flow') + .setFileType('myFileExt') + .setNodes([ + { + type: 'MyNode', + // ...rest of the options... + renderer: 'my-plugin-name/my-custom-node-renderer', + }, + ]); +} +``` + +Plugins can use renderers exposed for other plugins as well as the ones introduced by themselves. When depending on another plugin's renderers, is is highly recommended to have that plugin as a package dependency to ensure its presence. + +### plugin:// URIs + +While the renderer process is running independent of the file-system, the renderer scripts are still allowed to access the files in the plugins. However this can only happen indirectly and through the `plugin://` URIs. You can use `fetch` or even dynamic `import` calls on these URIs in order to load more files other than the renderer script in the rendering process. + +The current iteration of the `plugin` protocol has full file-system access and works with both absolute and relative paths, However it is advised not to rely on it as it will have significant changes in the short-term future. + +The current version of the protocol can be used similar to the `file://` URIs, they're treated as relative paths to the loaded project. The future iteration of the protocol will be much more limited to discourage anti-pattern design desicions in the plugins ecosystem. + +### The `xtoryApiVersion` + +Each release of of the xtory can have non-breaking or even breaking changes to its plugin APIs, The `xtoryApiVersion` is used for declaring the intended API version for a plugin. Xtory is then responsible for ensuring that its current API version is either the same or have backward compatibility with each plugin's expected API set. + +While in the pre `1.0` releases the backward compatibility is of a lower importance(meaning that there are breaking changes happening regularly), the API versioning is here to ensure a mature plugins ecosystem can thrive down the road; Allowing for compatibility layers, and decoupling the API which a plugin is developed against vs. the one it is going to run with. + +Note that the `xtoryApiVersion` is a single numeric version independent of the xtory's application version(which is a semantic version). Multiple versions of xtory can have the same `xtoryApiVersion`. diff --git a/package-lock.json b/package-lock.json index 1af6974..2df9442 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "@testing-library/react": "^13.4.0", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.4.0", - "@types/node": "18.13.0", + "@types/node": "^18.13.0", "@types/react": "^18.2.0", "@types/react-beautiful-dnd": "^13.1.4", "@types/react-dom": "^18.2.0", @@ -5892,6 +5892,10 @@ "resolved": "packages/plugin-reference-nodes", "link": true }, + "node_modules/@xtory/plugin-xconv": { + "resolved": "packages/plugin-xconv", + "link": true + }, "node_modules/@xtory/plugin-xflow": { "resolved": "packages/plugin-xflow", "link": true @@ -7887,10 +7891,11 @@ } }, "node_modules/config-file-ts/node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -18610,6 +18615,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19791,6 +19797,8 @@ "version": "0.2.5", "license": "GPT-3", "dependencies": { + "@xtory/plugin-api": "*", + "@xtory/shared": "*", "fengari": "^0.1.4", "fs-extra": "^11.1.1", "uuid": "^9.0.0" @@ -19827,21 +19835,16 @@ "devDependencies": { "@types/react": "^18.0.0", "@xtory/plugin-api": "*", - "typescript": "^5.0.0" + "typescript": "^4.9.5" } }, - "packages/plugin-reference-nodes/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "packages/plugin-xconv": { + "name": "@xtory/plugin-xconv", + "version": "0.2.5", + "license": "MIT", + "devDependencies": { + "@xtory/plugin-api": "*", + "typescript": "^4.9.5" } }, "packages/plugin-xflow": { @@ -19850,21 +19853,7 @@ "license": "MIT", "devDependencies": { "@xtory/plugin-api": "*", - "typescript": "^5.0.0" - } - }, - "packages/plugin-xflow/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "typescript": "^4.9.5" } }, "packages/renderer": { diff --git a/package.json b/package.json index a824b4c..7c8bc96 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,11 @@ "license": "GPL-3", "main": "./packages/main/src/main.ts", "scripts": { - "build": "concurrently \"npm run build:main\" \"npm run build:renderer\"", + "build": "npm run build:packages && concurrently \"npm run build:main\" \"npm run build:renderer\"", "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts", - "compile": "npm run build --workspaces --if-present", + "build:packages": "npm run build --workspaces --if-present", + "typecheck": "npm run typecheck --workspaces --if-present", "postinstall": "ts-node .erb/scripts/check-native-dep.js && cross-env CI=true electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts", "lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx", "lint:fix": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx --fix", @@ -112,7 +113,7 @@ "@testing-library/react": "^13.4.0", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.4.0", - "@types/node": "18.13.0", + "@types/node": "^18.13.0", "@types/react": "^18.2.0", "@types/react-beautiful-dnd": "^13.1.4", "@types/react-dom": "^18.2.0", diff --git a/packages/main/package.json b/packages/main/package.json index 38e41ed..b2a8f5c 100644 --- a/packages/main/package.json +++ b/packages/main/package.json @@ -5,8 +5,12 @@ "description": "Xtory main process", "main": "src/main.ts", "license": "GPT-3", - "scripts": {}, + "scripts": { + "typecheck": "tsc --noEmit" + }, "dependencies": { + "@xtory/shared": "*", + "@xtory/plugin-api": "*", "uuid": "^9.0.0", "fs-extra": "^11.1.1", "fengari": "^0.1.4" diff --git a/packages/main/src/ipc/actions/fsMove.ts b/packages/main/src/ipc/actions/fsMove.ts index 8e0601d..ffd6a7f 100644 --- a/packages/main/src/ipc/actions/fsMove.ts +++ b/packages/main/src/ipc/actions/fsMove.ts @@ -1,4 +1,4 @@ -import { IpcEvent, ChannelsRenderer } from '@xtory/shared'; +import type { IpcEvent } from '@xtory/plugin-api'; import fs from 'fs-extra'; export default function moveOnFileSystem( @@ -9,7 +9,7 @@ export default function moveOnFileSystem( fs.move(src, dest, (err) => { if (!err) return; sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Failed to move file from ${src} to ${dest} with Error: "${err}"`, 'error' ); diff --git a/packages/main/src/ipc/actions/fsRemove.ts b/packages/main/src/ipc/actions/fsRemove.ts index ecb314c..6f30251 100644 --- a/packages/main/src/ipc/actions/fsRemove.ts +++ b/packages/main/src/ipc/actions/fsRemove.ts @@ -1,4 +1,4 @@ -import { IpcEvent, ChannelsRenderer } from '@xtory/shared'; +import type { IpcEvent } from '@xtory/plugin-api'; import { rimraf } from 'rimraf'; export default async function remove({ sender }: IpcEvent, path: string) { @@ -6,7 +6,7 @@ export default async function remove({ sender }: IpcEvent, path: string) { await rimraf(path); } catch (exception) { sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Failed to delete "${path}" Reason: ${exception}`, 'error' ); diff --git a/packages/main/src/ipc/actions/logMessage.ts b/packages/main/src/ipc/actions/logMessage.ts index 6124cd9..face24f 100644 --- a/packages/main/src/ipc/actions/logMessage.ts +++ b/packages/main/src/ipc/actions/logMessage.ts @@ -1,4 +1,5 @@ -import { IpcEvent, LogLevel } from '@xtory/shared'; +import type { IpcEvent } from '@xtory/plugin-api'; +import { LogLevel } from '@xtory/shared'; import Project from 'main/project'; export default function logMessage( diff --git a/packages/main/src/ipc/actions/openFileAsTab.ts b/packages/main/src/ipc/actions/openFileAsTab.ts index 9e640af..806ed33 100644 --- a/packages/main/src/ipc/actions/openFileAsTab.ts +++ b/packages/main/src/ipc/actions/openFileAsTab.ts @@ -1,4 +1,5 @@ -import { IpcEvent, ChannelsRenderer, sanitizePath } from '@xtory/shared'; +import type { IpcEvent } from '@xtory/plugin-api'; +import { sanitizePath } from '@xtory/shared'; import fs from 'fs/promises'; export default async function openFileAsTab( @@ -8,10 +9,10 @@ export default async function openFileAsTab( try { const sanitizedPath = sanitizePath(path); const content = await fs.readFile(sanitizedPath, 'utf-8'); - sender.send(ChannelsRenderer.onOpenFileAsTab, sanitizedPath, content); + sender.send('onOpenFileAsTab', sanitizedPath, content); } catch (err) { sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Failed to open file ${path}, Reason: ${err} `, 'error' ); diff --git a/packages/main/src/ipc/actions/revealPathInOS.ts b/packages/main/src/ipc/actions/revealPathInOS.ts index 7cbca13..be0caa6 100644 --- a/packages/main/src/ipc/actions/revealPathInOS.ts +++ b/packages/main/src/ipc/actions/revealPathInOS.ts @@ -1,10 +1,6 @@ import { spawn } from 'child_process'; -import { - IpcEvent, - ChannelsRenderer, - Platform, - sanitizePath, -} from '@xtory/shared'; +import type { IpcEvent } from '@xtory/plugin-api'; +import { Platform, sanitizePath } from '@xtory/shared'; import { dirname } from 'path'; import { fsUtils } from 'main/utils'; @@ -87,7 +83,7 @@ export default function revealPathInOS({ sender }: IpcEvent, path: string) { revealPathInWindows(path, (err: unknown) => { if (!err) return; sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Failed to reveal "${path}" in File Explorer, Error: "${err}"`, 'error' ); @@ -97,7 +93,7 @@ export default function revealPathInOS({ sender }: IpcEvent, path: string) { revealPathInMac(path, (err: unknown) => { if (!err) return; sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Failed to Reveal "${path}" in Finder, Error: "${err}"`, 'error' ); @@ -107,7 +103,7 @@ export default function revealPathInOS({ sender }: IpcEvent, path: string) { revealPathInLinux(path, (err: unknown) => { if (!err) return; sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Failed to Open Containing Folder of "${path}", Error: "${err}"`, 'error' ); @@ -115,7 +111,7 @@ export default function revealPathInOS({ sender }: IpcEvent, path: string) { break; default: sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Can not reveal "${path}", OS(${process.platform}) is not supported`, 'error' ); diff --git a/packages/main/src/ipc/index.ts b/packages/main/src/ipc/index.ts index 704486d..190a337 100644 --- a/packages/main/src/ipc/index.ts +++ b/packages/main/src/ipc/index.ts @@ -1,6 +1,6 @@ import { ipcMain } from 'electron'; -import { ChannelsMain, IpcAction, IpcInvoke } from '@xtory/shared'; +import type { ChannelsMain, IpcAction, IpcInvoke } from '@xtory/plugin-api'; import fsMoveIpcAction from './actions/fsMove'; import fsRemoveIpcAction from './actions/fsRemove'; @@ -31,6 +31,7 @@ import updateCharacterIpcInvoke from './invokes/updateCharacter'; import removeCharacterIpcInvoke from './invokes/removeCharacter'; import getCharacterSettingsIpcInvoke from './invokes/getCharacterSettings'; import updateCharacterSettingsIpcInvoke from './invokes/updateCharacterSettings'; +import serviceCallIpcInvoke from './invokes/serviceCall'; const on = (channel: ChannelsMain, ipcAction: IpcAction): void => { ipcMain.on(channel, ipcAction); @@ -40,32 +41,33 @@ const handle = (channel: ChannelsMain, ipcAction: IpcInvoke): void => { ipcMain.handle(channel, ipcAction); }; -on(ChannelsMain.fsMove, fsMoveIpcAction); -on(ChannelsMain.fsRemove, fsRemoveIpcAction); -on(ChannelsMain.openFileAsTab, openFileAsTabAction); -on(ChannelsMain.revealPathInOS, revealPathInOSAction); -on(ChannelsMain.logMessage, logMessageAction); +on('fsMove', fsMoveIpcAction); +on('fsRemove', fsRemoveIpcAction); +on('openFileAsTab', openFileAsTabAction); +on('revealPathInOS', revealPathInOSAction); +on('logMessage', logMessageAction); -handle(ChannelsMain.browseFileSystem, browseFileSystemIpcInvoke); -handle(ChannelsMain.createNewProject, createNewProjectIpcInvoke); -handle(ChannelsMain.fspExists, fspExistsIpcInvoke); -handle(ChannelsMain.fspMkdir, fspMkdirIpcInvoke); -handle(ChannelsMain.fspWriteFile, fspWriteFileIpcInvoke); -handle(ChannelsMain.getXtoryTemplates, getXtoryTemplatesIpcInvoke); -handle(ChannelsMain.getFileTypes, getFileTypesIpcInvoke); -handle(ChannelsMain.openProject, openProjectIpcInvoke); -handle(ChannelsMain.selectImageFile, selectImageFileIpcInvoke); -handle(ChannelsMain.importResource, importResourceIpcInvoke); -handle(ChannelsMain.getResources, getResourcesIpcInvoke); -handle(ChannelsMain.updateResourceMetadata, updateResourceMetadataIpcInvoke); -handle(ChannelsMain.removeResource, removeResourceIpcInvoke); -handle(ChannelsMain.getPluginConfig, getPluginConfigIpcInvoke); -handle(ChannelsMain.updatePluginConfig, updatePluginConfigIpcInvoke); -handle(ChannelsMain.updatePluginEnabled, updatePluginEnabledIpcInvoke); -handle(ChannelsMain.restartApp, restartAppIpcInvoke); -handle(ChannelsMain.getCharacters, getCharactersIpcInvoke); -handle(ChannelsMain.createCharacter, createCharacterIpcInvoke); -handle(ChannelsMain.updateCharacter, updateCharacterIpcInvoke); -handle(ChannelsMain.removeCharacter, removeCharacterIpcInvoke); -handle(ChannelsMain.getCharacterSettings, getCharacterSettingsIpcInvoke); -handle(ChannelsMain.updateCharacterSettings, updateCharacterSettingsIpcInvoke); +handle('browseFileSystem', browseFileSystemIpcInvoke); +handle('createNewProject', createNewProjectIpcInvoke); +handle('fspExists', fspExistsIpcInvoke); +handle('fspMkdir', fspMkdirIpcInvoke); +handle('fspWriteFile', fspWriteFileIpcInvoke); +handle('getXtoryTemplates', getXtoryTemplatesIpcInvoke); +handle('getFileTypes', getFileTypesIpcInvoke); +handle('openProject', openProjectIpcInvoke); +handle('selectImageFile', selectImageFileIpcInvoke); +handle('importResource', importResourceIpcInvoke); +handle('getResources', getResourcesIpcInvoke); +handle('updateResourceMetadata', updateResourceMetadataIpcInvoke); +handle('removeResource', removeResourceIpcInvoke); +handle('getPluginConfig', getPluginConfigIpcInvoke); +handle('updatePluginConfig', updatePluginConfigIpcInvoke); +handle('updatePluginEnabled', updatePluginEnabledIpcInvoke); +handle('restartApp', restartAppIpcInvoke); +handle('getCharacters', getCharactersIpcInvoke); +handle('createCharacter', createCharacterIpcInvoke); +handle('updateCharacter', updateCharacterIpcInvoke); +handle('removeCharacter', removeCharacterIpcInvoke); +handle('getCharacterSettings', getCharacterSettingsIpcInvoke); +handle('updateCharacterSettings', updateCharacterSettingsIpcInvoke); +handle('serviceCall', serviceCallIpcInvoke); diff --git a/packages/main/src/ipc/invokes/browseFileSystem.ts b/packages/main/src/ipc/invokes/browseFileSystem.ts index a0303dd..a2d75bd 100644 --- a/packages/main/src/ipc/invokes/browseFileSystem.ts +++ b/packages/main/src/ipc/invokes/browseFileSystem.ts @@ -1,10 +1,11 @@ import { IpcMainInvokeEvent, dialog } from 'electron'; -import { BrowseFileSystemResult, IpcResultStatus } from '@xtory/shared'; +import { BrowseFileSystemResult } from '@xtory/shared'; +import { IpcResultStatus } from '@xtory/plugin-api'; export default async function browseFileSystemIpc( _event: IpcMainInvokeEvent, options: Object ): Promise { const result = await dialog.showOpenDialog(options); - return { status: IpcResultStatus.ok, ...result }; + return { status: 'OK' satisfies IpcResultStatus, ...result }; } diff --git a/packages/main/src/ipc/invokes/createNewProject.ts b/packages/main/src/ipc/invokes/createNewProject.ts index 453716c..873c43a 100644 --- a/packages/main/src/ipc/invokes/createNewProject.ts +++ b/packages/main/src/ipc/invokes/createNewProject.ts @@ -5,7 +5,6 @@ import { tryGetAsync, NewProjectModel, CreateNewProjectResult, - IpcResultStatus, } from '@xtory/shared'; import path from 'path'; @@ -19,7 +18,7 @@ export default async function createNewProject( if (projectRoot === '' || projectPath === '' || projectTemplate === '') { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: 'Something went wrong, Invalid Input!', }; } @@ -34,7 +33,7 @@ export default async function createNewProject( // validation begin if (!projectRootExists) { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Path "${projectRoot}" does not exists or Xtory don't have access to it!`, }; } @@ -44,7 +43,7 @@ export default async function createNewProject( await mkdir(projectPath); } catch { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Failed to create ${projectPath} directory.`, }; } @@ -54,13 +53,13 @@ export default async function createNewProject( const projectPathFiles = await readdir(projectPath); if (projectPathFiles.length > 0) { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `"${projectPath}" is not empty.`, }; } } catch { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Failed to access "${projectPath}".`, }; } @@ -72,7 +71,7 @@ export default async function createNewProject( if (!readConfigResult.success) { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Failed to load template from "${templatePath}"`, }; } @@ -87,7 +86,7 @@ export default async function createNewProject( }); } catch (exception) { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Failed to copy template from "${templatePath}" to "${projectPath}" "${exception}"`, }; } @@ -96,10 +95,10 @@ export default async function createNewProject( await writeFile(projectConfigPath, projectConfig); } catch { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Failed to write onto file "${projectConfigPath}"`, }; } - return { status: IpcResultStatus.ok }; + return { status: 'OK' }; } diff --git a/packages/main/src/ipc/invokes/fspExists.ts b/packages/main/src/ipc/invokes/fspExists.ts index 3031862..b51fa5c 100644 --- a/packages/main/src/ipc/invokes/fspExists.ts +++ b/packages/main/src/ipc/invokes/fspExists.ts @@ -1,4 +1,4 @@ -import { IpcInvokeEvent } from '@xtory/shared'; +import type { IpcInvokeEvent } from '@xtory/plugin-api'; import { constants } from 'fs/promises'; import { fsUtils } from 'main/utils'; diff --git a/packages/main/src/ipc/invokes/fspMkdir.ts b/packages/main/src/ipc/invokes/fspMkdir.ts index 52f976f..9854d8a 100644 --- a/packages/main/src/ipc/invokes/fspMkdir.ts +++ b/packages/main/src/ipc/invokes/fspMkdir.ts @@ -1,4 +1,4 @@ -import { IpcInvokeEvent, ChannelsRenderer } from '@xtory/shared'; +import type { IpcInvokeEvent } from '@xtory/plugin-api'; import fs from 'fs/promises'; export default async function mkdirAsync( @@ -10,7 +10,7 @@ export default async function mkdirAsync( return true; } catch (err) { sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Failed to create folder from ${path} with Error: "${err}"`, 'error' ); diff --git a/packages/main/src/ipc/invokes/fspWriteFile.ts b/packages/main/src/ipc/invokes/fspWriteFile.ts index 521077e..e318444 100644 --- a/packages/main/src/ipc/invokes/fspWriteFile.ts +++ b/packages/main/src/ipc/invokes/fspWriteFile.ts @@ -1,4 +1,4 @@ -import { IpcInvokeEvent, ChannelsRenderer } from '@xtory/shared'; +import type { IpcInvokeEvent } from '@xtory/plugin-api'; import fs from 'fs/promises'; export default async function mkdirAsync( @@ -11,7 +11,7 @@ export default async function mkdirAsync( return true; } catch (err) { sender.send( - ChannelsRenderer.toastMessage, + 'toastMessage', `Failed to write ${data} to ${path} with Error: "${err}"`, 'error' ); diff --git a/packages/main/src/ipc/invokes/serviceCall.ts b/packages/main/src/ipc/invokes/serviceCall.ts new file mode 100644 index 0000000..27649c6 --- /dev/null +++ b/packages/main/src/ipc/invokes/serviceCall.ts @@ -0,0 +1,32 @@ +import { IpcMainInvokeEvent } from 'electron'; +import project from 'main/project'; +import { BuiltinServices } from '@xtory/main/services/types'; + +// TODO: add type safety for methods/arguments and return types +export default async function serviceCall< + SVC extends keyof BuiltinServices | (string & {}) +>( + _event: IpcMainInvokeEvent, + serviceName: SVC, + methodName: string, + args: any[] +): Promise { + const service = project.getService(serviceName); + if (!service) { + throw new Error(`Invalid service name ${serviceName}`); + } + if (!(methodName in service)) { + throw new Error(`Invalid method ${methodName} on ${serviceName} service`); + } + + const maybeFn = (service as any)[methodName]; + if (typeof maybeFn !== 'function') { + throw new Error( + `Property ${methodName} exists on ${serviceName} service but it is ${typeof maybeFn} instead of a valid function` + ); + } + // NOTE: here we use the original value for the call to avoid discarding this assigned to the function + return ((service as any)[methodName] as (...args: any) => any)( + ...(args ?? []) + ); +} diff --git a/packages/main/src/main.ts b/packages/main/src/main.ts index 7d41e89..b3465b5 100644 --- a/packages/main/src/main.ts +++ b/packages/main/src/main.ts @@ -10,8 +10,12 @@ */ import path from 'path'; import { app, BrowserWindow, shell, ipcMain, protocol } from 'electron'; +import '@xtory/plugin-api'; import { autoUpdater } from 'electron-updater'; import log from 'electron-log'; + +// import { version as packageVersion } from 'package.json'; +// import MenuBuilder from './menu'; import { resolveHtmlPath } from './utils'; import { setMainWindow } from './windowManager'; @@ -19,6 +23,7 @@ import { setMainWindow } from './windowManager'; import project from './project'; import projectLoader from './project/projectLoader'; import './ipc/index'; +import { readFileSync } from 'fs'; // Register privileged scheme for plugins and assets protocol.registerSchemesAsPrivileged([ @@ -44,8 +49,6 @@ protocol.registerSchemesAsPrivileged([ }, ]); -project.init(projectLoader); - class AppUpdater { constructor() { log.transports.file.level = 'info'; @@ -54,8 +57,20 @@ class AppUpdater { } } +if (process.env.XTORY_PACKAGED) { + (global as any).XTORY_VERSION = process.env.XTORY_VERSION; +} else { + (global as any).XTORY_VERSION = JSON.parse( + readFileSync(path.resolve(__dirname, '../package.json'), { + encoding: 'utf8', + }) + ).version; +} + let mainWindow: BrowserWindow | null = null; +project.init(projectLoader); + // eslint-disable-next-line import/prefer-default-export export const getMainWindow = () => mainWindow; @@ -117,7 +132,7 @@ const createWindow = async () => { setMainWindow(mainWindow); - mainWindow.loadURL(resolveHtmlPath('index.html')); + mainWindow.loadURL(resolveHtmlPath('index.html', { v: XTORY_VERSION })); mainWindow.on('ready-to-show', () => { if (!mainWindow) { diff --git a/packages/main/src/menu.ts b/packages/main/src/menu.ts index c8c5755..1b28da5 100644 --- a/packages/main/src/menu.ts +++ b/packages/main/src/menu.ts @@ -4,13 +4,9 @@ import { shell, BrowserWindow, MenuItemConstructorOptions, + dialog, } from 'electron'; -interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions { - selector?: string; - submenu?: DarwinMenuItemConstructorOptions[] | Menu; -} - export default class MenuBuilder { mainWindow: BrowserWindow; @@ -26,12 +22,7 @@ export default class MenuBuilder { this.setupDevelopmentEnvironment(); } - const template = - process.platform === 'darwin' - ? this.buildDarwinTemplate() - : this.buildDefaultTemplate(); - - const menu = Menu.buildFromTemplate(template); + const menu = Menu.buildFromTemplate(this.menuTemplate()); Menu.setApplicationMenu(menu); return menu; @@ -52,28 +43,14 @@ export default class MenuBuilder { }); } - buildDarwinTemplate(): MenuItemConstructorOptions[] { - const subMenuAbout: DarwinMenuItemConstructorOptions = { - label: 'Electron', + menuTemplate() { + const darwin = process.platform === 'darwin'; + const subMenuDarwinXtory: MenuItemConstructorOptions = { + label: 'Xtory', submenu: [ { - label: 'About ElectronReact', - selector: 'orderFrontStandardAboutPanel:', - }, - { type: 'separator' }, - { label: 'Services', submenu: [] }, - { type: 'separator' }, - { - label: 'Hide ElectronReact', - accelerator: 'Command+H', - selector: 'hide:', - }, - { - label: 'Hide Others', - accelerator: 'Command+Shift+H', - selector: 'hideOtherApplications:', + label: 'About', }, - { label: 'Show All', selector: 'unhideAllApplications:' }, { type: 'separator' }, { label: 'Quit', @@ -84,207 +61,79 @@ export default class MenuBuilder { }, ], }; - const subMenuEdit: DarwinMenuItemConstructorOptions = { - label: 'Edit', + const subMenuView: MenuItemConstructorOptions = { + label: 'View', submenu: [ - { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, - { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, - { type: 'separator' }, - { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' }, - { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, - { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, { - label: 'Select All', - accelerator: 'Command+A', - selector: 'selectAll:', + label: 'Toggle Full Screen', + accelerator: darwin ? 'Ctrl+Command+F' : 'F11', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + }, }, ], }; - const subMenuViewDev: MenuItemConstructorOptions = { - label: 'View', + + const subMenuDev: MenuItemConstructorOptions = { + label: 'Developer', submenu: [ { label: 'Reload', - accelerator: 'Command+R', + accelerator: darwin ? 'Command+R' : 'Ctrl+R', click: () => { this.mainWindow.webContents.reload(); }, }, - { - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - }, - }, { label: 'Toggle Developer Tools', - accelerator: 'Alt+Command+I', + accelerator: darwin ? 'Alt+Command+I' : 'Alt+Ctrl+I', click: () => { this.mainWindow.webContents.toggleDevTools(); }, }, ], }; - const subMenuViewProd: MenuItemConstructorOptions = { - label: 'View', - submenu: [ - { - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - }, - }, - ], - }; - const subMenuWindow: DarwinMenuItemConstructorOptions = { - label: 'Window', - submenu: [ - { - label: 'Minimize', - accelerator: 'Command+M', - selector: 'performMiniaturize:', - }, - { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, - { type: 'separator' }, - { label: 'Bring All to Front', selector: 'arrangeInFront:' }, - ], - }; const subMenuHelp: MenuItemConstructorOptions = { label: 'Help', submenu: [ { - label: 'Learn More', - click() { - shell.openExternal('https://electronjs.org'); - }, - }, - { - label: 'Documentation', - click() { - shell.openExternal( - 'https://github.com/electron/electron/tree/main/docs#readme' - ); - }, - }, - { - label: 'Community Discussions', + label: 'Github', click() { - shell.openExternal('https://www.electronjs.org/community'); + shell.openExternal('https://github.com/rzvxa/xtory'); }, }, { label: 'Search Issues', click() { - shell.openExternal('https://github.com/electron/electron/issues'); + shell.openExternal('https://github.com/rzvxa/xtory/issues'); }, }, + ...(darwin + ? [] + : [ + { type: 'separator' as const }, + { + label: 'About', + click: () => { + dialog.showMessageBoxSync(this.mainWindow, { + title: 'About Xtory', + message: `Xtory ${XTORY_VERSION}\nLicensed under GPLv3\nGPL License: https://github.com/rzvxa/xtory/blob/master/LICENSE\nThird Party Licenses: https://github.com/rzvxa/xtory/blob/master/Third_Party_Licenses\nIf your license is missing please create an issue on the Github!`, + }); + }, + }, + ]), ], }; - const subMenuView = - process.env.NODE_ENV === 'development' || - process.env.DEBUG_PROD === 'true' - ? subMenuViewDev - : subMenuViewProd; - - return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow, subMenuHelp]; - } - - buildDefaultTemplate() { - const templateDefault = [ - { - label: '&File', - submenu: [ - { - label: '&Open', - accelerator: 'Ctrl+O', - }, - { - label: '&Close', - accelerator: 'Ctrl+W', - click: () => { - this.mainWindow.close(); - }, - }, - ], - }, - { - label: '&View', - submenu: - process.env.NODE_ENV === 'development' || - process.env.DEBUG_PROD === 'true' - ? [ - { - label: '&Reload', - accelerator: 'Ctrl+R', - click: () => { - this.mainWindow.webContents.reload(); - }, - }, - { - label: 'Toggle &Full Screen', - accelerator: 'F11', - click: () => { - this.mainWindow.setFullScreen( - !this.mainWindow.isFullScreen() - ); - }, - }, - { - label: 'Toggle &Developer Tools', - accelerator: 'Alt+Ctrl+I', - click: () => { - this.mainWindow.webContents.toggleDevTools(); - }, - }, - ] - : [ - { - label: 'Toggle &Full Screen', - accelerator: 'F11', - click: () => { - this.mainWindow.setFullScreen( - !this.mainWindow.isFullScreen() - ); - }, - }, - ], - }, - { - label: 'Help', - submenu: [ - { - label: 'Learn More', - click() { - shell.openExternal('https://electronjs.org'); - }, - }, - { - label: 'Documentation', - click() { - shell.openExternal( - 'https://github.com/electron/electron/tree/main/docs#readme' - ); - }, - }, - { - label: 'Community Discussions', - click() { - shell.openExternal('https://www.electronjs.org/community'); - }, - }, - { - label: 'Search Issues', - click() { - shell.openExternal('https://github.com/electron/electron/issues'); - }, - }, - ], - }, + return [ + ...(darwin ? [subMenuDarwinXtory] : []), + subMenuView, + ...(process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' || + process.env.XTORY_DEVELOPER_MODE === 'true' + ? [subMenuDev] + : []), + subMenuHelp, ]; - - return templateDefault; } } diff --git a/packages/main/src/preload.ts b/packages/main/src/preload.ts index 8f0d098..7aa3830 100644 --- a/packages/main/src/preload.ts +++ b/packages/main/src/preload.ts @@ -1,14 +1,15 @@ // Disable no-unused-vars, broken for spread args /* eslint no-unused-vars: off */ import { contextBridge, ipcRenderer } from 'electron'; -import { - ChannelsMain, - ChannelsRenderer, +import type { IpcAction, IpcResult, -} from '@xtory/shared'; + ChannelsMain, + ChannelsRenderer, +} from '@xtory/plugin-api'; +import type { ElectronHandler } from '@xtory/plugin-api/renderer'; -const electronHandler = { +const electronHandler: ElectronHandler = { ipcRenderer: { on(channel: ChannelsRenderer, ipcAction: IpcAction) { ipcRenderer.on(channel, ipcAction); @@ -34,5 +35,3 @@ const electronHandler = { contextBridge.exposeInMainWorld('electron', electronHandler); contextBridge.exposeInMainWorld('platform', process.platform); - -export type ElectronHandler = typeof electronHandler; diff --git a/packages/main/src/project/index.ts b/packages/main/src/project/index.ts index 1606f75..7fd7dcb 100644 --- a/packages/main/src/project/index.ts +++ b/packages/main/src/project/index.ts @@ -1,19 +1,19 @@ import { WebContents } from 'electron'; +import type { IService } from '@xtory/plugin-api'; + import type LoggingService from 'main/services/loggingService'; import type PluginsService from 'main/services/pluginsService'; import type ResourceService from 'main/services/resourceService'; import type CharacterService from 'main/services/characterService'; +import type VariablesService from 'main/services/variableService'; -import { - ChannelsRenderer, - OpenProjectResult, - IpcResultStatus, -} from '@xtory/shared'; +import { OpenProjectResult } from '@xtory/shared'; import type ProjectSettingsService from 'main/services/projectSettingsService'; import type Project from './project'; import type { ProjectLoaderType } from './projectLoader'; +import type { BuiltinServices } from '../services/types'; export default class ProjectManager { static #isInit: boolean = false; @@ -32,43 +32,44 @@ export default class ProjectManager { } static get logger(): LoggingService { - this.#throwIfNotInit(); - if (!this.#project) { - throw Error('No Project Is Open!'); - } - return this.#project.loggingService; + return this.getService('logger'); } static get pluginsService(): PluginsService { - this.#throwIfNotInit(); - if (!this.#project) { - throw Error('No Project Is Open!'); - } - return this.#project.pluginsService; + return this.getService('plugins'); } static get settingsService(): ProjectSettingsService { - this.#throwIfNotInit(); - if (!this.#project) { - throw Error('No Project Is Open!'); - } - return this.#project.projectSettingsService; + return this.getService('settings'); } static get resourceService(): ResourceService { - this.#throwIfNotInit(); - if (!this.#project) { - throw Error('No Project Is Open!'); - } - return this.#project.resourceService; + return this.getService('resources'); } static get characterService(): CharacterService { + return this.getService('characters'); + } + + static get variablesService(): VariablesService { + return this.getService('variables'); + } + + static getService( + name: S + ): BuiltinServices[S]; + static getService(name: S): IService | null; + static getService( + name: string + ): BuiltinServices[keyof BuiltinServices] | IService | null { this.#throwIfNotInit(); if (!this.#project) { throw Error('No Project Is Open!'); } - return this.#project.characterService; + return ( + this.#project.builtinServices[name as keyof BuiltinServices] ?? + this.#project.builtinServices.plugins.getForeignService(name) + ); } static get path(): string { @@ -106,33 +107,32 @@ export default class ProjectManager { ); if (project) { + process.chdir(projectPath); this.#project = project; - // initializing services, this part can be done with type checking - await this.#project.projectWatchService.init(); - await this.#project.loggingService.init(); - await this.#project.resourceService.init(); - await this.#project.characterService.init(); - await this.#project.projectSettingsService.init(); + // initializing builtin services(excluding the plugin service) + Object.entries(this.#project.builtinServices) + .filter(([name]) => name !== 'plugins') + .forEach(([, svc]) => svc.init()); // Notify renderer that plugins are starting to load BEFORE sending project opened // This prevents race condition where files could be opened before plugins finish loading const pluginCount = Object.keys( - this.#project.projectSettingsService.get('plugins') ?? {} + this.#project.builtinServices.settings.get('plugins') ?? {} ).length; - sender.send(ChannelsRenderer.onPluginsLoadingStart, pluginCount); + sender.send('onPluginsLoadingStart', pluginCount); // Send project opened event - sender.send(ChannelsRenderer.onProjectOpened, projectPath); + sender.send('onProjectOpened', projectPath); this.logger.trace('Project UI ready, loading plugins in background...'); // Load plugins in background (non-blocking) // Pass skipStartMessage=true since we already sent onPluginsLoadingStart above - this.#project.pluginsService.init(true).catch((error) => { + this.#project.builtinServices.plugins.init(true).catch((error) => { this.logger.error(`Failed to initialize plugins: ${error}`); }); } - if (status === IpcResultStatus.ok) { + if (status === 'OK') { this.logger.trace('Project loaded successfully'); } diff --git a/packages/main/src/project/project.ts b/packages/main/src/project/project.ts index 9ad4d74..6207ed7 100644 --- a/packages/main/src/project/project.ts +++ b/packages/main/src/project/project.ts @@ -1,26 +1,10 @@ -import type ProjectWatchService from 'main/services/projectWatchService'; -import type LoggingService from 'main/services/loggingService'; -import type PluginsService from 'main/services/pluginsService'; -import type ProjectSettingsService from 'main/services/projectSettingsService'; -import type ResourceService from 'main/services/resourceService'; -import type CharacterService from 'main/services/characterService'; - import type { ProjectMessageBroker } from './projectMessageBroker'; +import { BuiltinServices } from '../services/types'; export default interface Project { projectPath: string; messageBroker: ProjectMessageBroker; - projectWatchService: ProjectWatchService; - - loggingService: LoggingService; - - pluginsService: PluginsService; - - projectSettingsService: ProjectSettingsService; - - resourceService: ResourceService; - - characterService: CharacterService; + builtinServices: BuiltinServices; } diff --git a/packages/main/src/project/projectLoader/projectLoader.ts b/packages/main/src/project/projectLoader/projectLoader.ts index 0d00ddc..396d11a 100644 --- a/packages/main/src/project/projectLoader/projectLoader.ts +++ b/packages/main/src/project/projectLoader/projectLoader.ts @@ -2,17 +2,17 @@ import { ensureFile } from 'fs-extra'; import { fsUtils, FileLogger } from 'main/utils'; -import { IpcResultStatus } from '@xtory/shared'; - import LoggingService from 'main/services/loggingService'; import ProjectWatchService from 'main/services/projectWatchService'; import PluginsService from 'main/services/pluginsService'; import ProjectSettingsService from 'main/services/projectSettingsService'; import ResourceService from 'main/services/resourceService'; import CharacterService from 'main/services/characterService'; +import VariablesService from 'main/services/variableService'; import LoadProjectResult from './loadProjectResult'; import { ProjectMessageBroker } from '../projectMessageBroker'; +import Project from '../project'; export default async function defaultLoadStrategy( messageBroker: ProjectMessageBroker, @@ -20,7 +20,7 @@ export default async function defaultLoadStrategy( ): Promise { if (!(await fsUtils.exists(projectPath))) { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Failed to open "${projectPath}"`, }; } @@ -30,7 +30,7 @@ export default async function defaultLoadStrategy( if (!settingsExists) { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Given path don't contain a "xtory.json" file!`, }; } @@ -50,7 +50,7 @@ export default async function defaultLoadStrategy( projectSettingsService.init(); } catch (error) { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Failed to load ${settingsPath}, Error: ${error}`, }; } @@ -63,7 +63,7 @@ export default async function defaultLoadStrategy( await logger.init(); } catch (error) { return { - status: IpcResultStatus.error, + status: 'ERROR', errorMessage: `Failed not initialize FileLogger, Xtory can't write logs to file! Error: ${error}`, }; } @@ -79,16 +79,21 @@ export default async function defaultLoadStrategy( const characterService = new CharacterService(projectPath); - const project = { + const variablesService = new VariablesService(projectPath); + + const project: Project = { projectPath, messageBroker, - projectWatchService, - loggingService, - pluginsService, - projectSettingsService, - resourceService, - characterService, + builtinServices: { + watch: projectWatchService, + logger: loggingService, + plugins: pluginsService, + settings: projectSettingsService, + resources: resourceService, + characters: characterService, + variables: variablesService, + }, }; - return { status: IpcResultStatus.ok, project }; + return { status: 'OK', project }; } diff --git a/packages/main/src/project/projectMessageBroker.ts b/packages/main/src/project/projectMessageBroker.ts index f0cd575..87c0784 100644 --- a/packages/main/src/project/projectMessageBroker.ts +++ b/packages/main/src/project/projectMessageBroker.ts @@ -1,4 +1,4 @@ -import { ChannelsRenderer } from '@xtory/shared'; +import type { ChannelsRenderer } from '@xtory/plugin-api'; export type ProjectMessageBroker = ( channel: ChannelsRenderer, diff --git a/packages/main/src/services/characterService/index.ts b/packages/main/src/services/characterService/index.ts index e82ba8c..8ce3ab2 100644 --- a/packages/main/src/services/characterService/index.ts +++ b/packages/main/src/services/characterService/index.ts @@ -3,8 +3,9 @@ import { join } from 'path'; import project from 'main/project'; import type { Character, CharacterMap, CharacterSettings } from '@xtory/shared'; import { v4 as uuidv4 } from 'uuid'; +import type { IService } from 'packages/plugin-api'; -class CharacterService { +class CharacterService implements IService { #charactersPath: string; #charactersMapPath: string; @@ -36,7 +37,22 @@ class CharacterService { // Load existing settings or create default try { const settingsContent = await readFile(this.#settingsPath, 'utf8'); - this.#settings = JSON.parse(settingsContent); + const loadedSettings = JSON.parse(settingsContent); + + // Backward compatibility: ensure new fields have defaults + this.#settings = { + ...loadedSettings, + requiredAttributes: loadedSettings.requiredAttributes.map( + (attr: any) => ({ + ...attr, + inputType: + attr.inputType || + (attr.type === 'boolean' ? 'checkbox' : 'input'), + required: attr.required ?? false, + }) + ), + }; + project.logger.info('Loaded existing character settings', [ 'CharacterService', ]); diff --git a/packages/main/src/services/iService.ts b/packages/main/src/services/iService.ts deleted file mode 100644 index dc43db1..0000000 --- a/packages/main/src/services/iService.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default interface IService { - init(): Promise; -} diff --git a/packages/main/src/services/loggingService/index.ts b/packages/main/src/services/loggingService/index.ts index 004a9d1..e996c0b 100644 --- a/packages/main/src/services/loggingService/index.ts +++ b/packages/main/src/services/loggingService/index.ts @@ -1,13 +1,6 @@ -import { - ChannelsRenderer, - Logger, - LogLevel, - LogMessage, - formatLog, - uuidv4, -} from '@xtory/shared'; +import { Logger, LogLevel, LogMessage, formatLog, uuidv4 } from '@xtory/shared'; import { ProjectMessageBroker } from 'main/project/projectMessageBroker'; -import IService from '../IService'; +import type { IService } from '@xtory/plugin-api'; class LoggingService implements Logger, IService { #logger: Logger; @@ -71,7 +64,7 @@ class LoggingService implements Logger, IService { } #broadcast(logMessage: LogMessage) { - this.#messageBroker(ChannelsRenderer.broadcastLogMessage, logMessage); + this.#messageBroker('broadcastLogMessage', logMessage); } } diff --git a/packages/main/src/services/pluginsService/index.ts b/packages/main/src/services/pluginsService/index.ts index 678d3b7..a3ae3b5 100644 --- a/packages/main/src/services/pluginsService/index.ts +++ b/packages/main/src/services/pluginsService/index.ts @@ -4,25 +4,27 @@ import { ProjectMessageBroker } from 'main/project/projectMessageBroker'; import project from 'main/project'; import { - ChannelsRenderer, LogLevel, FileTypeMap, sanitizePath, tryGetAsync, + isClass, } from '@xtory/shared'; -import { +import type { + FileViewConfig, + FlowViewConfig, PluginConfig, PluginEntry, PluginManifest, -} from '@xtory/shared/types/plugin'; +} from '@xtory/shared'; import { spawn } from 'child_process'; import { ensureDir } from 'fs-extra'; import * as NodePath from 'node:path'; -import { pathToFileURL } from 'node:url'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import type { IService } from 'packages/plugin-api'; import PluginApi, { PLUGIN_API_VERSION } from './pluginApi'; - -import IService from '../IService'; +import type LoggingService from '../loggingService'; class PluginsService implements IService { #messageBroker: ProjectMessageBroker; @@ -35,6 +37,12 @@ class PluginsService implements IService { #fileTypes: FileTypeMap; + #foreignServices: Record = {}; + + getForeignService(name: string): IService | null { + return this.#foreignServices[name] ?? null; + } + constructor(pluginsFolder: string, messageBroker: ProjectMessageBroker) { this.#messageBroker = messageBroker; this.#pluginsFolder = sanitizePath(pluginsFolder); @@ -52,21 +60,18 @@ class PluginsService implements IService { // Notify renderer that plugins are starting to load if (!skipStartMessage) { - this.#messageBroker( - ChannelsRenderer.onPluginsLoadingStart, - pluginCount - ); + this.#messageBroker('onPluginsLoadingStart', pluginCount); } const loadedCount = await this.loadPlugins(); - // Notify renderer that plugins finished loading with actual loaded count - this.#messageBroker( - ChannelsRenderer.onPluginsLoadingComplete, - loadedCount + await Promise.all( + Object.values(this.#foreignServices).map((svc) => svc.init()) ); + // Notify renderer that plugins finished loading with actual loaded count + this.#messageBroker('onPluginsLoadingComplete', loadedCount); return true; } catch { // Notify renderer even on error with 0 loaded - this.#messageBroker(ChannelsRenderer.onPluginsLoadingComplete, 0); + this.#messageBroker('onPluginsLoadingComplete', 0); return false; } } @@ -119,7 +124,7 @@ class PluginsService implements IService { .filter(([, , entry]) => !!entry) .map(([, , entry]) => entry!); - this.#messageBroker(ChannelsRenderer.onLoadPlugins, pluginEntries); + this.#messageBroker('onLoadPlugins', pluginEntries); // Return the count of successfully loaded plugins return pluginEntries.length; @@ -148,7 +153,7 @@ class PluginsService implements IService { const name = pluginPackageJson.name || directoryName; // Validate API version - const pluginApiVersion = pluginPackageJson.yumeApiVersion; + const pluginApiVersion = pluginPackageJson.xtoryApiVersion; if (pluginApiVersion !== PLUGIN_API_VERSION) { project.logger.warning( `Plugin "${name}" uses API version ${pluginApiVersion}, but current API version is ${PLUGIN_API_VERSION}. This may cause compatibility issues.`, @@ -186,86 +191,76 @@ class PluginsService implements IService { const result: FileTypeMap = {}; - // Collect all FlowViews with their plugin key - const allFlowViews: Array<{ pluginKey: string; fv: any }> = []; + // Collect all FileViews with their plugin key + const allFileViews: Array<{ pluginKey: string; fv: FileViewConfig }> = []; Object.entries(plugins).forEach(([key, plug]) => { - plug.flowViews.forEach((fv) => { - allFlowViews.push({ pluginKey: key, fv }); + plug.fileViews.forEach((fv) => { + allFileViews.push({ pluginKey: key, fv }); }); }); - // Separate non-optional and optional FlowViews - const nonOptionalFlowViews = allFlowViews.filter( + // Separate non-optional and optional views + const nonOptionalFlowViews = allFileViews.filter( (item) => !item.fv.optional ); - const optionalFlowViews = allFlowViews.filter((item) => item.fv.optional); + const optionalFileViews = allFileViews.filter((item) => item.fv.optional); - // Process non-optional FlowViews first to register file types - const processFlowView = (pluginKey: string, fv: any) => { + // Process non-optional views first to register file types + const processFileView = (pluginKey: string, fv: FileViewConfig) => { const existing = result[fv.fileType]; if (!existing) { - result[fv.fileType] = { - fileType: fv.fileType, - nodes: [...fv.nodes], - menuItems: [...fv.menuItems], - }; + result[fv.fileType] = { ...fv }; } else { - // merge nodes by type (last plugin wins on conflict) - const mergedNodes = [...existing.nodes]; - fv.nodes.forEach((node: any) => { - const index = mergedNodes.findIndex((n) => n.type === node.type); - if (index === -1) { - mergedNodes.push(node); - } else { - mergedNodes[index] = node; + const mergedFileView = PluginsService.#mergeFileViewConfigs( + existing, + fv, + { + logger: project.logger, + rhsPluginName: pluginKey, } - }); - - const mergedMenuItems = [...existing.menuItems, ...fv.menuItems]; + ); - result[fv.fileType] = { - fileType: fv.fileType, - nodes: mergedNodes, - menuItems: mergedMenuItems, - }; + if (mergedFileView) { + result[fv.fileType] = mergedFileView; + } } fv.menuItems.forEach((menuItem: any) => { const pluginPath = this.#pluginPaths[pluginKey]; const absoluteTemplatePath = NodePath.join(pluginPath, menuItem.data); this.#messageBroker( - ChannelsRenderer.addFileMenuItem, + 'addFileMenuItem', menuItem.title, absoluteTemplatePath ); }); }; - // First, process all non-optional FlowViews + // First, process all non-optional views nonOptionalFlowViews.forEach(({ pluginKey, fv }) => { - processFlowView(pluginKey, fv); + processFileView(pluginKey, fv); }); - // Process optional FlowViews in multiple passes to handle dependency chains + // Process optional views in multiple passes to handle dependency chains // Keep processing until no more optional plugins can be registered - let remainingOptionalFlowViews = [...optionalFlowViews]; + let remainingOptionalFlowViews = [...optionalFileViews]; let previousCount = remainingOptionalFlowViews.length; let maxIterations = 10; // Safety limit to prevent infinite loops while (remainingOptionalFlowViews.length > 0 && maxIterations > 0) { - const stillPending: typeof optionalFlowViews = []; + const stillPending: typeof optionalFileViews = []; remainingOptionalFlowViews.forEach(({ pluginKey, fv }) => { const existing = result[fv.fileType]; - // Skip optional FlowViews if the fileType doesn't exist yet + // Skip optional view if the fileType doesn't exist yet if (!existing) { stillPending.push({ pluginKey, fv }); return; } - processFlowView(pluginKey, fv); + processFileView(pluginKey, fv); }); // If we didn't make any progress, break to avoid infinite loop @@ -400,25 +395,103 @@ class PluginsService implements IService { logger: project.logger, api: new PluginApi(), }; - const script = await (scriptPath.startsWith('file:') - ? readFile(new URL(scriptPath), 'utf8') - : readFile(scriptPath, 'utf8')); + const normalizedScriptPath = scriptPath.startsWith('file:') + ? fileURLToPath(scriptPath) + : scriptPath; - // execute script in private context try { project.logger.trace( - `improting plugin main ${pluginName}(${scriptPath}) ${script}` + `improting plugin main ${pluginName}(${normalizedScriptPath})` ); - // eslint-disable-next-line no-new-func - new Function(`with(this) {\n${script}\n}`).call(context); - const plugin = context.api.build(); + const mod: { default?: unknown } = await import(normalizedScriptPath); + if (typeof mod.default !== 'function') { + throw new Error( + `Invalid main script, it does not have a export default function ${normalizedScriptPath}` + ); + } + await mod.default(context); + const { plugin, services } = context.api.build(); this.#plugins[pluginName] = plugin; this.#pluginPaths[pluginName] = pluginPath; + this.#foreignServices = { + ...this.#foreignServices, + ...Object.fromEntries( + Object.entries(services).map(([key, val]) => [ + key, + isClass(val) + ? new val() // eslint-disable-line new-cap + : val(), + ]) + ), + }; this.#makeFileTypePlugins(); } catch (error) { project.logger.log(LogLevel.error, ['plugin', pluginName], error); } } + + /** + * @returns the merge result or null if merger bails + */ + static #mergeFileViewConfigs( + lhs: FileViewConfig, + rhs: FileViewConfig, + diagnostic: { + logger: LoggingService; + rhsPluginName: string; + } + ): FileViewConfig | null { + if (lhs.fileType !== rhs.fileType) { + diagnostic.logger.error( + `Unexpected attempt at registering 2 different file views for the same file type(${lhs.fileType}), view types ${lhs.viewType} and ${rhs.viewType} are not compatible, skipping the addition of ${diagnostic.rhsPluginName}(${rhs.viewType})`, + ['plugin', diagnostic.rhsPluginName] + ); + + return null; + } + if (lhs.viewType !== rhs.viewType) { + project.logger.warning( + `Unexpected attempt at registering 2 different file views for the same file type(${lhs.fileType}), view types ${lhs.viewType} and ${rhs.viewType} are not compatible`, + ['plugin', diagnostic.rhsPluginName] + ); + return null; + } + // TODO: replace me with lodash merge or a more generalized helper to avoid view specific code here + switch (lhs.viewType) { + case 'flow': { + // merge nodes by type (last one wins on conflict) + let mergeNodeIndex = 0; + const mergedNodes = Object.fromEntries( + (lhs as FlowViewConfig).nodes.map((node) => [ + node.type, + [node, ++mergeNodeIndex] as const, + ]) + ); + (rhs as FlowViewConfig).nodes.forEach((node) => { + const existing = mergedNodes[node.type]; + if (existing) { + mergedNodes[node.type] = [node, existing[1]]; + } else { + mergedNodes[node.type] = [node, ++mergeNodeIndex]; + } + }); + + const mergedMenuItems = [...rhs.menuItems, ...lhs.menuItems]; + + return { + fileType: rhs.fileType, + viewType: 'flow', + nodes: Object.values(mergedNodes) + .sort((a, b) => a[1] - b[1]) + .map((it) => it[0]), + menuItems: mergedMenuItems, + }; + } + + default: + throw new Error(`Invalid view type: ${lhs.viewType}`); + } + } } export default PluginsService; diff --git a/packages/main/src/services/pluginsService/pluginApi.ts b/packages/main/src/services/pluginsService/pluginApi.ts index 97433d3..ad7c156 100644 --- a/packages/main/src/services/pluginsService/pluginApi.ts +++ b/packages/main/src/services/pluginsService/pluginApi.ts @@ -1,18 +1,24 @@ /* eslint-disable max-classes-per-file */ -import { +import type { PluginConfig, FlowViewConfig, - NodeInfo, -} from '@xtory/shared/types/plugin'; + FileViewConfig, +} from '@xtory/shared'; import type { IFileViewBuilder, IFlowViewBuilder, IPluginApi, + NodeInfo, + ServiceProvider, } from '@xtory/plugin-api'; +import project from 'main/project'; + export const PLUGIN_API_VERSION = 1; -export class FileViewBuilder implements IFileViewBuilder { +export abstract class FileViewBuilder + implements IFileViewBuilder +{ protected fileTypes: string[] = []; protected optional: boolean = false; @@ -30,10 +36,12 @@ export class FileViewBuilder implements IFileViewBuilder { this.optional = optional; return this; } + + abstract build(): T; } export class FlowViewBuilder - extends FileViewBuilder + extends FileViewBuilder implements IFlowViewBuilder { protected nodes: NodeInfo[] | null = null; @@ -58,24 +66,45 @@ export class FlowViewBuilder const { optional } = this; // For backward compatibility, use first fileType as primary const fileType = fileTypes.length > 0 ? fileTypes[0] : ''; - return { fileType, nodes: nodes || [], menuItems, optional }; + return { + fileType, + viewType: 'flow', + nodes: nodes || [], + menuItems, + optional, + }; } } export default class PluginBuilder implements IPluginApi { - #flowViews: FlowViewBuilder[] = []; + #fileViews: FileViewBuilder[] = []; + #services: Record = {}; + + // eslint-disable-next-line class-methods-use-this + get projectPath(): string { + return project.path; + } addFileView(type: 'flow'): FlowViewBuilder { - if (type !== 'flow') { - throw new Error(`Unsupported file view type: ${type}`); + switch (type) { + case 'flow': { + const flowView = new FlowViewBuilder(); + this.#fileViews.push(flowView); + return flowView; + } + + default: + throw new Error(`Unsupported file view type: ${type}`); } - const flowView = new FlowViewBuilder(); - this.#flowViews.push(flowView); - return flowView; } - build(): PluginConfig { - const flowViews = this.#flowViews.map((builder) => builder.build()); - return { flowViews }; + addService(name: string, service: ServiceProvider): this { + this.#services[name] = service; + return this; + } + + build(): { plugin: PluginConfig; services: Record } { + const fileViews = this.#fileViews.map((builder) => builder.build()); + return { plugin: { fileViews }, services: this.#services }; } } diff --git a/packages/main/src/services/projectSettingsService/index.ts b/packages/main/src/services/projectSettingsService/index.ts index 511b9a1..5cc79e3 100644 --- a/packages/main/src/services/projectSettingsService/index.ts +++ b/packages/main/src/services/projectSettingsService/index.ts @@ -3,7 +3,7 @@ import { readFile, writeFile } from 'fs/promises'; import project from 'main/project'; import { ProjectMessageBroker } from 'main/project/projectMessageBroker'; -import IService from '../IService'; +import type { IService } from 'packages/plugin-api'; import ProjectWatchService from '../projectWatchService'; export interface PluginConfiguration { diff --git a/packages/main/src/services/projectWatchService/index.ts b/packages/main/src/services/projectWatchService/index.ts index 920e871..d32a3f8 100644 --- a/packages/main/src/services/projectWatchService/index.ts +++ b/packages/main/src/services/projectWatchService/index.ts @@ -2,16 +2,14 @@ import path from 'path'; import { watch, FSWatcher } from 'chokidar'; import { LogLevel, - ChannelsRenderer, ProjectTree, ProjectTreeNode, sanitizePath, } from '@xtory/shared'; +import type { ChannelsRenderer, IService } from '@xtory/plugin-api'; import project from 'main/project'; -import IService from '../IService'; - export type ProjectWatchServiceMessageBroker = ( channel: ChannelsRenderer, ...args: any[] @@ -71,10 +69,7 @@ class ProjectWatchService implements IService { #worker() { if (!this.#isDirty) return; - this.#messageBroker( - ChannelsRenderer.onProjectTreeUpdated, - this.#projectTree - ); + this.#messageBroker('onProjectTreeUpdated', this.#projectTree); this.#isDirty = false; } diff --git a/packages/main/src/services/resourceService/index.ts b/packages/main/src/services/resourceService/index.ts index 749347f..5b46bd7 100644 --- a/packages/main/src/services/resourceService/index.ts +++ b/packages/main/src/services/resourceService/index.ts @@ -3,8 +3,9 @@ import { join, extname, basename } from 'path'; import project from 'main/project'; import type { ResourceMetadata, ResourceMap } from '@xtory/shared'; import { v4 as uuidv4 } from 'uuid'; +import { IService } from 'packages/plugin-api'; -class ResourceService { +class ResourceService implements IService { #resourcesPath: string; #resourcesMapPath: string; diff --git a/packages/main/src/services/types.ts b/packages/main/src/services/types.ts new file mode 100644 index 0000000..611776d --- /dev/null +++ b/packages/main/src/services/types.ts @@ -0,0 +1,23 @@ +import { IService } from '@xtory/plugin-api'; + +import type ProjectWatchService from 'main/services/projectWatchService'; +import type LoggingService from 'main/services/loggingService'; +import type PluginsService from 'main/services/pluginsService'; +import type ProjectSettingsService from 'main/services/projectSettingsService'; +import type ResourceService from 'main/services/resourceService'; +import type CharacterService from 'main/services/characterService'; +import type VariablesService from 'main/services/variableService'; + +export interface BuiltinServices { + watch: ProjectWatchService; + logger: LoggingService; + plugins: PluginsService; + settings: ProjectSettingsService; + resources: ResourceService; + characters: CharacterService; + variables: VariablesService; +} + +export type ServiceType = S extends keyof BuiltinServices + ? BuiltinServices[S] + : IService; diff --git a/packages/main/src/services/variableService/index.ts b/packages/main/src/services/variableService/index.ts new file mode 100644 index 0000000..5cdb304 --- /dev/null +++ b/packages/main/src/services/variableService/index.ts @@ -0,0 +1,119 @@ +import { join } from 'path'; +import { mkdir, readFile, writeFile } from 'fs/promises'; +import type { IService, VariableInfo } from '@xtory/plugin-api'; + +import project from 'main/project'; + +class VariablesService implements IService { + #variablesDir: string; + #variablesFile: string; + + #table: Record = {}; + + constructor(projectPath: string) { + this.#variablesDir = join(projectPath, '.xtory'); + this.#variablesFile = join(this.#variablesDir, 'variables.json'); + } + + async init(): Promise { + try { + project.logger.info('Initializing VariablesService', [ + 'VariablesService', + ]); + + // Ensure .xtory directory exists + await mkdir(this.#variablesDir, { recursive: true }); + + // Load existing variables table or create an empty one + try { + const variablesContent = await readFile(this.#variablesFile, 'utf8'); + const loadedVariables = JSON.parse(variablesContent); + + this.#table = loadedVariables; + } catch { + // File doesn't exist yet, create default file + await this.#save(); + project.logger.info('Created default variables file', [ + 'VariablesService', + ]); + } + + return true; + } catch (error) { + project.logger.error(`Failed to initialize variables service: ${error}`, [ + 'VariablesService', + ]); + return false; + } + } + + getVariables(): Record { + return { ...this.#table }; + } + + addVariable(variable: VariableInfo): Record { + if (variable.name in this.#table) { + throw new Error(`Variable ${variable.name} already exists`); + } + this.#table[variable.name] = variable; + this.#save(); + return this.getVariables(); + } + + /** + * @param oldName - if exists allows renaming operation on the variable info given + */ + updateVariable( + variable: VariableInfo, + oldName?: VariableInfo['name'] + ): Record { + // rename branch + if (oldName && oldName !== variable.name) { + if (!(oldName in this.#table)) { + throw new Error( + `Attempt at updating non-existing variable ${ + oldName ?? variable.name + }` + ); + } + if (variable.name in this.#table) { + throw new Error( + `Attempt at updating the variable name ${oldName} to an already existing name ${variable.name}` + ); + } + // rename variables by removing the old entry and adding a new one + delete this.#table[oldName]; + this.#table[variable.name] = variable; + } else { + if (!(variable.name in this.#table)) { + throw new Error( + `Attempt at updating non-existing variable ${ + oldName ?? variable.name + }` + ); + } + this.#table[variable.name] = variable; + this.#save(); + } + return this.getVariables(); + } + + removeVariable(name: VariableInfo['name']): Record { + if (!(name in this.#table)) { + throw new Error(`Attempt at removing non-existing variable $name}`); + } + delete this.#table[name]; + this.#save(); + return this.getVariables(); + } + + async #save(): Promise { + await writeFile( + this.#variablesFile, + JSON.stringify(this.#table, null, 2), + 'utf8' + ); + } +} + +export default VariablesService; diff --git a/packages/main/src/utils/resolveHtmlPath.ts b/packages/main/src/utils/resolveHtmlPath.ts index 7775eda..ed17d25 100644 --- a/packages/main/src/utils/resolveHtmlPath.ts +++ b/packages/main/src/utils/resolveHtmlPath.ts @@ -2,12 +2,24 @@ import { URL } from 'url'; import path from 'path'; -export function resolveHtmlPath(htmlFileName: string) { +export function resolveHtmlPath( + htmlFileName: string, + data?: Record +) { + const params = data + ? `?${Object.entries(data) + .map(([k, v]) => `${k}=${v}`) + .join('&')}` + : ''; if (process.env.NODE_ENV === 'development') { const port = process.env.PORT || 1212; - const url = new URL(`http://localhost:${port}`); + const url = new URL(`http://localhost:${port}${params}`); url.pathname = htmlFileName; return url.href; } - return `file://${path.resolve(__dirname, '../renderer/', htmlFileName)}`; + return `file://${path.resolve( + __dirname, + '../renderer/', + htmlFileName + )}${params}`; } diff --git a/packages/main/tsconfig.json b/packages/main/tsconfig.json index 3647aeb..90d76d7 100644 --- a/packages/main/tsconfig.json +++ b/packages/main/tsconfig.json @@ -4,6 +4,5 @@ "outDir": "./dist", "rootDir": "./src" }, - "include": ["src/**/*"], - "references": [{ "path": "../shared" }] + "include": ["src/**/*"] } diff --git a/packages/main/tsconfig.tsbuildinfo b/packages/main/tsconfig.tsbuildinfo new file mode 100644 index 0000000..0d41c55 --- /dev/null +++ b/packages/main/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/@types/react/ts5.0/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/ts5.0/index.d.ts","../../node_modules/@types/react/ts5.0/jsx-runtime.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/electron/electron.d.ts","./src/constants.ts","../plugin-api/common.d.ts","../plugin-api/index.d.ts","../../node_modules/builder-util-runtime/out/cancellationtoken.d.ts","../../node_modules/builder-util-runtime/out/progresscallbacktransform.d.ts","../../node_modules/builder-util-runtime/out/httpexecutor.d.ts","../../node_modules/builder-util-runtime/out/publishoptions.d.ts","../../node_modules/builder-util-runtime/out/updateinfo.d.ts","../../node_modules/builder-util-runtime/out/rfc2253parser.d.ts","../../node_modules/builder-util-runtime/out/uuid.d.ts","../../node_modules/builder-util-runtime/out/xml.d.ts","../../node_modules/builder-util-runtime/out/blockmapapi.d.ts","../../node_modules/builder-util-runtime/out/index.d.ts","../../node_modules/lazy-val/out/main.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/electron-updater/out/appadapter.d.ts","../../node_modules/electron-updater/out/downloadedupdatehelper.d.ts","../../node_modules/electron-updater/out/electronhttpexecutor.d.ts","../../node_modules/electron-updater/out/providers/provider.d.ts","../../node_modules/typed-emitter/index.d.ts","../../node_modules/electron-updater/out/appupdater.d.ts","../../node_modules/electron-updater/out/baseupdater.d.ts","../../node_modules/electron-updater/out/appimageupdater.d.ts","../../node_modules/electron-updater/out/macupdater.d.ts","../../node_modules/electron-updater/out/nsisupdater.d.ts","../../node_modules/electron-updater/out/main.d.ts","../../node_modules/electron-log/src/index.d.ts","./src/menu.ts","./src/utils/resolvehtmlpath.ts","./src/utils/fsutils/exists.ts","./src/utils/paths.ts","../shared/dist/types/platform.d.ts","../shared/dist/types/newprojectmodel.d.ts","../shared/dist/types/createnewprojectresult.d.ts","../shared/dist/types/browsefilesystemresult.d.ts","../shared/dist/types/openprojectresult.d.ts","../shared/dist/types/projecttree.d.ts","../shared/dist/types/plugin/pluginconfig.d.ts","../shared/dist/types/plugin/pluginmanifest.d.ts","../shared/dist/types/plugin/pluginsbatch.d.ts","../shared/dist/types/plugin/index.d.ts","../shared/dist/types/filetypemap.d.ts","../shared/dist/types/loglevel.d.ts","../shared/dist/types/logger.d.ts","../shared/dist/types/logmessage.d.ts","../shared/dist/types/resource.d.ts","../shared/dist/types/character.d.ts","../shared/dist/types/conversation.d.ts","../shared/dist/types/index.d.ts","../shared/dist/utils.d.ts","../shared/dist/index.d.ts","./src/utils/filelogger.ts","./src/utils/index.ts","./src/windowmanager.ts","./src/project/projectmessagebroker.ts","./src/services/loggingservice/index.ts","../../node_modules/@types/jsonfile/index.d.ts","../../node_modules/@types/jsonfile/utils.d.ts","../../node_modules/@types/fs-extra/index.d.ts","./src/services/pluginsservice/pluginapi.ts","./src/services/pluginsservice/index.ts","../../node_modules/@types/uuid/index.d.ts","./src/services/resourceservice/index.ts","./src/services/characterservice/index.ts","./src/services/variableservice/index.ts","../../node_modules/anymatch/index.d.ts","../../node_modules/chokidar/types/index.d.ts","./src/services/projectwatchservice/index.ts","./src/services/projectsettingsservice/index.ts","./src/services/types.ts","./src/project/project.ts","./src/project/projectloader/loadprojectresult.ts","./src/project/projectloader/projectloadertype.ts","./src/project/projectloader/projectloader.ts","./src/project/projectloader/index.ts","./src/project/index.ts","./src/ipc/actions/fsmove.ts","../../node_modules/rimraf/node_modules/minipass/index.d.ts","../../node_modules/path-scurry/node_modules/lru-cache/dist/cjs/index.d.ts","../../node_modules/path-scurry/node_modules/minipass/dist/commonjs/index.d.ts","../../node_modules/path-scurry/dist/cjs/index.d.ts","../../node_modules/rimraf/node_modules/minimatch/dist/cjs/ast.d.ts","../../node_modules/rimraf/node_modules/minimatch/dist/cjs/escape.d.ts","../../node_modules/rimraf/node_modules/minimatch/dist/cjs/unescape.d.ts","../../node_modules/rimraf/node_modules/minimatch/dist/cjs/index.d.ts","../../node_modules/rimraf/node_modules/glob/dist/mjs/pattern.d.ts","../../node_modules/rimraf/node_modules/glob/dist/mjs/processor.d.ts","../../node_modules/rimraf/node_modules/glob/dist/mjs/walker.d.ts","../../node_modules/rimraf/node_modules/glob/dist/mjs/ignore.d.ts","../../node_modules/rimraf/node_modules/glob/dist/mjs/glob.d.ts","../../node_modules/rimraf/node_modules/glob/dist/mjs/has-magic.d.ts","../../node_modules/rimraf/node_modules/glob/dist/mjs/index.d.ts","../../node_modules/rimraf/dist/mjs/index.d.ts","./src/ipc/actions/fsremove.ts","./src/ipc/actions/openfileastab.ts","./src/ipc/actions/revealpathinos.ts","./src/ipc/actions/logmessage.ts","./src/ipc/invokes/browsefilesystem.ts","./src/ipc/invokes/createnewproject.ts","./src/ipc/invokes/fspexists.ts","./src/ipc/invokes/fspmkdir.ts","./src/ipc/invokes/fspwritefile.ts","./src/ipc/invokes/getxtorytemplates.ts","./src/ipc/invokes/getfiletypes.ts","./src/ipc/invokes/openproject.ts","./src/ipc/invokes/selectimagefile.ts","./src/ipc/invokes/importresource.ts","./src/ipc/invokes/getresources.ts","./src/ipc/invokes/updateresourcemetadata.ts","./src/ipc/invokes/removeresource.ts","./src/ipc/invokes/getpluginconfig.ts","./src/ipc/invokes/updatepluginconfig.ts","./src/ipc/invokes/updatepluginenabled.ts","./src/ipc/invokes/restartapp.ts","./src/ipc/invokes/getcharacters.ts","./src/ipc/invokes/createcharacter.ts","./src/ipc/invokes/updatecharacter.ts","./src/ipc/invokes/removecharacter.ts","./src/ipc/invokes/getcharactersettings.ts","./src/ipc/invokes/updatecharactersettings.ts","./src/ipc/invokes/servicecall.ts","./src/ipc/index.ts","./src/main.ts","../../node_modules/@mui/types/index.d.ts","../../node_modules/@mui/material/styles/identifier.d.ts","../../node_modules/@emotion/sheet/dist/declarations/src/index.d.ts","../../node_modules/@emotion/sheet/dist/emotion-sheet.cjs.d.ts","../../node_modules/@emotion/utils/dist/declarations/src/types.d.ts","../../node_modules/@emotion/utils/dist/declarations/src/index.d.ts","../../node_modules/@emotion/utils/dist/emotion-utils.cjs.d.ts","../../node_modules/@emotion/cache/dist/declarations/src/types.d.ts","../../node_modules/@emotion/cache/dist/declarations/src/index.d.ts","../../node_modules/@emotion/cache/dist/emotion-cache.cjs.d.ts","../../node_modules/@emotion/serialize/dist/declarations/src/index.d.ts","../../node_modules/@emotion/serialize/dist/emotion-serialize.cjs.d.ts","../../node_modules/@emotion/react/types/jsx-namespace.d.ts","../../node_modules/@emotion/react/types/helper.d.ts","../../node_modules/@emotion/react/types/theming.d.ts","../../node_modules/@emotion/react/types/index.d.ts","../../node_modules/@emotion/styled/types/base.d.ts","../../node_modules/@emotion/styled/types/index.d.ts","../../node_modules/@mui/styled-engine/styledengineprovider/styledengineprovider.d.ts","../../node_modules/@mui/styled-engine/styledengineprovider/index.d.ts","../../node_modules/@mui/styled-engine/globalstyles/globalstyles.d.ts","../../node_modules/@mui/styled-engine/globalstyles/index.d.ts","../../node_modules/@mui/styled-engine/index.d.ts","../../node_modules/@mui/system/createtheme/createbreakpoints.d.ts","../../node_modules/@mui/system/createtheme/shape.d.ts","../../node_modules/@mui/system/createtheme/createspacing.d.ts","../../node_modules/@mui/system/stylefunctionsx/standardcssproperties.d.ts","../../node_modules/@mui/system/stylefunctionsx/aliasescssproperties.d.ts","../../node_modules/@mui/system/stylefunctionsx/overwritecssproperties.d.ts","../../node_modules/@mui/system/stylefunctionsx/stylefunctionsx.d.ts","../../node_modules/@mui/system/stylefunctionsx/extendsxprop.d.ts","../../node_modules/@mui/system/style.d.ts","../../node_modules/@mui/system/stylefunctionsx/defaultsxconfig.d.ts","../../node_modules/@mui/system/stylefunctionsx/index.d.ts","../../node_modules/@mui/system/createtheme/applystyles.d.ts","../../node_modules/@mui/system/createtheme/createtheme.d.ts","../../node_modules/@mui/system/createtheme/index.d.ts","../../node_modules/@mui/system/box/box.d.ts","../../node_modules/@mui/system/box/boxclasses.d.ts","../../node_modules/@mui/system/box/index.d.ts","../../node_modules/@mui/system/breakpoints.d.ts","../../node_modules/@mui/private-theming/defaulttheme/index.d.ts","../../node_modules/@mui/private-theming/themeprovider/themeprovider.d.ts","../../node_modules/@mui/private-theming/themeprovider/index.d.ts","../../node_modules/@mui/private-theming/usetheme/usetheme.d.ts","../../node_modules/@mui/private-theming/usetheme/index.d.ts","../../node_modules/@mui/private-theming/index.d.ts","../../node_modules/@mui/system/globalstyles/globalstyles.d.ts","../../node_modules/@mui/system/globalstyles/index.d.ts","../../node_modules/@mui/system/spacing.d.ts","../../node_modules/@mui/system/createbox.d.ts","../../node_modules/@mui/system/createstyled.d.ts","../../node_modules/@mui/system/styled.d.ts","../../node_modules/@mui/system/usethemeprops/usethemeprops.d.ts","../../node_modules/@mui/system/usethemeprops/getthemeprops.d.ts","../../node_modules/@mui/system/usethemeprops/index.d.ts","../../node_modules/@mui/system/usetheme.d.ts","../../node_modules/@mui/system/usethemewithoutdefault.d.ts","../../node_modules/@mui/system/usemediaquery/usemediaquery.d.ts","../../node_modules/@mui/system/usemediaquery/index.d.ts","../../node_modules/@mui/system/colormanipulator.d.ts","../../node_modules/@mui/system/themeprovider/themeprovider.d.ts","../../node_modules/@mui/system/themeprovider/index.d.ts","../../node_modules/@mui/system/initcolorschemescript/initcolorschemescript.d.ts","../../node_modules/@mui/system/initcolorschemescript/index.d.ts","../../node_modules/@mui/system/cssvars/usecurrentcolorscheme.d.ts","../../node_modules/@mui/system/cssvars/createcssvarsprovider.d.ts","../../node_modules/@mui/system/cssvars/getinitcolorschemescript.d.ts","../../node_modules/@mui/system/cssvars/preparecssvars.d.ts","../../node_modules/@mui/system/cssvars/createcssvarstheme.d.ts","../../node_modules/@mui/system/cssvars/index.d.ts","../../node_modules/@mui/system/cssvars/creategetcssvar.d.ts","../../node_modules/@mui/system/cssvars/cssvarsparser.d.ts","../../node_modules/@mui/system/responsiveproptype.d.ts","../../node_modules/@mui/system/container/containerclasses.d.ts","../../node_modules/@mui/system/container/containerprops.d.ts","../../node_modules/@mui/system/container/createcontainer.d.ts","../../node_modules/@mui/system/container/container.d.ts","../../node_modules/@mui/system/container/index.d.ts","../../node_modules/@mui/system/unstable_grid/gridprops.d.ts","../../node_modules/@mui/system/unstable_grid/grid.d.ts","../../node_modules/@mui/system/unstable_grid/creategrid.d.ts","../../node_modules/@mui/system/unstable_grid/gridclasses.d.ts","../../node_modules/@mui/system/unstable_grid/traversebreakpoints.d.ts","../../node_modules/@mui/system/unstable_grid/index.d.ts","../../node_modules/@mui/system/stack/stackprops.d.ts","../../node_modules/@mui/system/stack/stack.d.ts","../../node_modules/@mui/system/stack/createstack.d.ts","../../node_modules/@mui/system/stack/stackclasses.d.ts","../../node_modules/@mui/system/stack/index.d.ts","../../node_modules/@mui/system/version/index.d.ts","../../node_modules/@mui/system/index.d.ts","../../node_modules/@mui/material/styles/createmixins.d.ts","../../node_modules/@mui/material/styles/createpalette.d.ts","../../node_modules/@mui/material/styles/createtypography.d.ts","../../node_modules/@mui/material/styles/shadows.d.ts","../../node_modules/@mui/material/styles/createtransitions.d.ts","../../node_modules/@mui/material/styles/zindex.d.ts","../../node_modules/@mui/material/overridablecomponent.d.ts","../../node_modules/@mui/material/paper/paperclasses.d.ts","../../node_modules/@mui/material/paper/paper.d.ts","../../node_modules/@mui/material/paper/index.d.ts","../../node_modules/@mui/material/alert/alertclasses.d.ts","../../node_modules/@mui/utils/chainproptypes/chainproptypes.d.ts","../../node_modules/@mui/utils/chainproptypes/index.d.ts","../../node_modules/@mui/utils/deepmerge/deepmerge.d.ts","../../node_modules/@mui/utils/deepmerge/index.d.ts","../../node_modules/@mui/utils/elementacceptingref/elementacceptingref.d.ts","../../node_modules/@mui/utils/elementacceptingref/index.d.ts","../../node_modules/@mui/utils/elementtypeacceptingref/elementtypeacceptingref.d.ts","../../node_modules/@mui/utils/elementtypeacceptingref/index.d.ts","../../node_modules/@mui/utils/exactprop/exactprop.d.ts","../../node_modules/@mui/utils/exactprop/index.d.ts","../../node_modules/@mui/utils/formatmuierrormessage/formatmuierrormessage.d.ts","../../node_modules/@mui/utils/formatmuierrormessage/index.d.ts","../../node_modules/@mui/utils/getdisplayname/getdisplayname.d.ts","../../node_modules/@mui/utils/getdisplayname/index.d.ts","../../node_modules/@mui/utils/htmlelementtype/htmlelementtype.d.ts","../../node_modules/@mui/utils/htmlelementtype/index.d.ts","../../node_modules/@mui/utils/ponyfillglobal/ponyfillglobal.d.ts","../../node_modules/@mui/utils/ponyfillglobal/index.d.ts","../../node_modules/@mui/utils/reftype/reftype.d.ts","../../node_modules/@mui/utils/reftype/index.d.ts","../../node_modules/@mui/utils/capitalize/capitalize.d.ts","../../node_modules/@mui/utils/capitalize/index.d.ts","../../node_modules/@mui/utils/createchainedfunction/createchainedfunction.d.ts","../../node_modules/@mui/utils/createchainedfunction/index.d.ts","../../node_modules/@mui/utils/debounce/debounce.d.ts","../../node_modules/@mui/utils/debounce/index.d.ts","../../node_modules/@mui/utils/deprecatedproptype/deprecatedproptype.d.ts","../../node_modules/@mui/utils/deprecatedproptype/index.d.ts","../../node_modules/@mui/utils/ismuielement/ismuielement.d.ts","../../node_modules/@mui/utils/ismuielement/index.d.ts","../../node_modules/@mui/utils/ownerdocument/ownerdocument.d.ts","../../node_modules/@mui/utils/ownerdocument/index.d.ts","../../node_modules/@mui/utils/ownerwindow/ownerwindow.d.ts","../../node_modules/@mui/utils/ownerwindow/index.d.ts","../../node_modules/@mui/utils/requirepropfactory/requirepropfactory.d.ts","../../node_modules/@mui/utils/requirepropfactory/index.d.ts","../../node_modules/@mui/utils/setref/setref.d.ts","../../node_modules/@mui/utils/setref/index.d.ts","../../node_modules/@mui/utils/useenhancedeffect/useenhancedeffect.d.ts","../../node_modules/@mui/utils/useenhancedeffect/index.d.ts","../../node_modules/@mui/utils/useid/useid.d.ts","../../node_modules/@mui/utils/useid/index.d.ts","../../node_modules/@mui/utils/unsupportedprop/unsupportedprop.d.ts","../../node_modules/@mui/utils/unsupportedprop/index.d.ts","../../node_modules/@mui/utils/usecontrolled/usecontrolled.d.ts","../../node_modules/@mui/utils/usecontrolled/index.d.ts","../../node_modules/@mui/utils/useeventcallback/useeventcallback.d.ts","../../node_modules/@mui/utils/useeventcallback/index.d.ts","../../node_modules/@mui/utils/useforkref/useforkref.d.ts","../../node_modules/@mui/utils/useforkref/index.d.ts","../../node_modules/@mui/utils/uselazyref/uselazyref.d.ts","../../node_modules/@mui/utils/uselazyref/index.d.ts","../../node_modules/@mui/utils/usetimeout/usetimeout.d.ts","../../node_modules/@mui/utils/usetimeout/index.d.ts","../../node_modules/@mui/utils/useonmount/useonmount.d.ts","../../node_modules/@mui/utils/useonmount/index.d.ts","../../node_modules/@mui/utils/useisfocusvisible/useisfocusvisible.d.ts","../../node_modules/@mui/utils/useisfocusvisible/index.d.ts","../../node_modules/@mui/utils/getscrollbarsize/getscrollbarsize.d.ts","../../node_modules/@mui/utils/getscrollbarsize/index.d.ts","../../node_modules/@mui/utils/scrollleft/scrollleft.d.ts","../../node_modules/@mui/utils/scrollleft/index.d.ts","../../node_modules/@mui/utils/usepreviousprops/usepreviousprops.d.ts","../../node_modules/@mui/utils/usepreviousprops/index.d.ts","../../node_modules/@mui/utils/getvalidreactchildren/getvalidreactchildren.d.ts","../../node_modules/@mui/utils/getvalidreactchildren/index.d.ts","../../node_modules/@mui/utils/visuallyhidden/visuallyhidden.d.ts","../../node_modules/@mui/utils/visuallyhidden/index.d.ts","../../node_modules/@mui/utils/integerproptype/integerproptype.d.ts","../../node_modules/@mui/utils/integerproptype/index.d.ts","../../node_modules/@mui/utils/resolveprops/resolveprops.d.ts","../../node_modules/@mui/utils/resolveprops/index.d.ts","../../node_modules/@mui/utils/composeclasses/composeclasses.d.ts","../../node_modules/@mui/utils/composeclasses/index.d.ts","../../node_modules/@mui/utils/generateutilityclass/generateutilityclass.d.ts","../../node_modules/@mui/utils/generateutilityclass/index.d.ts","../../node_modules/@mui/utils/generateutilityclasses/generateutilityclasses.d.ts","../../node_modules/@mui/utils/generateutilityclasses/index.d.ts","../../node_modules/@mui/utils/classnamegenerator/classnamegenerator.d.ts","../../node_modules/@mui/utils/classnamegenerator/index.d.ts","../../node_modules/@mui/utils/clamp/clamp.d.ts","../../node_modules/@mui/utils/clamp/index.d.ts","../../node_modules/@mui/utils/appendownerstate/appendownerstate.d.ts","../../node_modules/@mui/utils/appendownerstate/index.d.ts","../../node_modules/@mui/utils/node_modules/clsx/clsx.d.ts","../../node_modules/@mui/utils/types.d.ts","../../node_modules/@mui/utils/mergeslotprops/mergeslotprops.d.ts","../../node_modules/@mui/utils/mergeslotprops/index.d.ts","../../node_modules/@mui/utils/useslotprops/useslotprops.d.ts","../../node_modules/@mui/utils/useslotprops/index.d.ts","../../node_modules/@mui/utils/resolvecomponentprops/resolvecomponentprops.d.ts","../../node_modules/@mui/utils/resolvecomponentprops/index.d.ts","../../node_modules/@mui/utils/extracteventhandlers/extracteventhandlers.d.ts","../../node_modules/@mui/utils/extracteventhandlers/index.d.ts","../../node_modules/@mui/utils/getreactelementref/getreactelementref.d.ts","../../node_modules/@mui/utils/getreactelementref/index.d.ts","../../node_modules/@mui/utils/index.d.ts","../../node_modules/@mui/material/utils/types.d.ts","../../node_modules/@mui/material/alert/alert.d.ts","../../node_modules/@mui/material/alert/index.d.ts","../../node_modules/@mui/material/alerttitle/alerttitleclasses.d.ts","../../node_modules/@mui/material/alerttitle/alerttitle.d.ts","../../node_modules/@mui/material/alerttitle/index.d.ts","../../node_modules/@mui/material/appbar/appbarclasses.d.ts","../../node_modules/@mui/material/appbar/appbar.d.ts","../../node_modules/@mui/material/appbar/index.d.ts","../../node_modules/@mui/material/chip/chipclasses.d.ts","../../node_modules/@mui/material/chip/chip.d.ts","../../node_modules/@mui/material/chip/index.d.ts","../../node_modules/@popperjs/core/lib/enums.d.ts","../../node_modules/@popperjs/core/lib/modifiers/popperoffsets.d.ts","../../node_modules/@popperjs/core/lib/modifiers/flip.d.ts","../../node_modules/@popperjs/core/lib/modifiers/hide.d.ts","../../node_modules/@popperjs/core/lib/modifiers/offset.d.ts","../../node_modules/@popperjs/core/lib/modifiers/eventlisteners.d.ts","../../node_modules/@popperjs/core/lib/modifiers/computestyles.d.ts","../../node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","../../node_modules/@popperjs/core/lib/modifiers/preventoverflow.d.ts","../../node_modules/@popperjs/core/lib/modifiers/applystyles.d.ts","../../node_modules/@popperjs/core/lib/types.d.ts","../../node_modules/@popperjs/core/lib/modifiers/index.d.ts","../../node_modules/@popperjs/core/lib/utils/detectoverflow.d.ts","../../node_modules/@popperjs/core/lib/createpopper.d.ts","../../node_modules/@popperjs/core/lib/popper-lite.d.ts","../../node_modules/@popperjs/core/lib/popper.d.ts","../../node_modules/@popperjs/core/lib/index.d.ts","../../node_modules/@popperjs/core/index.d.ts","../../node_modules/@mui/material/portal/portal.types.d.ts","../../node_modules/@mui/material/portal/portal.d.ts","../../node_modules/@mui/material/portal/index.d.ts","../../node_modules/@mui/material/utils/polymorphiccomponent.d.ts","../../node_modules/@mui/material/popper/basepopper.types.d.ts","../../node_modules/@mui/material/popper/popper.d.ts","../../node_modules/@mui/material/popper/popperclasses.d.ts","../../node_modules/@mui/material/popper/index.d.ts","../../node_modules/@mui/material/useautocomplete/useautocomplete.d.ts","../../node_modules/@mui/material/useautocomplete/index.d.ts","../../node_modules/@mui/material/autocomplete/autocompleteclasses.d.ts","../../node_modules/@mui/material/autocomplete/autocomplete.d.ts","../../node_modules/@mui/material/autocomplete/index.d.ts","../../node_modules/@mui/material/avatar/avatarclasses.d.ts","../../node_modules/@mui/material/avatar/avatar.d.ts","../../node_modules/@mui/material/avatar/index.d.ts","../../node_modules/@mui/material/avatargroup/avatargroupclasses.d.ts","../../node_modules/@mui/material/avatargroup/avatargroup.d.ts","../../node_modules/@mui/material/avatargroup/index.d.ts","../../node_modules/@types/react-transition-group/transition.d.ts","../../node_modules/@mui/material/transitions/transition.d.ts","../../node_modules/@mui/material/fade/fade.d.ts","../../node_modules/@mui/material/fade/index.d.ts","../../node_modules/@mui/material/backdrop/backdropclasses.d.ts","../../node_modules/@mui/material/backdrop/backdrop.d.ts","../../node_modules/@mui/material/backdrop/index.d.ts","../../node_modules/@mui/material/badge/badgeclasses.d.ts","../../node_modules/@mui/material/badge/badge.d.ts","../../node_modules/@mui/material/badge/index.d.ts","../../node_modules/@mui/material/buttonbase/touchrippleclasses.d.ts","../../node_modules/@mui/material/buttonbase/touchripple.d.ts","../../node_modules/@mui/material/buttonbase/buttonbaseclasses.d.ts","../../node_modules/@mui/material/buttonbase/buttonbase.d.ts","../../node_modules/@mui/material/buttonbase/index.d.ts","../../node_modules/@mui/material/bottomnavigationaction/bottomnavigationactionclasses.d.ts","../../node_modules/@mui/material/bottomnavigationaction/bottomnavigationaction.d.ts","../../node_modules/@mui/material/bottomnavigationaction/index.d.ts","../../node_modules/@mui/material/bottomnavigation/bottomnavigationclasses.d.ts","../../node_modules/@mui/material/bottomnavigation/bottomnavigation.d.ts","../../node_modules/@mui/material/bottomnavigation/index.d.ts","../../node_modules/@mui/material/breadcrumbs/breadcrumbsclasses.d.ts","../../node_modules/@mui/material/svgicon/svgiconclasses.d.ts","../../node_modules/@mui/material/svgicon/svgicon.d.ts","../../node_modules/@mui/material/svgicon/index.d.ts","../../node_modules/@mui/material/breadcrumbs/breadcrumbs.d.ts","../../node_modules/@mui/material/breadcrumbs/index.d.ts","../../node_modules/@mui/material/buttongroup/buttongroupclasses.d.ts","../../node_modules/@mui/material/buttongroup/buttongroup.d.ts","../../node_modules/@mui/material/buttongroup/buttongroupcontext.d.ts","../../node_modules/@mui/material/buttongroup/buttongroupbuttoncontext.d.ts","../../node_modules/@mui/material/buttongroup/index.d.ts","../../node_modules/@mui/material/button/buttonclasses.d.ts","../../node_modules/@mui/material/button/button.d.ts","../../node_modules/@mui/material/button/index.d.ts","../../node_modules/@mui/material/cardactionarea/cardactionareaclasses.d.ts","../../node_modules/@mui/material/cardactionarea/cardactionarea.d.ts","../../node_modules/@mui/material/cardactionarea/index.d.ts","../../node_modules/@mui/material/cardactions/cardactionsclasses.d.ts","../../node_modules/@mui/material/cardactions/cardactions.d.ts","../../node_modules/@mui/material/cardactions/index.d.ts","../../node_modules/@mui/material/cardcontent/cardcontentclasses.d.ts","../../node_modules/@mui/material/cardcontent/cardcontent.d.ts","../../node_modules/@mui/material/cardcontent/index.d.ts","../../node_modules/@mui/material/typography/typographyclasses.d.ts","../../node_modules/@mui/material/typography/typography.d.ts","../../node_modules/@mui/material/typography/index.d.ts","../../node_modules/@mui/material/cardheader/cardheaderclasses.d.ts","../../node_modules/@mui/material/cardheader/cardheader.d.ts","../../node_modules/@mui/material/cardheader/index.d.ts","../../node_modules/@mui/material/cardmedia/cardmediaclasses.d.ts","../../node_modules/@mui/material/cardmedia/cardmedia.d.ts","../../node_modules/@mui/material/cardmedia/index.d.ts","../../node_modules/@mui/material/card/cardclasses.d.ts","../../node_modules/@mui/material/card/card.d.ts","../../node_modules/@mui/material/card/index.d.ts","../../node_modules/@mui/material/internal/switchbaseclasses.d.ts","../../node_modules/@mui/material/internal/switchbase.d.ts","../../node_modules/@mui/material/checkbox/checkboxclasses.d.ts","../../node_modules/@mui/material/checkbox/checkbox.d.ts","../../node_modules/@mui/material/checkbox/index.d.ts","../../node_modules/@mui/material/circularprogress/circularprogressclasses.d.ts","../../node_modules/@mui/material/circularprogress/circularprogress.d.ts","../../node_modules/@mui/material/circularprogress/index.d.ts","../../node_modules/@mui/material/collapse/collapseclasses.d.ts","../../node_modules/@mui/material/collapse/collapse.d.ts","../../node_modules/@mui/material/collapse/index.d.ts","../../node_modules/@mui/material/container/containerclasses.d.ts","../../node_modules/@mui/material/container/container.d.ts","../../node_modules/@mui/material/container/index.d.ts","../../node_modules/@mui/material/cssbaseline/cssbaseline.d.ts","../../node_modules/@mui/material/cssbaseline/index.d.ts","../../node_modules/@mui/material/dialogactions/dialogactionsclasses.d.ts","../../node_modules/@mui/material/dialogactions/dialogactions.d.ts","../../node_modules/@mui/material/dialogactions/index.d.ts","../../node_modules/@mui/material/dialogcontent/dialogcontentclasses.d.ts","../../node_modules/@mui/material/dialogcontent/dialogcontent.d.ts","../../node_modules/@mui/material/dialogcontent/index.d.ts","../../node_modules/@mui/material/dialogcontenttext/dialogcontenttextclasses.d.ts","../../node_modules/@mui/material/dialogcontenttext/dialogcontenttext.d.ts","../../node_modules/@mui/material/dialogcontenttext/index.d.ts","../../node_modules/@mui/material/modal/modalmanager.d.ts","../../node_modules/@mui/material/modal/modalclasses.d.ts","../../node_modules/@mui/material/modal/modal.d.ts","../../node_modules/@mui/material/modal/index.d.ts","../../node_modules/@mui/material/dialog/dialogclasses.d.ts","../../node_modules/@mui/material/dialog/dialog.d.ts","../../node_modules/@mui/material/dialog/index.d.ts","../../node_modules/@mui/material/dialogtitle/dialogtitleclasses.d.ts","../../node_modules/@mui/material/dialogtitle/dialogtitle.d.ts","../../node_modules/@mui/material/dialogtitle/index.d.ts","../../node_modules/@mui/material/divider/dividerclasses.d.ts","../../node_modules/@mui/material/divider/divider.d.ts","../../node_modules/@mui/material/divider/index.d.ts","../../node_modules/@mui/material/slide/slide.d.ts","../../node_modules/@mui/material/slide/index.d.ts","../../node_modules/@mui/material/drawer/drawerclasses.d.ts","../../node_modules/@mui/material/drawer/drawer.d.ts","../../node_modules/@mui/material/drawer/index.d.ts","../../node_modules/@mui/material/accordionactions/accordionactionsclasses.d.ts","../../node_modules/@mui/material/accordionactions/accordionactions.d.ts","../../node_modules/@mui/material/accordionactions/index.d.ts","../../node_modules/@mui/material/accordiondetails/accordiondetailsclasses.d.ts","../../node_modules/@mui/material/accordiondetails/accordiondetails.d.ts","../../node_modules/@mui/material/accordiondetails/index.d.ts","../../node_modules/@mui/material/accordion/accordionclasses.d.ts","../../node_modules/@mui/material/accordion/accordion.d.ts","../../node_modules/@mui/material/accordion/index.d.ts","../../node_modules/@mui/material/accordionsummary/accordionsummaryclasses.d.ts","../../node_modules/@mui/material/accordionsummary/accordionsummary.d.ts","../../node_modules/@mui/material/accordionsummary/index.d.ts","../../node_modules/@mui/material/fab/fabclasses.d.ts","../../node_modules/@mui/material/fab/fab.d.ts","../../node_modules/@mui/material/fab/index.d.ts","../../node_modules/@mui/material/inputbase/inputbaseclasses.d.ts","../../node_modules/@mui/material/inputbase/inputbase.d.ts","../../node_modules/@mui/material/inputbase/index.d.ts","../../node_modules/@mui/material/filledinput/filledinputclasses.d.ts","../../node_modules/@mui/material/filledinput/filledinput.d.ts","../../node_modules/@mui/material/filledinput/index.d.ts","../../node_modules/@mui/material/formcontrollabel/formcontrollabelclasses.d.ts","../../node_modules/@mui/material/formcontrollabel/formcontrollabel.d.ts","../../node_modules/@mui/material/formcontrollabel/index.d.ts","../../node_modules/@mui/material/formcontrol/formcontrolclasses.d.ts","../../node_modules/@mui/material/formcontrol/formcontrol.d.ts","../../node_modules/@mui/material/formcontrol/formcontrolcontext.d.ts","../../node_modules/@mui/material/formcontrol/useformcontrol.d.ts","../../node_modules/@mui/material/formcontrol/index.d.ts","../../node_modules/@mui/material/formgroup/formgroupclasses.d.ts","../../node_modules/@mui/material/formgroup/formgroup.d.ts","../../node_modules/@mui/material/formgroup/index.d.ts","../../node_modules/@mui/material/formhelpertext/formhelpertextclasses.d.ts","../../node_modules/@mui/material/formhelpertext/formhelpertext.d.ts","../../node_modules/@mui/material/formhelpertext/index.d.ts","../../node_modules/@mui/material/formlabel/formlabelclasses.d.ts","../../node_modules/@mui/material/formlabel/formlabel.d.ts","../../node_modules/@mui/material/formlabel/index.d.ts","../../node_modules/@mui/material/grid/gridclasses.d.ts","../../node_modules/@mui/material/grid/grid.d.ts","../../node_modules/@mui/material/grid/index.d.ts","../../node_modules/@mui/material/unstable_grid2/grid2props.d.ts","../../node_modules/@mui/material/unstable_grid2/grid2.d.ts","../../node_modules/@mui/material/unstable_grid2/grid2classes.d.ts","../../node_modules/@mui/material/unstable_grid2/index.d.ts","../../node_modules/@mui/material/iconbutton/iconbuttonclasses.d.ts","../../node_modules/@mui/material/iconbutton/iconbutton.d.ts","../../node_modules/@mui/material/iconbutton/index.d.ts","../../node_modules/@mui/material/icon/iconclasses.d.ts","../../node_modules/@mui/material/icon/icon.d.ts","../../node_modules/@mui/material/icon/index.d.ts","../../node_modules/@mui/material/imagelist/imagelistclasses.d.ts","../../node_modules/@mui/material/imagelist/imagelist.d.ts","../../node_modules/@mui/material/imagelist/index.d.ts","../../node_modules/@mui/material/imagelistitembar/imagelistitembarclasses.d.ts","../../node_modules/@mui/material/imagelistitembar/imagelistitembar.d.ts","../../node_modules/@mui/material/imagelistitembar/index.d.ts","../../node_modules/@mui/material/imagelistitem/imagelistitemclasses.d.ts","../../node_modules/@mui/material/imagelistitem/imagelistitem.d.ts","../../node_modules/@mui/material/imagelistitem/index.d.ts","../../node_modules/@mui/material/inputadornment/inputadornmentclasses.d.ts","../../node_modules/@mui/material/inputadornment/inputadornment.d.ts","../../node_modules/@mui/material/inputadornment/index.d.ts","../../node_modules/@mui/material/inputlabel/inputlabelclasses.d.ts","../../node_modules/@mui/material/inputlabel/inputlabel.d.ts","../../node_modules/@mui/material/inputlabel/index.d.ts","../../node_modules/@mui/material/input/inputclasses.d.ts","../../node_modules/@mui/material/input/input.d.ts","../../node_modules/@mui/material/input/index.d.ts","../../node_modules/@mui/material/linearprogress/linearprogressclasses.d.ts","../../node_modules/@mui/material/linearprogress/linearprogress.d.ts","../../node_modules/@mui/material/linearprogress/index.d.ts","../../node_modules/@mui/material/link/linkclasses.d.ts","../../node_modules/@mui/material/link/link.d.ts","../../node_modules/@mui/material/link/index.d.ts","../../node_modules/@mui/material/listitemavatar/listitemavatarclasses.d.ts","../../node_modules/@mui/material/listitemavatar/listitemavatar.d.ts","../../node_modules/@mui/material/listitemavatar/index.d.ts","../../node_modules/@mui/material/listitemicon/listitemiconclasses.d.ts","../../node_modules/@mui/material/listitemicon/listitemicon.d.ts","../../node_modules/@mui/material/listitemicon/index.d.ts","../../node_modules/@mui/material/listitem/listitemclasses.d.ts","../../node_modules/@mui/material/listitem/listitem.d.ts","../../node_modules/@mui/material/listitem/index.d.ts","../../node_modules/@mui/material/listitembutton/listitembuttonclasses.d.ts","../../node_modules/@mui/material/listitembutton/listitembutton.d.ts","../../node_modules/@mui/material/listitembutton/index.d.ts","../../node_modules/@mui/material/listitemsecondaryaction/listitemsecondaryactionclasses.d.ts","../../node_modules/@mui/material/listitemsecondaryaction/listitemsecondaryaction.d.ts","../../node_modules/@mui/material/listitemsecondaryaction/index.d.ts","../../node_modules/@mui/material/listitemtext/listitemtextclasses.d.ts","../../node_modules/@mui/material/listitemtext/listitemtext.d.ts","../../node_modules/@mui/material/listitemtext/index.d.ts","../../node_modules/@mui/material/list/listclasses.d.ts","../../node_modules/@mui/material/list/list.d.ts","../../node_modules/@mui/material/list/index.d.ts","../../node_modules/@mui/material/listsubheader/listsubheaderclasses.d.ts","../../node_modules/@mui/material/listsubheader/listsubheader.d.ts","../../node_modules/@mui/material/listsubheader/index.d.ts","../../node_modules/@mui/material/menuitem/menuitemclasses.d.ts","../../node_modules/@mui/material/menuitem/menuitem.d.ts","../../node_modules/@mui/material/menuitem/index.d.ts","../../node_modules/@mui/material/menulist/menulist.d.ts","../../node_modules/@mui/material/menulist/index.d.ts","../../node_modules/@mui/material/popover/popoverclasses.d.ts","../../node_modules/@mui/material/popover/popover.d.ts","../../node_modules/@mui/material/popover/index.d.ts","../../node_modules/@mui/material/menu/menuclasses.d.ts","../../node_modules/@mui/material/menu/menu.d.ts","../../node_modules/@mui/material/menu/index.d.ts","../../node_modules/@mui/material/mobilestepper/mobilestepperclasses.d.ts","../../node_modules/@mui/material/mobilestepper/mobilestepper.d.ts","../../node_modules/@mui/material/mobilestepper/index.d.ts","../../node_modules/@mui/material/nativeselect/nativeselectinput.d.ts","../../node_modules/@mui/material/nativeselect/nativeselectclasses.d.ts","../../node_modules/@mui/material/nativeselect/nativeselect.d.ts","../../node_modules/@mui/material/nativeselect/index.d.ts","../../node_modules/@mui/material/usemediaquery/index.d.ts","../../node_modules/@mui/material/outlinedinput/outlinedinputclasses.d.ts","../../node_modules/@mui/material/outlinedinput/outlinedinput.d.ts","../../node_modules/@mui/material/outlinedinput/index.d.ts","../../node_modules/@mui/material/usepagination/usepagination.d.ts","../../node_modules/@mui/material/pagination/paginationclasses.d.ts","../../node_modules/@mui/material/pagination/pagination.d.ts","../../node_modules/@mui/material/pagination/index.d.ts","../../node_modules/@mui/material/paginationitem/paginationitemclasses.d.ts","../../node_modules/@mui/material/paginationitem/paginationitem.d.ts","../../node_modules/@mui/material/paginationitem/index.d.ts","../../node_modules/@mui/material/radiogroup/radiogroup.d.ts","../../node_modules/@mui/material/radiogroup/radiogroupcontext.d.ts","../../node_modules/@mui/material/radiogroup/useradiogroup.d.ts","../../node_modules/@mui/material/radiogroup/radiogroupclasses.d.ts","../../node_modules/@mui/material/radiogroup/index.d.ts","../../node_modules/@mui/material/radio/radioclasses.d.ts","../../node_modules/@mui/material/radio/radio.d.ts","../../node_modules/@mui/material/radio/index.d.ts","../../node_modules/@mui/material/rating/ratingclasses.d.ts","../../node_modules/@mui/material/rating/rating.d.ts","../../node_modules/@mui/material/rating/index.d.ts","../../node_modules/@mui/material/scopedcssbaseline/scopedcssbaselineclasses.d.ts","../../node_modules/@mui/material/scopedcssbaseline/scopedcssbaseline.d.ts","../../node_modules/@mui/material/scopedcssbaseline/index.d.ts","../../node_modules/@mui/material/select/selectinput.d.ts","../../node_modules/@mui/material/select/selectclasses.d.ts","../../node_modules/@mui/material/select/select.d.ts","../../node_modules/@mui/material/select/index.d.ts","../../node_modules/@mui/material/skeleton/skeletonclasses.d.ts","../../node_modules/@mui/material/skeleton/skeleton.d.ts","../../node_modules/@mui/material/skeleton/index.d.ts","../../node_modules/@mui/material/slider/useslider.types.d.ts","../../node_modules/@mui/material/slider/slidervaluelabel.types.d.ts","../../node_modules/@mui/material/slider/slidervaluelabel.d.ts","../../node_modules/@mui/material/slider/sliderclasses.d.ts","../../node_modules/@mui/material/slider/slider.d.ts","../../node_modules/@mui/material/slider/index.d.ts","../../node_modules/@mui/material/snackbarcontent/snackbarcontentclasses.d.ts","../../node_modules/@mui/material/snackbarcontent/snackbarcontent.d.ts","../../node_modules/@mui/material/snackbarcontent/index.d.ts","../../node_modules/@mui/material/clickawaylistener/clickawaylistener.d.ts","../../node_modules/@mui/material/clickawaylistener/index.d.ts","../../node_modules/@mui/material/snackbar/snackbarclasses.d.ts","../../node_modules/@mui/material/snackbar/snackbar.d.ts","../../node_modules/@mui/material/snackbar/index.d.ts","../../node_modules/@mui/material/transitions/index.d.ts","../../node_modules/@mui/material/speeddial/speeddialclasses.d.ts","../../node_modules/@mui/material/speeddial/speeddial.d.ts","../../node_modules/@mui/material/speeddial/index.d.ts","../../node_modules/@mui/material/tooltip/tooltipclasses.d.ts","../../node_modules/@mui/material/tooltip/tooltip.d.ts","../../node_modules/@mui/material/tooltip/index.d.ts","../../node_modules/@mui/material/speeddialaction/speeddialactionclasses.d.ts","../../node_modules/@mui/material/speeddialaction/speeddialaction.d.ts","../../node_modules/@mui/material/speeddialaction/index.d.ts","../../node_modules/@mui/material/speeddialicon/speeddialiconclasses.d.ts","../../node_modules/@mui/material/speeddialicon/speeddialicon.d.ts","../../node_modules/@mui/material/speeddialicon/index.d.ts","../../node_modules/@mui/material/stack/stack.d.ts","../../node_modules/@mui/material/stack/stackclasses.d.ts","../../node_modules/@mui/material/stack/index.d.ts","../../node_modules/@mui/material/stepbutton/stepbuttonclasses.d.ts","../../node_modules/@mui/material/stepbutton/stepbutton.d.ts","../../node_modules/@mui/material/stepbutton/index.d.ts","../../node_modules/@mui/material/stepconnector/stepconnectorclasses.d.ts","../../node_modules/@mui/material/stepconnector/stepconnector.d.ts","../../node_modules/@mui/material/stepconnector/index.d.ts","../../node_modules/@mui/material/stepcontent/stepcontentclasses.d.ts","../../node_modules/@mui/material/stepcontent/stepcontent.d.ts","../../node_modules/@mui/material/stepcontent/index.d.ts","../../node_modules/@mui/material/stepicon/stepiconclasses.d.ts","../../node_modules/@mui/material/stepicon/stepicon.d.ts","../../node_modules/@mui/material/stepicon/index.d.ts","../../node_modules/@mui/material/steplabel/steplabelclasses.d.ts","../../node_modules/@mui/material/steplabel/steplabel.d.ts","../../node_modules/@mui/material/steplabel/index.d.ts","../../node_modules/@mui/material/stepper/stepperclasses.d.ts","../../node_modules/@mui/material/stepper/stepper.d.ts","../../node_modules/@mui/material/stepper/steppercontext.d.ts","../../node_modules/@mui/material/stepper/index.d.ts","../../node_modules/@mui/material/step/stepclasses.d.ts","../../node_modules/@mui/material/step/step.d.ts","../../node_modules/@mui/material/step/stepcontext.d.ts","../../node_modules/@mui/material/step/index.d.ts","../../node_modules/@mui/material/swipeabledrawer/swipeabledrawer.d.ts","../../node_modules/@mui/material/swipeabledrawer/index.d.ts","../../node_modules/@mui/material/switch/switchclasses.d.ts","../../node_modules/@mui/material/switch/switch.d.ts","../../node_modules/@mui/material/switch/index.d.ts","../../node_modules/@mui/material/tablebody/tablebodyclasses.d.ts","../../node_modules/@mui/material/tablebody/tablebody.d.ts","../../node_modules/@mui/material/tablebody/index.d.ts","../../node_modules/@mui/material/tablecell/tablecellclasses.d.ts","../../node_modules/@mui/material/tablecell/tablecell.d.ts","../../node_modules/@mui/material/tablecell/index.d.ts","../../node_modules/@mui/material/tablecontainer/tablecontainerclasses.d.ts","../../node_modules/@mui/material/tablecontainer/tablecontainer.d.ts","../../node_modules/@mui/material/tablecontainer/index.d.ts","../../node_modules/@mui/material/tablehead/tableheadclasses.d.ts","../../node_modules/@mui/material/tablehead/tablehead.d.ts","../../node_modules/@mui/material/tablehead/index.d.ts","../../node_modules/@mui/material/tablepagination/tablepaginationactions.d.ts","../../node_modules/@mui/material/tablepagination/tablepaginationclasses.d.ts","../../node_modules/@mui/material/tablepagination/tablepagination.d.ts","../../node_modules/@mui/material/tablepagination/index.d.ts","../../node_modules/@mui/material/table/tableclasses.d.ts","../../node_modules/@mui/material/table/table.d.ts","../../node_modules/@mui/material/table/index.d.ts","../../node_modules/@mui/material/tablerow/tablerowclasses.d.ts","../../node_modules/@mui/material/tablerow/tablerow.d.ts","../../node_modules/@mui/material/tablerow/index.d.ts","../../node_modules/@mui/material/tablesortlabel/tablesortlabelclasses.d.ts","../../node_modules/@mui/material/tablesortlabel/tablesortlabel.d.ts","../../node_modules/@mui/material/tablesortlabel/index.d.ts","../../node_modules/@mui/material/tablefooter/tablefooterclasses.d.ts","../../node_modules/@mui/material/tablefooter/tablefooter.d.ts","../../node_modules/@mui/material/tablefooter/index.d.ts","../../node_modules/@mui/material/tab/tabclasses.d.ts","../../node_modules/@mui/material/tab/tab.d.ts","../../node_modules/@mui/material/tab/index.d.ts","../../node_modules/@mui/material/tabscrollbutton/tabscrollbuttonclasses.d.ts","../../node_modules/@mui/material/tabscrollbutton/tabscrollbutton.d.ts","../../node_modules/@mui/material/tabscrollbutton/index.d.ts","../../node_modules/@mui/material/tabs/tabsclasses.d.ts","../../node_modules/@mui/material/tabs/tabs.d.ts","../../node_modules/@mui/material/tabs/index.d.ts","../../node_modules/@mui/material/textfield/textfieldclasses.d.ts","../../node_modules/@mui/material/textfield/textfield.d.ts","../../node_modules/@mui/material/textfield/index.d.ts","../../node_modules/@mui/material/togglebutton/togglebuttonclasses.d.ts","../../node_modules/@mui/material/togglebutton/togglebutton.d.ts","../../node_modules/@mui/material/togglebutton/index.d.ts","../../node_modules/@mui/material/togglebuttongroup/togglebuttongroupclasses.d.ts","../../node_modules/@mui/material/togglebuttongroup/togglebuttongroup.d.ts","../../node_modules/@mui/material/togglebuttongroup/index.d.ts","../../node_modules/@mui/material/toolbar/toolbarclasses.d.ts","../../node_modules/@mui/material/toolbar/toolbar.d.ts","../../node_modules/@mui/material/toolbar/index.d.ts","../../node_modules/@mui/material/styles/props.d.ts","../../node_modules/@mui/material/styles/overrides.d.ts","../../node_modules/@mui/material/styles/variants.d.ts","../../node_modules/@mui/material/styles/components.d.ts","../../node_modules/@mui/material/styles/createtheme.d.ts","../../node_modules/@mui/material/styles/adaptv4theme.d.ts","../../node_modules/@mui/material/styles/createstyles.d.ts","../../node_modules/@mui/material/styles/responsivefontsizes.d.ts","../../node_modules/@mui/material/styles/usetheme.d.ts","../../node_modules/@mui/material/styles/usethemeprops.d.ts","../../node_modules/@mui/material/styles/slotshouldforwardprop.d.ts","../../node_modules/@mui/material/styles/rootshouldforwardprop.d.ts","../../node_modules/@mui/material/styles/styled.d.ts","../../node_modules/@mui/material/styles/themeprovider.d.ts","../../node_modules/@mui/material/styles/cssutils.d.ts","../../node_modules/@mui/material/styles/makestyles.d.ts","../../node_modules/@mui/material/styles/withstyles.d.ts","../../node_modules/@mui/material/styles/withtheme.d.ts","../../node_modules/@mui/material/styles/experimental_extendtheme.d.ts","../../node_modules/@mui/material/styles/cssvarsprovider.d.ts","../../node_modules/@mui/material/styles/getoverlayalpha.d.ts","../../node_modules/@mui/material/styles/shouldskipgeneratingvar.d.ts","../../node_modules/@mui/material/styles/excludevariablesfromroot.d.ts","../../node_modules/@mui/material/styles/index.d.ts","../../node_modules/@mui/material/colors/amber.d.ts","../../node_modules/@mui/material/colors/blue.d.ts","../../node_modules/@mui/material/colors/bluegrey.d.ts","../../node_modules/@mui/material/colors/brown.d.ts","../../node_modules/@mui/material/colors/common.d.ts","../../node_modules/@mui/material/colors/cyan.d.ts","../../node_modules/@mui/material/colors/deeporange.d.ts","../../node_modules/@mui/material/colors/deeppurple.d.ts","../../node_modules/@mui/material/colors/green.d.ts","../../node_modules/@mui/material/colors/grey.d.ts","../../node_modules/@mui/material/colors/indigo.d.ts","../../node_modules/@mui/material/colors/lightblue.d.ts","../../node_modules/@mui/material/colors/lightgreen.d.ts","../../node_modules/@mui/material/colors/lime.d.ts","../../node_modules/@mui/material/colors/orange.d.ts","../../node_modules/@mui/material/colors/pink.d.ts","../../node_modules/@mui/material/colors/purple.d.ts","../../node_modules/@mui/material/colors/red.d.ts","../../node_modules/@mui/material/colors/teal.d.ts","../../node_modules/@mui/material/colors/yellow.d.ts","../../node_modules/@mui/material/colors/index.d.ts","../../node_modules/@mui/material/utils/capitalize.d.ts","../../node_modules/@mui/material/utils/createchainedfunction.d.ts","../../node_modules/@mui/material/utils/createsvgicon.d.ts","../../node_modules/@mui/material/utils/debounce.d.ts","../../node_modules/@mui/material/utils/deprecatedproptype.d.ts","../../node_modules/@mui/material/utils/ismuielement.d.ts","../../node_modules/@mui/material/utils/ownerdocument.d.ts","../../node_modules/@mui/material/utils/ownerwindow.d.ts","../../node_modules/@mui/material/utils/requirepropfactory.d.ts","../../node_modules/@mui/material/utils/setref.d.ts","../../node_modules/@mui/material/utils/useenhancedeffect.d.ts","../../node_modules/@mui/material/utils/useid.d.ts","../../node_modules/@mui/material/utils/unsupportedprop.d.ts","../../node_modules/@mui/material/utils/usecontrolled.d.ts","../../node_modules/@mui/material/utils/useeventcallback.d.ts","../../node_modules/@mui/material/utils/useforkref.d.ts","../../node_modules/@mui/material/utils/useisfocusvisible.d.ts","../../node_modules/@mui/material/utils/index.d.ts","../../node_modules/@mui/material/box/box.d.ts","../../node_modules/@mui/material/box/boxclasses.d.ts","../../node_modules/@mui/material/box/index.d.ts","../../node_modules/@mui/material/darkscrollbar/index.d.ts","../../node_modules/@mui/material/grow/grow.d.ts","../../node_modules/@mui/material/grow/index.d.ts","../../node_modules/@mui/material/hidden/hidden.d.ts","../../node_modules/@mui/material/hidden/index.d.ts","../../node_modules/@mui/material/nossr/nossr.types.d.ts","../../node_modules/@mui/material/nossr/nossr.d.ts","../../node_modules/@mui/material/nossr/index.d.ts","../../node_modules/@mui/material/textareaautosize/textareaautosize.types.d.ts","../../node_modules/@mui/material/textareaautosize/textareaautosize.d.ts","../../node_modules/@mui/material/textareaautosize/index.d.ts","../../node_modules/@mui/material/usescrolltrigger/usescrolltrigger.d.ts","../../node_modules/@mui/material/usescrolltrigger/index.d.ts","../../node_modules/@mui/material/zoom/zoom.d.ts","../../node_modules/@mui/material/zoom/index.d.ts","../../node_modules/@mui/material/globalstyles/globalstyles.d.ts","../../node_modules/@mui/material/globalstyles/index.d.ts","../../node_modules/@mui/material/version/index.d.ts","../../node_modules/@mui/material/generateutilityclass/index.d.ts","../../node_modules/@mui/material/generateutilityclasses/index.d.ts","../../node_modules/@mui/material/unstable_trapfocus/focustrap.types.d.ts","../../node_modules/@mui/material/unstable_trapfocus/focustrap.d.ts","../../node_modules/@mui/material/unstable_trapfocus/index.d.ts","../../node_modules/@mui/material/index.d.ts","../../node_modules/@types/d3-array/index.d.ts","../../node_modules/@types/d3-selection/index.d.ts","../../node_modules/@types/d3-axis/index.d.ts","../../node_modules/@types/d3-brush/index.d.ts","../../node_modules/@types/d3-chord/index.d.ts","../../node_modules/@types/d3-color/index.d.ts","../../node_modules/@types/geojson/index.d.ts","../../node_modules/@types/d3-contour/index.d.ts","../../node_modules/@types/d3-delaunay/index.d.ts","../../node_modules/@types/d3-dispatch/index.d.ts","../../node_modules/@types/d3-drag/index.d.ts","../../node_modules/@types/d3-dsv/index.d.ts","../../node_modules/@types/d3-ease/index.d.ts","../../node_modules/@types/d3-fetch/index.d.ts","../../node_modules/@types/d3-force/index.d.ts","../../node_modules/@types/d3-format/index.d.ts","../../node_modules/@types/d3-geo/index.d.ts","../../node_modules/@types/d3-hierarchy/index.d.ts","../../node_modules/@types/d3-interpolate/index.d.ts","../../node_modules/@types/d3-path/index.d.ts","../../node_modules/@types/d3-polygon/index.d.ts","../../node_modules/@types/d3-quadtree/index.d.ts","../../node_modules/@types/d3-random/index.d.ts","../../node_modules/@types/d3-time/index.d.ts","../../node_modules/@types/d3-scale/index.d.ts","../../node_modules/@types/d3-scale-chromatic/index.d.ts","../../node_modules/@types/d3-shape/index.d.ts","../../node_modules/@types/d3-time-format/index.d.ts","../../node_modules/@types/d3-timer/index.d.ts","../../node_modules/@types/d3-transition/index.d.ts","../../node_modules/@types/d3-zoom/index.d.ts","../../node_modules/@types/d3/index.d.ts","../../node_modules/@reactflow/core/dist/esm/types/utils.d.ts","../../node_modules/@reactflow/core/dist/esm/utils/index.d.ts","../../node_modules/@reactflow/core/dist/esm/types/nodes.d.ts","../../node_modules/@reactflow/core/dist/esm/types/edges.d.ts","../../node_modules/@reactflow/core/dist/esm/types/changes.d.ts","../../node_modules/@reactflow/core/dist/esm/types/handles.d.ts","../../node_modules/@reactflow/core/dist/esm/types/instance.d.ts","../../node_modules/@reactflow/core/dist/esm/types/general.d.ts","../../node_modules/@reactflow/core/dist/esm/components/handle/utils.d.ts","../../node_modules/@reactflow/core/dist/esm/types/component-props.d.ts","../../node_modules/@reactflow/core/dist/esm/types/index.d.ts","../../node_modules/@reactflow/core/dist/esm/container/reactflow/index.d.ts","../../node_modules/@reactflow/core/dist/esm/components/handle/index.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edges/edgetext.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edges/straightedge.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edges/stepedge.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edges/bezieredge.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edges/simplebezieredge.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edges/smoothstepedge.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edges/baseedge.d.ts","../../node_modules/@reactflow/core/dist/esm/utils/graph.d.ts","../../node_modules/@reactflow/core/dist/esm/utils/changes.d.ts","../../node_modules/zustand/vanilla.d.ts","../../node_modules/zustand/react.d.ts","../../node_modules/zustand/index.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edges/utils.d.ts","../../node_modules/@reactflow/core/dist/esm/components/reactflowprovider/index.d.ts","../../node_modules/@reactflow/core/dist/esm/components/panel/index.d.ts","../../node_modules/@reactflow/core/dist/esm/components/edgelabelrenderer/index.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/usereactflow.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/useupdatenodeinternals.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/usenodes.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/useedges.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/useviewport.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/usekeypress.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/usenodesedgesstate.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/usestore.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/useonviewportchange.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/useonselectionchange.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/usenodesinitialized.d.ts","../../node_modules/@reactflow/core/dist/esm/hooks/usegetpointerposition.d.ts","../../node_modules/@reactflow/core/dist/esm/contexts/nodeidcontext.d.ts","../../node_modules/@reactflow/core/dist/esm/index.d.ts","../../node_modules/@reactflow/minimap/dist/esm/types.d.ts","../../node_modules/@reactflow/minimap/dist/esm/minimap.d.ts","../../node_modules/@reactflow/minimap/dist/esm/index.d.ts","../../node_modules/@reactflow/controls/dist/esm/types.d.ts","../../node_modules/@reactflow/controls/dist/esm/controls.d.ts","../../node_modules/@reactflow/controls/dist/esm/controlbutton.d.ts","../../node_modules/@reactflow/controls/dist/esm/index.d.ts","../../node_modules/@reactflow/background/dist/esm/types.d.ts","../../node_modules/@reactflow/background/dist/esm/background.d.ts","../../node_modules/@reactflow/background/dist/esm/index.d.ts","../../node_modules/@reactflow/node-toolbar/dist/esm/types.d.ts","../../node_modules/@reactflow/node-toolbar/dist/esm/nodetoolbar.d.ts","../../node_modules/@reactflow/node-toolbar/dist/esm/index.d.ts","../../node_modules/@reactflow/node-resizer/dist/esm/types.d.ts","../../node_modules/@reactflow/node-resizer/dist/esm/noderesizer.d.ts","../../node_modules/@reactflow/node-resizer/dist/esm/resizecontrol.d.ts","../../node_modules/@reactflow/node-resizer/dist/esm/index.d.ts","../../node_modules/reactflow/dist/esm/index.d.ts","../../node_modules/@mui/icons-material/index.d.ts","../plugin-api/renderer.d.ts","./src/preload.ts","./src/lua/fengari.d.ts","./src/lua/luastate.ts","./src/lua/print.ts","./src/lua/index.ts","./src/utils/resolvehtmlpath.test.ts","../../node_modules/@types/aria-query/index.d.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/bonjour/index.d.ts","../../node_modules/keyv/src/index.d.ts","../../node_modules/@types/http-cache-semantics/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/cacheable-request/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/connect-history-api-fallback/index.d.ts","../../node_modules/@types/ms/index.d.ts","../../node_modules/@types/debug/index.d.ts","../../node_modules/@types/eslint/helpers.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/eslint/index.d.ts","../../node_modules/@types/eslint-scope/index.d.ts","../../node_modules/@types/mime/mime.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/graceful-fs/index.d.ts","../../node_modules/@types/hoist-non-react-statics/index.d.ts","../../node_modules/@types/html-minifier-terser/index.d.ts","../../node_modules/@types/http-proxy/index.d.ts","../../node_modules/@types/istanbul-lib-coverage/index.d.ts","../../node_modules/@types/istanbul-lib-report/index.d.ts","../../node_modules/@types/istanbul-reports/index.d.ts","../../node_modules/@jest/expect-utils/build/index.d.ts","../../node_modules/chalk/index.d.ts","../../node_modules/@sinclair/typebox/typebox.d.ts","../../node_modules/@jest/schemas/build/index.d.ts","../../node_modules/jest-diff/node_modules/pretty-format/build/index.d.ts","../../node_modules/jest-diff/build/index.d.ts","../../node_modules/jest-matcher-utils/build/index.d.ts","../../node_modules/expect/build/index.d.ts","../../node_modules/@types/jest/node_modules/pretty-format/build/index.d.ts","../../node_modules/@types/jest/index.d.ts","../../node_modules/parse5/dist/common/html.d.ts","../../node_modules/parse5/dist/common/token.d.ts","../../node_modules/parse5/dist/common/error-codes.d.ts","../../node_modules/parse5/dist/tokenizer/preprocessor.d.ts","../../node_modules/parse5/dist/tokenizer/index.d.ts","../../node_modules/parse5/dist/tree-adapters/interface.d.ts","../../node_modules/parse5/dist/parser/open-element-stack.d.ts","../../node_modules/parse5/dist/parser/formatting-element-list.d.ts","../../node_modules/parse5/dist/parser/index.d.ts","../../node_modules/parse5/dist/tree-adapters/default.d.ts","../../node_modules/parse5/dist/serializer/index.d.ts","../../node_modules/parse5/dist/common/foreign-content.d.ts","../../node_modules/parse5/dist/index.d.ts","../../node_modules/@types/tough-cookie/index.d.ts","../../node_modules/@types/jsdom/base.d.ts","../../node_modules/@types/jsdom/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/parse-json/index.d.ts","../../node_modules/@types/prettier/index.d.ts","../../node_modules/@types/react-beautiful-dnd/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/redux/index.d.ts","../../node_modules/@types/react-redux/index.d.ts","../../node_modules/@types/react-test-renderer/index.d.ts","../../node_modules/@types/react-transition-group/config.d.ts","../../node_modules/@types/react-transition-group/csstransition.d.ts","../../node_modules/@types/react-transition-group/switchtransition.d.ts","../../node_modules/@types/react-transition-group/transitiongroup.d.ts","../../node_modules/@types/react-transition-group/index.d.ts","../../node_modules/@types/retry/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/serve-index/index.d.ts","../../node_modules/@types/sockjs/index.d.ts","../../node_modules/@types/stack-utils/index.d.ts","../../node_modules/@types/testing-library__jest-dom/matchers.d.ts","../../node_modules/@types/testing-library__jest-dom/index.d.ts","../../node_modules/@types/use-sync-external-store/index.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/schema-utils/declarations/validationerror.d.ts","../../node_modules/ajv/lib/ajv.d.ts","../../node_modules/schema-utils/declarations/validate.d.ts","../../node_modules/schema-utils/declarations/index.d.ts","../../node_modules/tapable/tapable.d.ts","../../node_modules/webpack/types.d.ts","../../node_modules/@types/webpack-bundle-analyzer/index.d.ts","../../node_modules/@types/ws/index.d.ts","../../node_modules/@types/yargs-parser/index.d.ts","../../node_modules/@types/yargs/index.d.ts","../../node_modules/@types/yauzl/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9","746d62152361558ea6d6115cf0da4dd10ede041d14882ede3568bce5dc4b4f1f",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"f3d4da15233e593eacb3965cde7960f3fddf5878528d882bcedd5cbaba0193c7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"6c55633c733c8378db65ac3da7a767c3cf2cf3057f0565a9124a16a3a2019e87","affectsGlobalScope":true},{"version":"fb4416144c1bf0323ccbc9afb0ab289c07312214e8820ad17d709498c865a3fe","affectsGlobalScope":true},{"version":"5b0ca94ec819d68d33da516306c15297acec88efeb0ae9e2b39f71dbd9685ef7","affectsGlobalScope":true},{"version":"34c839eaaa6d78c8674ae2c37af2236dee6831b13db7b4ef4df3ec889a04d4f2","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},{"version":"549df62b64a71004aee17685b445a8289013daf96246ce4d9b087d13d7a27a61","affectsGlobalScope":true},"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",{"version":"300c86d156193bfa3d2d42e730d166e56f9312f4ae4318230ff0f378728349fb","affectsGlobalScope":true},"2bd85abc6423fc5c27a1dabb65bbb015cc798d1f43bee927e91eec217103ab11","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"ca72190df0eb9b09d4b600821c8c7b6c9747b75a1c700c4d57dc0bb72abc074c","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"bb65c6267c5d6676be61acbf6604cf0a4555ac4b505df58ac15c831fcbff4e3e","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","dab86d9604fe40854ef3c0a6f9e8948873dc3509213418e5e457f410fd11200f","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","489532ff54b714f0e0939947a1c560e516d3ae93d51d639ab02e907a0e950114","f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"cec36af22f514322f870e81d30675c78df82ae8bf4863f5fd4e4424c040c678d","d903fafe96674bc0b2ac38a5be4a8fc07b14c2548d1cdb165a80ea24c44c0c54","5eec82ac21f84d83586c59a16b9b8502d34505d1393393556682fe7e7fde9ef2","04eb6578a588d6a46f50299b55f30e3a04ef27d0c5a46c57d8fcc211cd530faa","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"2c45b35f4850881ab132f80d3cb51e8a359a4d8fafdc5ff2401d260dc27862f4","7c013aa892414a7fdcfd861ae524a668eaa3ede8c7c0acafaf611948122c8d93","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","fd93cee2621ff42dabe57b7be402783fd1aa69ece755bcba1e0290547ae60513","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","a15eb098ed86a4135cba05d77e792d6189fa8607a00c9b1b381c0e9550c04ba5",{"version":"970a90f76d4d219ad60819d61f5994514087ba94c985647a3474a5a3d12714ed","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3","ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"cc4fa603eb4f28847cfa5bfb698dd186a0864853383d49f2478b3482d5caca9e",{"version":"cc26175c8d8b3702abe8bfb35d3a3fc2b5627f4f27d02cdac4f4b20ff608ac5f","affectsGlobalScope":true},{"version":"2cb7d8531fe87e92e7d9ea8d0e1a2781083512e44cf4180f6bc78fb60111e26c","signature":"da57bea491b5cbf40a921b87205a7d1c17e78437b87578fff1cca3464216b7b4"},"ca6018fc15509ed093edd8cd8334b4d536143a8b7bf79b520390d448b516c5e9",{"version":"e6c3b7d0a07b5e9b6209f9ac9067fc897f0cd0717024c743d19a1857d547b2fd","affectsGlobalScope":true},"1238a8b4e042f75c7c3fc094697c3b194bc27452010cdb24e8d50a4817874606","6a4c295dde091b4f90c2c9dd49fa4d9d25af8ecc1a3a138c07d8adee8485b82d","8354f9bec4341107cd639d8a440e81065cd3848ed47bb9fa01f68b6717240029","b252bc79c73bd8b688fcdb1f1c8d48237f40acbf7e0b9a55304eb5db33ff5b7e","88fbcb198c7003d3a3915403ab7dcf3d5c4b7cfe1282bd25229dd8732666072e","1824bfefa21291ac93c15a4177149d78071f60b0910cd9a29317a351c020f9ac","4db0e6ad4d4b5c448dff0f06f89570632182d57c7bc7b07de7f29bb1e70542e3","2b3a3c3d5e8e562c0ec7f6a5a72ca8432f9190a65112dd5b16d6e846199fac25","2bf791ed6e73a7b42a0fb22c517e7d959bec8c400ff926f14f8531a84c6117ab","1e804fcd3af30ccf0ca771c16737e882576930eeac1baf2c9302419c5198559d","e4bd94e97e08af3a3b8a6b2e85c6b93a690f572c1bffca113681ee7390f53411","2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","77c1d91a129ba60b8c405f9f539e42df834afb174fe0785f89d92a2c7c16b77a","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","6aee496bf0ecfbf6731aa8cca32f4b6e92cdc0a444911a7d88410408a45ecc5d","b9bb1df823ba802e5c680a0a4e3722245eb3ee4058bf94331086996ce56e3a0a","0097b4ddbc962aff10ea1def790074cc3a64d12bdaf3593a7acb96c22ff0a297","b21fca07fc222e7554c61b4c0f05d61044eb8ddcc19b4ea830dcbc72864fd7b3","be5bfad4717609c49d44258d4dea6fa270671141e2cbd167061103b6b3777174","6c27d4b5ba01295ef334456d9af4366aca789f228eee70fcb874b903a59b0e5b","33e4c9e45df453459d0cf79340a5eb872e5749a03769f872e4982b55e9805240","1217908bcac9d426d4d66e36ee74b266b4759aab93ae2ce6a434812a6612ba2d","6abd19039b76babedb2d5bc37c7bd8a48c54f28e7ad45112fedac3e928ab6bbc","38f443d980c51cfd35d91bb74e17d73638277f72ab9eec931b170ea93f9d3db3","d30ce3f11c160c1f9a2b587586d264138620ec7e6e17f8a32b0f9441356a6b05","dc6a65a642cb56150b697947d70a68bf365e617ed57d340aa0f95bc5d92cf41f","fcdee9b70c68e793750acebefb0af52e8a0c4f8aa33a01553a7eb39be67a7317",{"version":"b9722693f011a2361b6199b9d0130550c6551a591cbd47f0a747d7471248d138","signature":"eea291833879aaa68ef22eee6f144a487b7f8d1bde8f6fdc01c5e14ce89bb538"},{"version":"65fc32af6292d86b3d3cf5ab3ed490f8a750980d09efd0e0763aa251294a6f2b","signature":"c8d4723b00dd3dd6f993a132bc3a5a62272f490a84932cbcaf3259fb12bb27f6"},{"version":"ee61d548b10627c8c8a54b952c8e53a9bdc82cea69a03e9a894850466ff584f2","signature":"b7e7b2e41384cfadaba5840d7359cf5d6496a71a8f2f700f690f2bdc4902dc2b"},{"version":"d09934f0e09c2b026d2c31660aeb87bbff59f5f993d41ebf903518fe8c0ad4bd","signature":"f9a8e303536f52ba3796df58a90aa9f088526993501a09df78c1b496fc1cd455"},"339a732d57c4370d8df85be75988f8eb052a951eadb65e4253ec5e0a4c615651","f4d74ffad1174290bf139b103d514a49d1e1b4cdc561514c91ca6936f248d261","9cd7b7d2570ac61dd48fe26fba24b0cfc43393f15d6df9a0d524ceb79f4b1b36","f622d9001d9467a06f97c31c7fc50df5e471f8242d939514c9923c6384b0349a","5776eaadfb2557fd8400090998d3dc1e97388889328679d4c0b70d1d7f862ace","355e48c96dc1595043af1a53018e360af4c432866d12fc3517bedc364ca2e396","9095958931c4a311ef3dabe3646c0089731683ad82e17dafa32a88882beaf77a","a4bd615e887f3aae92a23cee1ff4b23e5451d22cfab8b4cbad58f65fcd23b4ae","a5aa8d80ff8c8abe91bb901c5c6a3757e17bd409def692111df06109e866787d","791c3d4c82bccda7f6e82b8e491f9c4c1876ba97cd2c304bbd33991ec96a3ade","809558921b9e00aa617b7d861adcd5520278ab0ccf600229578772b3c85a0578","10282d782e27b60cd2c993cdb6f34e530994d2da6e11089da04ae8fa093b4c1d","aeb8d742e36fd87a9c8c211a0231a54bd7129ea46a68c107410f7f1696831147","9c087b1f29f47833769eb821a5924f4bce57c0c1d189d84007c17514a8bfb6f8","61283f2039c64ddbd8bcba44fd82662a07b94833c011b8e7c52d7bae06ab0bcf","364d9bce9167dcd28fad260e82f1380e649c7afc2b2e3bb033ed3f1156906549","819e2f0794a8acb774ca14efb260b6775b1df7244e74f9b7db4c1b5365d0aac1","1703cb4b49a0cf99262ab405435bc8a23be0e5979abdbe82ab810f50dcde652a","40bcdda2de0eaae07aae07cc4e1006a6a3a5767d3b0683c5f738710d53e20f36","5337a171f1de089de9897edf9f386637ca099c77c1f4b5d89183b16b29d2c88b","44becf7301271a176c2e96be9ad5ba89cf4eb94490f51a369d4b66132fb07b59","f6e5ad650cbd0a053afea4cdb3731093817f702490e4e4c2a40e4e8e63352bef",{"version":"15641329991eff268dec59447576bdc19ab34424eea6fdb1b5de8b87db5318b8","signature":"e0e65746096c3171377bfee39db1cb7cb6cfb90f68cb5ccc6b6ac300400950ea"},{"version":"6aefac915b786f7833db6d7fb8da2f7e74af48ede1ba9190102f48e197540b75","signature":"aee9f8b535199fa838dfb0a146576409309ecb2e519411802d59fe1b8da47489"},"dd51d3b0d65bf1a6ebc7b1056911b10e6f62f37807c7640dbe271e62f31de090","ab754c02d70553f7131f80a5c44f6e45c3251afb571a73117274b4724f683e02","5d9a0b6e6be8dbb259f64037bce02f34692e8c1519f5cd5d467d7fa4490dced4","732a22e28e99e56f4f76410ef1d28ab502ae569ed7a25161db50629814f0c4e3","b9f2ae7d77953c5a7393a9380d0418d96565d9ca94672d61e80a89ce74ccb0e1",{"version":"0b9af8e61c145e92592f739402f5f6e39430c03695544af563725d995a22d38d","signature":"5593c1da42432bdb9c0b82dad62e1fca6234c58bcfbcb9c0abc4294f4b1420e0"},"7d2b7fe4adb76d8253f20e4dbdce044f1cdfab4902ec33c3604585f553883f7d","c8b9c5fe62228e4535c6319e8f2257a97205d44baaa6fcc1a1eabc45aa8aa0a2","c0b65f101acb86fd1a4cedd65a5f6c19379afc72283549b9514f4fd9753f0f3c","b8591f4cffa9c87e7dd5bf41a612d470194995e90cd5b40026d4980de94bf443","eac647a94fb1f09789e12dfecb52dcd678d05159a4796b4e415aa15892f3b103","a7e430e32eaefba6b1ebf23a94a4562bfe7051cc83558d33ddc8ff342f3c18e9","d4db6b8a77cda8eb8f4b04805bcec75907155c991aa42560a78b1261123583f6","a29c9ebd7c9778657a296f28fc6dec338e71fa91af204c96a63421feb077aefe","5870767e593d953748c91fcc3c0d2f6882e116df91c591c3bdd784373cccb5e0","83f072421d602c36f9ab1e6d65bc161f6340c3ac74ef357e22c43af9aeea66e7","b1cbf65d817e1d28d62f66b7ab974266288ba2dfa7b1e2853fa961662f89edac","3c8b4ea1e76d4936f3b0bc9d625a6ac2e7072fa3579185d722c7a502a250f2b1","067f11487c002285eec879a8a3094b57319e3046c1e0d3951b5d7e4a98d75b99","2bb8791600a42ca6e599161625da342242d3e6438bccbac3157217aac2afbe82","64b6e9042d56b700103d07b3f45dd6bc8797dc6fed388e3c3a703c7ea942b89e",{"version":"6f0c059c3e40f7760a7c627a318dad0c4a3125e92b7493495dedcb4f79f03e8c","signature":"3bfc278768b060c91b3c30213a9f2050ed88bfbfbd871cb7d2a50204dcfb1c06"},"58b63c0f3bfac04d639c31a9fe094089c0bdcc8cda7bc35f1f23828677aa7926","d261bc13b47527137b18a3605ff777b65f3e254ec67aa21f08aced2c77cce921","09aa3281031877f5395cd475be62561f24f07c6e4f05151912b4d50e28005884","f506c24e2d4373ba4bc5794c434070fc06de5433603ab3862308ec43b814f3c0","a15c14a985b24ec8730229d2fbe2ee8a081f0c62c44aa3d740d80607f44098ea","b589d625dde2d63aafbe88143e5fbd7b98dd6aca9782747eafb6e88a3f43f8bc","3f9cc1bdf9e8700facd05b9828032cc01dbc3e500fda6afb2d92509b8442ab2c","3d95495d28bcf7daec9dbb63c7348690428775a1b40ba660791d3df426307807","c211a4765fc54e78e6e77e727a4173cbf71b1308ad90d0b96529615cee5073db","5d20853a892f76d9c0c01f7a38c428f48f8fca89c33426320826d1f0090a7dac","4672b596be5819791a6b44bba0eac846210bad364699900cd3b0cafb69b3f162","ccf160a6ae2a11d6d8bf91d9758fa247c98e3550e0b972f4dbe1dba48457e228","60cab5f8f1a28ab53c2ba49207fdf698586cda202cdaca49826c5d7807c91cd6","4dc19c0c00dc6aecbc60ccbde00e5c6302197593bb47cd481294d3f78a386b93","21762b149f3a34c126ba0c5766359887e9483acd974b1de39c27e65719642e48","3273a41e4e56f44cc7498707e5c8cb748f519564cb1867f682c4db9f76cec7d8",{"version":"fee7709e993690d1c03aabd0dcda8a608fef1e32c34d33b1c140b22aeac59990","signature":"353980e3d9fc421b641c851c4542fcb85c32f7fe06c2f9cbd5f312315cf5a810"},"a5e79fdb1b5a43cb0f042e28b81bf6f442dcc1d2a69fa7fda8f3763f7724c530","204d547bda2cd0f4675af0ecc6b4c9212c01a17d6ac25513eb9bffeb034d794c","2e49b46ae3aa13af74396b257c311884a99c72bd3f67a10289ed8465f0e88041","7fc2bfad2574377489db7123c183cd335c83f369cce124c8a20705f515dd027f","8885efeeabd356b31cc4a29b67f19d344112b5bbf245097fdd73b3af3a268ec7","659212818870425e8064621dcf9257bde63763339cf8315e81b209ec5db3fa55",{"version":"3bf4f79ecf2c1809a638f2bfe9f626b058a51c22f943837e4f939d53e6c04931","signature":"943fc631de24ce88a378553c8d60610b4c4dc96c5c946649bc8ed81582dfbbcb"},{"version":"2142793764950ce84cb1fa2aae97700e12ad048e82c3401258bc884b3cf8387c","signature":"42c490886c695505ceec9508756ef3a59f27caae70a68e9a7c3704630b6991fd"},"4367bd2cce624df276ad6fb153235c400d8b54cab4d74a9622d8358c16e33cc0","a4337fe4b20a33de668649493d79aac4f2d9c50a6eafdd27ef44f4945ee3740f","dd9d86fe6c009aeba1712a04c361593c0b4c58ba107af80676aa050ed189ea9b","3e8c7d50e7b2dcfe27cb192a7b1c66c97334d6408a96f26f39ca6a541a8e918f","7d65f2af12218f02ac08606114461d90367aea6a8bef2ce1287c1ace02d7a2ad","c76e6f2b4898ae11f0bac1e9ffe4d14e597498e9e4a19eb8b1b91a0fc3fdcd27","b5fdd35fed3de4b4fb4f6c35f425cf8a0d66baaf1596fbcb902d99a0aa8e78ab","a77d47eadd55e00df186974adf1ab499d38b31423269c0e293a9e8737fb98df2","af0083ff49844b5b4b2d30d87bb8adf204dad937f62b0a1a0d1b1c1b0239389b","7f2e6f42070d77b9f6467344aa1198882f50fca2cb835b0549a006822fac30e1","0813c9bb6f360722c3902e10ca307b59fd0ecc32c6b384e07486b5f6907d7a3e",{"version":"6f498598ea30924ec640584f31bc3c5fdbd9a28c97da9ffc28e2751513ba63b3","signature":"110eacb785200c94143be302b3f74a2acaf5382e6adfbb32a31161e687123e24"},"4d6376c3da5132236720511c6c449fe17c81f54caf217d94b7e50565bc37473c","ab08a59808d98cef3289e124e867757cfef0a712c745dfa1aff90c4e74a3e1cb","cd0c9d7f17002f205387c0ff62713e5eb6bce179e33c074bb5001435a2157c4f","7024d308ebbccbbae3fbe244da75e8fec3c794389d260a2b1d7181e5369f53b7","c90e44fdadf04494ed6ecd74aec54a8e9d6bbd187f8f6ddd5e549ae6ed216cc4","ab487c7ec38dbedf590660473bd3c6f838571557a113beb682baeabaa61300f4","d2e13c8e86f6f2337fbf5e99ac5e37dfe7fc62e97e6a9de0d162da529e778c47","6f771ceeae2c257161c9284ca68bdce2d3f251111a0714400a37b76131df9cb0","52a3b216e9309f01fdf07fc5f39132d2b6d9a62a107c9c42d35d9068538c0599","f7a0527d438d747f9ccbe5cc4a33ce7da90eb7a4060b4d42dcaa92587c9719d7","36250794500a1817291da6e52645a2c56005488be135970f51d8c5ed5f3d3e8d","4dcdbdbc992d114e52247e2f960b05cf9d65d3142114bf08552b18938cb3d56b","a30498de610fd07234331d2647736628527b5951af5e4d9b1bba8ecec9dbdde1","ddb5454371b8da3a72ec536ad319f9f4e0a9851ffa961ae174484296a88a70db","fb7c8a2d7e2b50ada1e15b223d3bb83690bd34fd764aa0e009918549e440db1d","281ab85b824a8c9216a5bf4da10e1003d555ff4b66d9604f94babac144b0f61d","9c909c17f69f125976e5c320eded3e693890d21b18cbc4caa246ec4fda260dcd","7915d50018073244a9bcb3621e79b8e0ad4eedfb6b053fc945cad60c983bb11b","0352db0999f1c56595b822042ee324533688aa6b1eb7c59d0d8dd1f465ffa526","1fa33d8db2a9d2a7dbfb7a24718cccbcde8364d10cce29b1a7eea4cf3a530cbb","c545411280be509a611829ef48d23bfbc01ab4ff2f78160a5c1fed8af852db86","ecfa9ce3a5a37d15b813065e8a7cdf677a0f493018e47ce59815443dfbb9c910","83e56d3337e1a6dbafdbe5a2502a84c330b1a328ed2860d689b2ded82b1f5c95","f186de91b1c50640e4d2bef41307ee06446d7ec76f787d4384ef808981025546","909bac92983e542dd29efcf9eedf4ab5a330767c70c505a52326f7f5ee4b288d","e0407a1b8afc9b03d6b3063a3c8a80f4c769146bbd39fccd5ade9df5c4ffb703","ae1d409a961b46f0b0c2b1dbb51ddf298e161698b7ebc3360dbae8cd6837f06e","71ddd94e42d6ee6a3f69bd19cd981f6bc64611624ad0687168608a7243454e34","40a5bb1733bb8fb3ffa425b92db062334f9b998ba8ad4390cc8008cc2ce701ed","25cdca7151f3e654f6786da7fadba42eb784d44382d70eb66d9590c2c194a40d","9e7c4846057815d55e1eaf27214286ec0768a1b463a4669e1ce37849b6cc1016","9f362e16eaa4d859fcc4eb6057c618dcb25688def0f85ebd63505533a03d8834","1f4ae6e7f749aa9a53317baa0e26dc98317f87c54a323250f0aa6d8689fcb5ac","1bfd2c00081dd582489d1d0dd64d270b9c8bc5a62cc9882865b405bf8c2d9b03","2a6341e88b00c3df410f0e1ac0c45b14285b9b3e8613bdfa6893ee748f00a07c","8ea05ab5a1250aa9d98070151c3981a85f5fd05185454f6c871ca2a988feb725","0e1f5fa05f1097f2cc3a1581afc7270af08d31be123f3a8e92a5b4080858861e","655638506266d44bc4815f7fda912d712114e200aa11ce4dee055d357dba96c5","d5a8b1a4ddd0dedc0b2f94627f26a02c25fa68314f575d58668844dae0269ac9","03fd06fcc894c94effaef2fc57d92c9e2871c6a5adb2db7136859a6ceff3f91a","f9a7c89ccff78b8a80e7caa18cda3ddf3718a26a3640dd50b299d90ac405f9be","9c78ad8f4f43db74529e2f40798ca4a8f9a2b09cad5363c400aa7ce691691ad8","4680182e054eef3b7eca5d9168a70191033b4da65cf8d013a6ced7ff6948bc80","f13f8b484a2ffc7b99779eb915ab7c0de7a5923b09d97bd7bd20b578e1d59a85","f0e1813ebf1c3ac7e6e3179cb26d13e9044d69eaf3f389e91c8afd9aa958a0c2","4fca0017adb6ab36b6516953511488e00113532d5db31a7d4f902ae9ccf06208","37882fca5c7c251e1bfe99c5766e708abb179cc45d22b6bc87c01d25423bbc66","53fd33fd439c753899684518742fef08106dc63afcc1c9f62353eff3601e7fdb","9a2e75d1d72d7463cb3a0d4a01c5648bdb4f54866acaffb0360da91234c0df8c","2d157fcd4056b3190ae9427cc822f395d30076594ee803fb7623b17570c8f4a5","47dada41ced5a0e23c415fb8599b1b8c848fdd1df1b2f02b2e756558be9b3153","b0a59b88d6d32ed5734ac9413f8a9e34773d4b7b0eddaeccdecee24ab8a4457d","492dae861616e49ded6e82df7110868489b8f80cebb5f56bbe05bbf829f8a6fc","dd4e64e454be95294aceb5286575faa08af11ebacc2c524310be108c1abd2a84","3711c896e72680d79cfc4df36cae172b7dbb72e11936e5e9545f5351e6ed0962","fdb706b594619f05e73b97213d760f59ed1514b302f58b4b46d86fe77757c031","f0623fef3752e3b67ed969c7e1c311528b5b54e3b43d8bbc26073ae34387d9a6","9e7c4846057815d55e1eaf27214286ec0768a1b463a4669e1ce37849b6cc1016","c477249bf0288b0fa76004f0d34567ad73fd007471c7fc9f9abfaafd0baf9f9c","91df8ed021ba6bde734d38d901a2d3664d2c804000299fd9df66290cc300b21c","b7071465f540ceb78d697e547f495d7ba4fddb94f9443bb73c9ba3ef495aaae7","54b0087a8523d0a289460fb3ac4b9ed55633977f2eb7e7f4bba5ff2c1ba972e0","62a0503a7f38a521fac641f3b258516ce3229852cd297920af25f798e319bbe9","7b7840c394a0c5bf219576439776edb4447e9228f0fbbb2a29caa8f4cf6a95fd","794d96375f04d39dc8513db4479a0023d3b8074b9738e38f7c0ac62d9696431d","656b3a9ee8a2eb73218ccddedbaf412751787b303bf5b0e293f2c60443aeeb08","e78dd7346725ac2d936a296d601e01f55eefabd010bee84cd03e20f55bd61a8c","e8447d11f3a33668faee3a0175b0c0e7f653b46896d127b8b42402eb8e811ead","d3afb6e0fbb2ff982a1aa1f8192754d1fc26f5b80c9e1b79fd29f60a4c8ee4b9","1b21d11a8a2339710d628f30d4e392959d1e78870e15217cee44defecc945d25","6c4925eb55a080d0335bbf728fd0824d0e4848d554aa8dd260b83ea8ac7866cd","492dae861616e49ded6e82df7110868489b8f80cebb5f56bbe05bbf829f8a6fc","ee151584009c44c5d85647b8f2a009d41c871b11eef306b82fd8726e61000dda","30482110c7b78ed09ba0f6a6059839661a663caf573f377892ccfb8665f2c904","5e19a4ddd649b5274e911ed719ef20e76b2b50b195cff0a6128974fa7136a5ed","7f55be2dac50778c467e6bf5f43813c95aede7c91f33799992ec528bc8e2ac29","2e945eb6f8c4bb2c3eca0ab41fa0ba6d534448b245fd85ce54a9622a3b5e5902","247c7ef77d31b7344ff1d4bbc979193dfdb4f0620aaa8994271c1a19ba7b7fd5","fd67efb3106829ec829f635cd011fe2449b689ab1627e3125ceedccb4be70160","9e6c51f61f922f70bf41473a10ca72f8fb6218587a5d305544bc64ca9ebe6768","0f6b337b59b211dd99e8758c9a1906f9dd7027b74bb6e9cb11a14ed1264a54b2","3f982f5196f9e80ccbc869dfabe2db727e9c181b8afcf985c1eca480385c5aa4","4b247257463a862b001ae097a3b5b1b90dc536f26b5c10860f46a086d404dbde","d0f2ddd588d6e73c08eb89d8e1bd6913b4e76a556497b81384321f4b308a08f7","d302d9806295f7018e115f0841222106ea13ff08a84b6a65c2a6840161fe06ef","6fb8d589421e9fcb4d885775748fa5a2607d30f7d323b99f39178b0134b24908","ca8d83f4683985cea219b3171d4e2255e270c31fd1c9fa9fee870147928a1a28","01bb683a8d7029615a664f16371d85d6c423f939e642127f267c699b8fdaee67","6f9ccfe772d526c448050c16f5c5e803be9e4250886a5f1bd9710178877d5749","bf11293cd047c76a515ba6e51fe3d9b7c643d1291795183c03ade5caed92cbc3","3d0c9ab7db5824803fa4db427c32b32634ee88e0f8cc07ceecfe783fedd74883","d2b80289f4d6e739fa686931a59934d53da37f295f3ad2de994c06c56f9f115f","5f1af7275f2a9163641832733040dea1f37549e8c3b3500fce70c7ece43ed4f1","b9eb41c2fe73fd3a4fa20abdb6c8ec11ad75c5047c4a0acea1f54aa412e27087","851df6f9fda2d1de63c60947414b16d0bbace00ba63870268cf9b9ef42411d1a","e0a885c5ea202b9fc29b95447841cc9bfaaecdcbea8930d3b86437e21f24bb8f","55b02ad0e9dc318aa3246016bef92ad29ce6fac78d701a8872c91acb29919d00","08f4c7fe2450260b0765a77c33fb31ec2f74135a3a73b8a66ae23b42477d5b44","603938fc65aab423081f090ca51bccadbbc7b82448b4318ed081df2b1cb915e8","19087a05c31ff776b0fc4b16617c7898f7bed243d2f4fc38d33896c8c1c6e2fd","2648aa102209f157247999308e4cd10af4c6fb2c162b611d8341d3b5bfe550c8","98461c5f55d1b191d145af33a258679cc93b41f876315b20f567655642726c11","726f455f0c65adaedcf799b2f0670610294ce1ef9ebe333d78c7ff9fd932ceb6","76910f9a58a63ed7d477876407541d58cbe4f6d39bedcb8fcaeaa2df73cb234e","4165eca67f3344524716c2818892d0330f3cfee91eb3f53eb9918c3de6351715","6cc7b9937aaf140567dffcbb8cc7e5be37f159d2d970a6cd6029804bde96498a","92d50ec4ddb64d487c7875f1228e210d3caacc906e1965ec3c4dd32e4030d1ef","043d75595b3416a1f7c651ea56b01a78197b6e86f71c289b7ef18c3edef16048","65cc58893e6087acb75aa61a30c5d74c31b8c863000d361f680c8d9ec23cbffa","15e1baa92231dfb9db3cf4ca4a8d2970cfd1e39af7a2116626afda7d33417d92","69fc3c1f25e765e817ecfc91968fbf6934e4ba304ff998c31b3d0cfc56772957","e5f62cc88ab16e83779624ac8da3c6f4fd8dca286b2de37de6f791948861eaea","38ff09c15f8e6e63f3bcefdfd3259a4fc9b7b337c3fb71a099b95b406cb37bbe","95a5c5e7219403a0d64058de4786e152e71540e824d22d165062489433f21830","32c59dc2691898bcf265c8773e270833b5395b84b97e654cc79db3896af0c79c","97b99e6c74cc83b37483c1ab81c49ef05067665581f040c17dbf8e9958e1da18","7e6942c0b65718725efce0b7fbc5ba928f98a58d7ee9c76ab867556e632b09ff","2d02f2f427a8a6ea162116770b086e14f306f09a8b39ef60b5590373330268c7","193b2976612865809ef6fe8b0e0e82dac7ae38a38272960e847e51a30c1a89ad","98b7964d14689b1009f215e67da87569d0a510d08407ff77db9ab80aea65ead6","d8aba69bc718a4fe83c4b9cd272e069a38ec26fd13fbfa43100290ccf1db334c","abcad16e71ad34d3a084e09d37e18346e815acb6d427d3bf963d24444beca822","2fb8b5bf29d510dbd748db553301413012256571ef323fcbfb706d5b91b64fe6","914ba1c8e161297da6a6a2dfc220e747dec60d5d7097f9ab5304dbf519649a04","26efbde3de3f0c08a94c834ae3edacc28d607674ec604cc059f6dfaada86d216","e46d5c060098d19bef1bbf4267cac0a1f16623f15cafee627254a0d5922a5e8c","ddb649b17c362fcf7eed5b9d02eb8ec2bc750e1b3c7192f27adf68ee66847d16","c34bbec1fc5b38f8dbc4c5168193ded6c3711dff5a2d11476bfcdef7ab912d19","46a0b34e1264c4d25ca6646ff0e6cfaa7275ea1ae5a6bc23d4dfd84edf2f2b2e","ced781fd7ea93eb9aa8849bead6b4fc77de4c65331199f4c5b09602c55433c78","fa0ca60be1656ec39e73a9665c107714deca1d97ab7560c62c11c3b284b1eae4","04ed8fa1f6d343e29133906505bf9a1357aa1e28cf2951fb10a0071732ebbf1f","af560c1ff8c707db02ceaf6b3cef02a112c3d75aacadefdd16fd34d1b2229285","e53812b1443dc6bc4e4a69889e3f2b070e37e2b2e2a8de83f2abca3095713bb4","0bd75aa3ce7c1bb233ca29713389cf31cbc4a120d5d23259e0d57812cebcb88a","f9d0dc2dfc9674ef8e6a4a95a1b02475737c57d732baf71e66cce854e9943893","1fe5971464c95d43d6b783baaf1cabd7c7dc18a01e61077328eb69ce422713df","ebc21e72f3dac91cad3151ddb0bda00063abf1a33026e9be567bb48d85425afd","506f2dd82ae2d9db53d80e21068cb73c483627bb0ebcb8755e93921a2c37b9cb","dda0cd5d22a38a21441e1e20044d78d74d8155b536893fc344dcbc527ce53538","e86d6b8729dd50078ba088c5074e1c75b89ac5d9eae3f23bd40e836fa0fea955","7c1bed1bb84a5fc8b959ffc5e5ae57292e08e36a50e382bbdc41c17849a3ba33","366da5435836cb0b67247c1a236b449c61aa04fc081665fc7167d80f33fa474b","565f1f221d85fac877f79f93c28fc707c6bbdf7d42fc863aad8225378e4d3d5b","4433dfb23dfb3d272e5909bb251bcbdac65f2b82b407c877ca6ddbf18906e1f5","ebf38053e880b270a69df4860cb1717c456dfaa319d48c88ff49dc45d7134491","1f5973936b80ca510f224b60f2ba970d166be8d8d6fb3ea203d6ad17b10eb920","b2781da9d5cf5888890a73965a934b499c1ea1c40106e51eddd583c0a9f6215d","23f02e8d1ee8019ff837c24e861dcdda70ba155c16a5d157e326cd24a2f9410c","63d1a37fd0a3f25362789d9c8f5c7b4e7cea5ef1d7cdf21912cbf71bcc387403","1e8b2624aec425d4735d0f70a5d6cef1f46ecef33370572f70143ceddf85987a","4794c47a68f28eda1d001528fcc5a5fa93f079b3a44d3f97c37d29fa00e93c72","991f4269755278892fbf4c2e2a5d0882a77181310143663755f3b33c71edfeae","b6633c7eae89dd869110002a5c7709263a0f92d499350db2dd4660d0ea81f661","28caba7d9bc8ce812dcf2dc0d27e2b13fa12e75b2b83d3598be16ef3d10c5981","f59600f5278f9d6a8e225ba309698c2f051fc8549c6d334a30f3570a7c83e917","6756086988b5faafb5b0f605f761cd13d4878dc0aca5700e62a79bc3ea6673c2","2a8239b8bee35d3c6793237d428417773ace21b0db27d590e2de4057be8d8d40","1ba9c459522f344c0c069d59428c6fb01bd73e202f8d3d4daf5f5401e1c994cd","103790c6f7fbc7475796f802b76a9412f2a9d1aec6b3412fbc73ee1ae4928fb4","6cbdbaf73d4d277154ce14c64151df4afe8a3d23ec97e7e548f1aaac7e1d035c","2a8e824199271710a46286173586b543ca0f413aeb526709fc59045cf044c44d","3b468bfdfbdd09a05cfaa50852b205f6a92c3061596081ba26bf61f5d8259ad8","4a65194d9a21f30cd1893c51b6bdf2750799de1183d7f9136631b7aa3997f83b","9c161d719370686a2fb3a1e18408938523d34a90edada4f5798b0c2a269c2d3b","879b90e29bf14a36ed7b02576c23d61a54625f13369c98cf1af58b5a96fcbf05","7747c9b8f6df3d22955e91922bb4eeab2dce74a1909d42daf93f5b2015d6a77d","b268adca56e4c35d2194eb1a06c289180078c5945e5a889ad4ad3a218628901f","5bd3f45bfb146a939c3e0739f9f401358c4cc3b69e433b0234b8f26031a0e300","6834a8a5a3af51d40e5536e8929f9714c5e5dba50aa84d7d64bae9724f2b8d29","99bc165363dc39f365aa43cd9ee1e8e852c90a75ba331b61e80b86e6ee28c1b5","04540d97e44121ecd74d48fbdb2f2985219be919b7050ede44a1c147bcfeea2a","b2f527d9297256ef42ec14997a44d4a8a437ffdb510886038562642577ca4c14","e8ac626fca8bf70c8bac17648af00939f0e10034968f90fb3b922ca1f4abdd4f","ac215a4bb2a5dccb63c39a2eca31a4bf3fd5b78556f94decb2b93909a4480dcf","2a31e762dbe9043386a29a821cde9c166720e37d07718d07b55213db3a581c3b","02508a12e9723c1d7eb6c7920497ab272bc025e0f69ecac444a1c9dd3bf9c6ba","57fd9b484b42783b5526e30aa8c08d85d013d30be9f68bdebf136871a78c329e","8be64f740292d91daa049e86c60a4cc955b74049ff5a5f4fa2965bd4b955ece3","6fb94b8990499c41290557edf0df00b606e9d56f7af65013c50876a948d8faa4","fe74d49fff1914ec5ca6b8f3b7ea5f1b92ae06f9d4b4c35c7426ada9c13e9e28","a957b7d186f102423c7d39df1bf82ec6b9d7fe77a575e218dd32ef58eb9934b2","dea7f3ed19e4d06fd55e8d8256811b8fd6d50dc58b786162ff2b1dc5fa5f2200","1b191e984687cb10cc1c649ba28f02983702e1baf8782d641bfb142fab1742e4","2f0995efcb2d2d9d3926adee3cb523cd1bd3352be72a0b178cf3e9c9624ce349","6da586222c97b893743b885bb6277102a2a6e5b0f4e8577e3ad18bf43e1227e5","b570feb7b4c854a140935b360f9034a36779c49518cb81d9bafb2846f413d8ca","c48e28d82c22f46175446a0a9bfab97d8b4d0448d30d6512356fa726d8613003","36d655378874cdba5bb48544f02f261566e4b5fc9da6d059568aa81b9490e2e8","e9aa694406c00009f8bb4a8a29235f219b5cb81c34184bb3ee957764918aaacf","4dca5a6b9792762913ae2a230b782b351405c243244c35ff0a938347144787d2","1b34b58370cbd65fa5a3a58838c3961079d28867a044a2fa449902fe6a5998d9","3b5f09f2d45536364f060b4406a9e1ff486ad4e8329efed439e79a53071d0cc1","ba61fb4f0972446e14f39d3408a9549c0023432825f08aa6811dfab24bb636e1","153574f96e8330f81f28e285751552ac4a2379858942c69012914815ccd716c2","a8a84ed2ecf2df9e2941c4c0ce1f6b6fd00ac3e31a69bd014880a2a56ed465a2","ef73bcfef9907c8b772a30e5a64a6bd86a5669cba3d210fcdcc6b625e3312459","b9307a714468f1d53e3888f7fd18719e29857ca54bc964a4f3e97581d35471c5","9302a2ca1446eb9ff0ed835d83e9d00bdf9fe12607b110f08fcdbebb803df5bb","a04d7b5676e809e29085c322252439ed7f57b996638c2f077ba4e2a63f042cc2","704e86d5b9f3b35385096e4f79852ca29c71f2e5dfa8b9add4acb3a8ecf53cbd","e16e7ec79aba204f9ebf0d4d774bc4d7848a93f038c32f6c4d7c07d4e3a1a4a6","63ea5c2fb20393e1cbc10b73956543c41bdab5ad1b2e8204bbc6e4bd76bf0536","325e9320eccca375490903d900de5c4a1dd95e95d7265ebc60191f9082c55335","71c69199acba2b94fa86c4078d0331c204ab066126baed6d1e907139f676b04f","40f334ae81869c1d411823726468ee2419042fdfaaeb8bb08fd978667450e5ba","7693e238512aba0a75f69a3fc491847481d493a12d4ba608c1a9c923d58e3da9","565819c515747bda75357fd8663f53c35a3543e9e1d76af8978227ad9caaf635","6ce476ae2e8842f8ae197e0f3a5410f90e25c88a13fa2549e82f0c2f156301aa","9c1d6adaae12fadcc7f140197b6dc908fa032e9815f2385f2c8f3ed942b8b0ec","58b2db72d7c5b85280aaf427c4a4583c1aca55338cc06251819de37d81591f36","f369dea98bf5569c323f39110018bc30696595504922861cae1522918c9e0701","9680eb7d6043a005972d9241edb571ce9fefa0fb48a23b992c2c9eeef9ec6b76","7fc7ca0d2e6dab1e2e2d0b214f651498d36ddd3ffc7f839c79529bff715eb15e","91dc72de609fc31f6b5d86741abfa61efb70a56c843e160182a5bc1a786d964d","2b7d8cabdc3ee40c9e5ed3876d8e9ba2f04a0bf810e2babdb10dc0d371686996","5e14d466f5874656e7fc9588f41ca3211d8f442406bf82482c262ad59e9b43dc","4fd346095bed1cfb30362b6209da2dbd5534a27f49ffcea8e9df14de750fe8e0","1fd4841dd3b6d2db557581341f2ced2f1e61f93c3383e24fa5267b4f50273e45","f367e0c6149f2418d558aec4333d98a3f596fcdfac5b92fd8e79a835a7c64b5d","3541ec2884b8ca7517ce60c453fd73c8b44ac57e6e6c511337fd24ba9ede8561","70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","43277e48c8674595dba4386374d23b4bfbd144aa6ea42468405050bfc8c7b0e8","e048d2edd3109ecdce4e2d99eed73ca7985e50f588715d44c7ff5e095fc5b732","52bc541c29a2d8447eb18626f15f1abd8a4a58a0ba10d98fe3957404a5cec8aa","636a9c35a77f98cf7f6184b0ea3e67d80ce2f5d7d22c45bbee18b116289447cf","4b5c428a7bcf55e0a7861eac37d9e5bc016e88980aac6b27d02a19e7857f5841","457b48e9c7ec77f5ebe444ce510446d6e35dd1fd73eb31bbea6ab122c5cebb0d","e77d57ae9bc251a02c24d4d995eaec8e2c388ff0db840792957090e9c82ff6db","d34934a86124db940a1b1efb1c419e55cf2bf691a13641ef59abb6c98f9f59db","56a6da917e6985cd7f86fcd6a15fdd6050ddbe5bf314ec2a5396402b83bf5658","706bfe9d17e578e4d5f546c9b66ae83fc08a86b2e2c640597dbe3b5666a272e0","a085ccbf982ebddacba7635b833822f6b27f5ee68f91dc7e664136abba9bf17d","c9ff694e13f713e11470a8cad77dc2fbcc9d8ba9f008817324770db923bb2b52","e648cc0ba42b6f18788088a10757b89e33ab9d308df3a5cce8b8e7ff15e2b22f","eacb287abb4b8f701cc2456147626a8a1eb1a84578f3374dfdf3a5cbb75ede9b","caab59bf0e413263ad66204778233764e67df58d70e41f28c1b58281db851351","b96bec9e77061e5853b4fa63d6ea8cf4250773702676e300420b7735c34f9901","8f393ad285420fd008f8b4fb6b5990e19eaa34b8183b46d9cb720bbdcaa7c31e","b6a946dfb7e34e51b5c0a29396d0a0d836a921261fc6bc98a8f2c21ea5126dc7","7705bb666bdd4085a9787d5c2ac6b23020b3246115eafcb4f453bd9c1448edba","7c52a6d05a6e68269e63bc63fad6e869368a141ad23a20e2350c831dc499c5f2","9a31aa1eb20cda88b8bb3294036a984a921d64b5e9aa06ca369f8070b2981f81","5d577a6e9a85c267b7f35ef11440a30f88488316b9b770b760af523f34387e0a","9921f71db289a60c25a161d036c2885085cd3f06672d9913b37342333993cf3e","032080b7d162c23bbdfdc18aa87fb8858f6a1d58a0d3756bb59cc28020556cfc","9ac7c4093cadbd5ed6920f9cba6fc6652d814ec9ea0991160987e4feea437481","f75ce377d83090f4180590fe78c9431b3d9bdf494373f0418c58e62937e890c9","6f0cd0e219049f8cce5d0400fc6b8bc841bbfe361d76bdd2ed9a131efa26057c","43ffbc15352ec05a4e5ecd5eb60a71276e62359ff3c9c9d629b4c4383ad9369b","2ea50238f239ef3217965ea0a5ac6ffa2acb94bd03a912e7edae4cdb90496b16","44b9dbe317108baaa35f5c3d4a1ab7d183001f24517923396e938040c656e590","afa60ee9164efe27fd39fd758994eb8537459ed6bd9c9f0cbba3fa75a14608e6","809aa3df6126d49ec51cbd7038ac0f2bb58f973e048d2c6cfbec76a8cc67d33b","947a88e2b0c178202f295f45a51485f0c4bc26ab9553478e3806ace398fa8101","0fa6899ee1f2be4f6d8641a444fbf598af4129acf30bce77f27466b3d0a86cf6","e0d28cd0b097b81bf31e230d9296920688bd3f21f54bca7f5a3b3cd4ab4a7e66","307ea4b485b73de6f48c6c41f0e8be1fed56673f584972bcb541fd59cccd9860","fa7d28cc714e9d5256d2d5d2d7895a85e5db44987b41cc39f047598dbd3e3fe0","2e0e61e27e6a2ac52977927088197535eaa62a90638af4badedab162672b9ca5","8a62f9f4d9309bfded918fda52f8360e31b626105477db019af20064b0dd8961","057dc3da750916d3983709948a7b5a6ef9788378d38a60bb7458b30f79101800","566c068aa63e89d1ae9dc45c7375333a7c55e44cdb97c3adba9b7b09f0bd9edd","2d393910ac74ddee8ed6714d156c7155c276dd815f33c114b87d084cde8577f4","0c6096abba365f60377043a7b707e48769bd11a2ae1dac33790d651557f797b1","9df4da519d58916b856971122d79e200f2a3be01fd2a0b4e2a556cc618007824","ad81b0f3ffa13f7c68c494698ab77c85cfc2caa0ae33aeb7bae37dc8737ce47e","9ac5c75774da8cdc4d6e0a7ab1a775a00e8f8b13d26c1eecd13230f3882668fd","7bfaba8b6e1191bd01ecb395930bf46291a3decfca0674393ee35f331e8841c6","a30509a8f0d5edeedcfa55d019de4b5bec780f6fb2480bba53afdbe4dbbf3437","f70b1ba9e863f4f1a3784795db5883abfabb4d1dcb03cf0d1e549ed559ef30a6","de04f8ebde59b71bfbcceec95dbe60cea2d8197693b03a0da2180a412e46c14b","11d4874c85636b1c9bbbf6a158a81f08df50c232b6c98477c78e316fd737fd8c","3274b804e17f5a7cb6978a7cbc81dc967dc042e4d899224af84e5738b6310d66","bb802ecd9f2a095909897120a78a94bed2eb3d2f9b04f83c49dbb7f0a7908328","183e0a4b07d3e6b6715344771e5a4e73e516246dcea97384e5349c42691742c8","221737ac28b53fc9b0849a9dfa5ca5df6e5ae34e29de779ceb240b009f413c7b","2212bb6cf1ad9a7ddef76e66de820e280086a2780f60a580aed15b7e603de652","0fe4061cfe1eab8c542bbc0b2cd2c203630c5de51941d8b8114c4428505d6135","fc48d98061f4df7793e74a5c4da299d6fa832f1a94f888d9e304dca5587c48bf","26a2ebc3e837422909be2e292e82044d96600375a2674d082cf6e4975aab0b4a","ddec19525a3a6d2d5128692249af3ff927989304aa6850a420cea5d655b80ebc","8fbc2183ce22abd6cce28e0be737391132f09449c9312f2deb2c2b93b2762f36","f2eabd920475a6771d78c8c2a8651f44e0e7420cacc29552a7c49eafb5194b3b","f65b67af065b6e88888ce795af1e0d201276d21a8d8d38dbbd0eb5432ac0cab0","2de05e675f52f159ca92df214053286c2a148bc177f2b27c8c1c77bd4b2f19d6","2bd818afebb7c057375c9038483dc2fa1b3a0423f58222e397351e7e6bc40c1e","b68e17021361507cbb11a8c5b1d7291c28e5f97a3a7c24520026b57b37b88629","4ea4c0883edfccd974d63f7a530a61b1584f5b503f6b488ea87127097d43bf93","351f736ef7e100c6e2317df05520090e652b295afa370e8c940e49ba7d98e02b","2609c35f3d947adebe6e486d6d8b5e7b2864a80bb99898478b6fde940ab71e44","012a639df4fdce95209d28156bbe33e6a7753b1fe4cc6b24a59a7bd57d720a35","f9a76bf9c808adda8a018ad18e1c1ee8813a2c3f38d53ee7c1eb2a9130d0f5ab","892b371df653d6787b8449e611c0206f561c3bea8fb3e41eac0a6570f43bfed2","991dc1a3af1fe5ae31575c7942032c6766bdeb77ef9610ac675f5f9146452a82","7409032e1584e62125a2c131f93a61e44d137d031c8a2f86102d478c0f9916bd","6c31318d3e0c181c9b859eeb8730701e7942d521fc9110873c6a8210ed9e2464","7ba9e4a3c87707d2e19f86e8ca04c070dd1c2fafe5517bd6b6574a75c60737a2","bd702a3e21c0ad5d6a109739d239b6f825b69f53abd3ae07d90d8f05d7c2508b","a554c07dd44e34fe953391fddd09fdc3cccdbe291f6393c391529f04ff88d883","6cfd70695c9d8f998fd4a8b2bd55defb3be21b0fb72af3159fad676becdeefb9","df24accdcf6a15915053cb96127f69f7d29fb7286951d58d4b8ca9361f8bffd2","ed85b89477b0830ea36dfa5a5216f5949e362cb826a9bbf5973e245b4bff303e","454781d7230e6210e117926ecd6cc121d912990df56434454763ee88fc296f44","679c5345cf9eff4a5b7f14bd5b89e4bf13d75ade530b8ff8fcb25114b6747ec1","efc83ca4f330b801f1b1244f49dcbd2c3a6864af09468e216a1400043141567e","6d799f368acf2657b48e2d45896914031fe225fccfb3508a87e6670649318244","2a412555ff316ca06ef90dd936584f7e3cfde321d9aab67c7dece93470d3ca4a","8aab697bda333592e3895adf37eb2870d675ed73dc3b21eaafd224b90c4b31b8","301d6c8d2f806679285ca006c6ee74ddd2372da29e018d18400f971543dcdc5b","ac0a84a5b1487392bbd89deaaf75e37ff97badb5cebc5b125816cce6c994dc49","7ac51f4aba7fb58e540e19ab196e537c73ed4e27543b5127b66171b17e17f0f4","b972bef785abdf30030b19f64b568f7952b8166dc01ca4ddc2ac6919a5649a6a","4f551d073794c7367a01329ffdcd70b6eb84fc3abf2c4f0ae8b756fe231e5da3","aefe6c13c54830226ba360a15df81714916458e62f9f212523455a910a78282b","d4083eab88a986f2fcff672be3477a79849f25be3eca5a0fde6d745dac3fdea9","07b7d50913d14676f5193ad47bd45eedd6dabb648bde58ad92a13e62f606accc","9d43ea8889a086a4d495132c55b5bc34dce4e8973a415287e0dda6ef6b6efbad","cb41a8d1704595b290fb4bda78ff88dd45dcdb7a039003eedf7c4d50d0196866","8277897a81fc2a61b6367d26a66dcef94e2dc5db26c485444a824edeb86fd052","3e4879f89becf4fc8406d220c5df19084c89c14a7dc931849452dbe058d85dda","81807c39ffddf0f980ff2c71b5fce8a5f57b6d85ee8f9860a0c00270f4b4b3ca","993cfd2e4619d91dd3b0aa07ef82e7f68ba62f54fee0f98720359ce7b1cebc38","1b6fdc41af60370262aef54e35a53bbcfe9e529378df9d4fa05adf6e7e0e2fd1","5987ae59103a3c8a3f689b0765d3b8e97547d91b1ef4eb45249e5226c7d66ccc","57fa4dac8903d619ba443e1939d22786c8891bfd931b517d2ba71cc9aa3ac3fd","ee390c2487bca09cf2c55e18e929b7f4bf648d83f4bc0f9fceeeb74db84b27eb","c861092c0d5cef26aedf3e55e860183322c74b4ce39f45ea3284b4d8caf3276e","3717cf65a204081e3323d5592b6671cc5b1314a2d2cc96df407adff995f716f3","58fbfe0eecffaf78787e599e47c5a7e7195455199cab13da8b64f26ca928b261","9538786a06bbb280f2e12a8a7a07bf47ca7172253347093176badf449a3d20cb","95578ac9452eb3f422aaf44830dea4704b9f2144f05e88c0000d4c271a9d6589","ad99fefefd8a513e54fc5d2984ef0474ca489f779b9b33f3892c46b9db5defdf","33148accec05591ecce05c25ea0561767c4d971ea897d6339b32deb4b816a1d1","4128d4e6d5485d7b327fb5381d599014cdf529acb6a693dcb25a74b7c22867e1","45f1c50c2d46174c0b3473d23e580328f0cd8356d4c20f0925cc4ad6664f5560","59bc67c98670c8c2e527f4bc135f3addc61073a9c86fd7db12655a117edd4223","3a83a2afe970f19b052a0788db74199ce9e483a63c809bfb5e73a32493fa9480","d923d63fa715a201d9abe23230afbe910ec2f6b9effb9b72c16b7db36840a284","3afa1cde2398e3081bd31d85277ac529e66cb78cba646acb29015133711039d5","78365b5144a60a751277379c0f3f5e9d1a972c305d5e27d58b1ae920cc0569a5","65aa08f2817764f4b7320aae3e380100cee9473bae6b90b049620117db910887","790cfcddd6b7cebbd6d1bc6e70cbdb92acf1b4ab436e5e5dad3437c81a51c2e8","74f567556362194022d151211deaaca8e7c51c4733015be3d0b318df5869eb94","2487b86b13adb4c8a048fd4eb6b3c3ca3fc67e95627504a18d8e868cd5909279","c4285f0b817f5480a4ffe86a977980018dfa65b8918a33af4d8a28150be77869","00cfb9eec13120c639c2ee240b4c0a6baf0604998ff5e515d180de34c8f4fafe","677678c550953087d49ec4671686e28ac954f13840c4ba83383fa7156b455961","bc5ce122aa88a6a2b5a60c538abdd43d2081f1bd7a05c06ee69ba07deab62133","83a91a5dede82dfee83b224e6e01c8ac0c8266b8ec4d9ed5e878b0ebed0321dc","80d210d6e3a8f7a85323e19c7ef7f145ecaf7a29c8ec210c90810736a4a3ef1f","61296e04fa2cb74b694d71d82fcd25416bbbc7c4decebf3e10d521c7fe27a976","9f8929beba5b8015b7e57926f643fa20f3613159d5304480d5ffc9a8f94dbcab","bc58bb3e15e393d07447a3f1d077fa1bac309a2049b8e395ab02fe99ed72f5d2","f11f9a1d67876a869d99f3145cc63cd1db5ef0034cdbef3930366d4bedbb4d60","54152ff949273b841096858c4a309b872628e1fd71b5929572afdbf8e6972ae5","dd32d08a01ce09b468568dadf41758bb63d3df642bab773b2079ecb0385b589d","92307dd94cfb0ac601d622976f10278624679021d9b4c6f85a45cabf99ff11d0","ca89bcfc267f6844c95dcaf2952b161abfa88a5d6c30ba1d63e6e784d7fc90d5","13f31e7364ec733edc229181e844f27bfddb8265985fca37c2bfc192ae6d5d7b","69da9257d179f2dc2e1bacfe8852eb4301fff47b438930c1d275b949382fd912","4aa45fe87f629109259eeba322b63f4be0b35ce21fe7b7c25aeac50ca54353db","7def5e85d7894881389b4bb75fcc77bc15e495d6fe0245865405785b1ca9ae6f","16d160f0397cdb35f79a6d6eb3e2b6c059a0557fa0f67ac7c08b48eddaece743","9a8b68f6890738b4ae116a662b6b44be7553892289ad6e1fdc810e4b193e02c4","810e1af2c399ff6510c4e073b025e8af6d5d8fc848e134e2d20159dc5e704bd2","51cb90bf50d5d2a2d00c5f545fda3167783c22b328a6d33e429392b93d516209","5726ea415eee459efddf8bd50c10f7400273a57fd8dc3d57151e652b328872fc","7e2ca088c326d04643db1c30255f7ec1bede74c09ea190a351869734d8aa1085","440eac6e41fba99add73b42ef4e50da2f008bbe114e2c62c0cc303cf328832b5","be23453270bc854b23c04fc64676578a62deb91979d94836365b0ce95ae8245f","cefbd3c11ff2a8d66c078d323f8f3394a4ecb324d05910e40b2fe15e324c7b9b","7d4f144cc3bd5122b4fa82145a64dac96bdb81335a78effa24cb473bee4ec3e0","699eb3908c4db81ac35f40f525bf052f0675479474a8218d0ac01c2b839851da","dba61a7e471bf5151825b2db98cbbf08a697c8e30e3d3323c7d56066df0e7375","847ab80030c5a0570704af5baccb5f79da6245a540a25c1110575bdeb3194288","02d17be56250c64e6a82c05022a03ed450dbce24fb5078964f29e3e2568c004d","b7e4785625d92f0b12ce9302e34f4dae9ad98149e6a37fba6b9789105a56c217","42627c2284e23bd6970ea7ca521469f140b6abbf10286f31bd002b0c152ca63c","0937afe2eb89fbc701b206fa225bccdf857c2a35932e16fa27683478ed19364f","ad58a5c0408f9297576a7e5e8c63189a0a93bb2b33bdef332edcef900ce04d48","a62dc16d997566082c3d3149fe10555174cb9be548a6a12657cc4811df4e7659","af48adb741c6a7766ca7baebe70b32109763fef077757e672f680ddcf5b405ba","95f17d89eeca73b054b34f26d91aaed589c556ccac2ac8dd1a59cd8b9c7517d3","36d340a49463a448d2d3b1eb4c2a62da754e4ea09c92848c07d62c8d3b3ddd64","e5311e43122ff95645b583a1594471c4ada8ee2e0c915033310f8b6e35faa2b8","061b29f5901cf6e5075df73eaf060940684cb5fad8cda7daa4dba5d0c8493a81","8c5e22bb09bb7e396fecbd16438342715a8f2f8d747a0b8264c82753fa610f60","5562936e2855eb85ce404bfa74d2bd678340b0e188d9ee51002ac4bb0f90efd7","580ae46fe43d44fbfbd4e892b1b138352ff446e6acd53c0b834e099749da75f0","f964c8f47956ebd6790b5f85c753c3a02ed97f80428d458da112701efa531e86","82fa37c8de2b352f1fa687c2ef167139122680e7e33b81059e196a79f17ae3d8","d3b9bd1e0e7cf1110c72f2c88c6368b3482339597584ee92c40eef4e1474dad4","1fdcb5089fe9fcc3a9870d120db60cc99aaa60c861a7751ab04e808cc8b41fd8","61cc506c619fc6b01125bf85429977d0ddd8ff85eb97c2c44e76a2feed3b9741","d15a2ddea6ce8acc40d5066fc6606c0506486e95ad2fdb8334f727ad440668db","353e434635d5413f8cc0cc02dc014d2e80518dec03beb42eeb48edcefa3d19d9","993970369eaf0685907de6beaf02a724bc5e825a618e727440e1c70a4d7aefd0","f5c87373923bd38aa64e582adfe18fd1121cae948d6b14b22e4b212402ed1318","0d6749f9522cdabea764e7e4ef90f36d15cce8d4d6a130d82de493a500495ca5","81ded5824e3256137844d3da9d5e9dac2ef174ad41a23c47fd2aa92187776473","bf4e62a7052096266a9ef000a860c2dcabc0d8a6e99a491e1ecd849e4eaad4e6","541dce26752db36391695715fd07e23ab8365fe8f0bfa22fb1988040647f7220","addaaa4bdc115c69c6e94cceb4e9a78833360d0adc0224cef93c8c0533f2010c","4a72e6dbaa0c1177d98da86f72fb87cfa7541bed8daff5151bcc2068575bd5a9","93c3f399a49a8f0ca7f59b77b20f15e2ea646d76dcc1aa67b016620b77dad7df","e0acd5de151570de992d110034fbc446ef313391b96ef11fbb6372f24f4cd01f","805e47ccd2aa1db4d5c5b441626284bc5cc058ee7da957277f4f13822dde14ea","8320ac9d1af2097dd0f146f5a61cec3188e1fc87c8b06150d56440a37a21aaff","8808c90d091012683be4ed8717a2f60cc950aca514c10b43c796b76d73e37b8f","87e745ff1915afea3cb75b74d79cc7d113ad4f72ccc31fc3f4acdc1e53f6d108","32bf1f74a876afd0ffc272e5b3608fecb1da2da3bf29abdf0b63fb79a79503f8","d2998c46b1c0296e7832b6742b2079bb5d95208e9e00b668841223d964388c5e","e63916b13d1771a1a4ba88978e04c9095aa11bd71431ee35cf18c0641f5ead90","e06a8867a9a2ec503f9b8614734bb82e58824a4a2eee94cda1f522767993a973","a8d2a8105510385c1581b0c4e05b35d1421102c86e7d6324c44457f4f552df79","97f3466a11a1accc2bce31ae2e9cf47cee444ae965120cef52b99e5f79f85255","750eb28a121bfda70e7c697d50f2df3363e9d9b2b74c81088bec2d3bc8d3ad68","7b8e0925554e436b354b3673de07547356d7985149b8babbb07f3c09782122bc","676b6c65bbe1b2284c7b30f7aac6300ca8131267e5ec65155eea7d4650999ea9","d2b04e90889d746abf99b4c59486793f9fea741b705cfd4edab3d509c126477a","71dfe61836aa4fdb3caa716917af367c8ce5a14b34feb092b6f6828125477efc","dca0b75bb270baf50f0c2d457c9554af09f04a96c9a30f24d9811821caf60d2b","dff8f02234faac11ec1098f7813a2f08b95b37d472a8eddb9864c2947ee28446","3f57dd7e6f67221339b13bc2b288d2b2cb4b3a9260f3f2d381cb19e046682dd3","8bafb5241d4dcde05aa64ea393dc9b683596686885a21d700d0731b38f1fbdc7","502b5d9948de17a1358e68b9ac80dad58590476184f314b2e440d381aa969745","2c174b1dce71b4052fcccbb84bffbd41fa45e4442e183dafee599238b770e869","32e79f2c4528ed2ad2f11e7ae0f1b565b0010666bee0053e3eca1339da6a73ba","1f222372836b1ed57997de12464e9e11dc91ead0c077c09520b48f81da40b9f4","8941f30402a12b791af6873dc5f67262b4aa4cc02edf5bf3282413cae2b3d549","d26120f95eac4a74e51c3e64ad1e6a32c08020c5ec3338e9410a65a842538ce4","8d5e423573fa5dff24971d868f62bdea17b9b4d953b255b0067d312f02895ebb","ef7e6c333c1b36eaa8faa36accc28ae350874c80efb77c6f1e33eb8b5b4f019d","a8b4834a0506a47b4c7328f4477e41c046f5ec89975577c32a280cf895ee9b72","a8f7305348698c11d9a0fc1839d4cbb094cbf31cef96ee76bd883b0e2de243f4","352676f620ddbc4088b0978e85e39a713a7a470175b1e6c5ae3fd4dfa1c9d651","c70e2678280eb78852223365f81f11c6fb904daa0f22e9672b83bbe315598971","401edf8f46652f4dd13a4358b011c8b887f43f80ea0c5f6f082048a622368262","b5a3e5d212ff2df914d6883e4d0b46fcd7ece4933133ea816ef724423f801af0","cec7a459158b8d3ebc89a6beb9302e3d3dee70a02f9989baee7f3e426f283c79","d62a65c939304424b6d6b08ab97fb488dad098062c5ae90a64ce6e3f6b9a2af2","47c250c77c56a40fb602b45a7515ce31f2fb83417c4a96eb4039fdcc2895309d","fb607236d72aba12bf6df811ae50b7ac780a1ec06239525c5aeaf5be5ceaf3b0","3dd786a4584f638ae3fb03ff809f138ce8f4d8e6e879a52e099cd33d4507ae73","77f8a059d495ec349a45ef8eb635354a8001ce9850efe778c71a98e0c5cf3dbf","09db36cf75bc53cd67d8fc8722ad858df44503d3167b5d49825cd4b8be6f4076","a914d868f9ec6a488ebc253461283ea92009a07e9e0167abd36caa082d6d75c4","18a90ba9f0553410e49ca8ce8705cb1ed22cb17dc3a4a3300193c9d556a8e18c","cc62668f61863e8c4cfb5aa7edf1c675af6c770167861148223f74d6cf4a52d3","c81f6bce73f3c3d453a012ef6c3d0f28567f93cbcd6a9c6d2cb606e8d3a487a3","2f1093f976748f8547f255295159608a00b8637e64bec75b73b5bd4d19aae341","a11253e1d20bc720789d85374a8f3bb2fb2db3d8dc50475017f1768f9adf9484","c47b2c8b92a16e532389b929c7dfa3ee41d47b69ce35c83354add05df0e99ea6","3b73783154d7a87e5952b09ab6e3d9d77ffe5e0c7120011d7eac6257ae55c117","4a7d382abb13d1d91df5cd1696088416ca976240a96b1b87fd484df2b589a875","aa7443532c7c4fa930709fe30e0bf642e4040867b0c180278d60cd04f2832d20","8520f763bbaae7c1997fedc505a40ad09b2662d36ce8b618d2d35dfa05529810","17c23451de85c6d5455aaf5719c4173aa4562fcd163fb5ba72a6bcd222741d4e","22c59002db018591b625649fb9155c49681a529c8543ed37ee4c6e6d17919f31","ab63739e2f5354d2829ece988d74f377ffcfd9072580c43878ae56c20a15e12d","fa9759dffc468c2764f1c7862cc642b4178ac3f4bc5b786f70d81f68e8ce4cf8","8b6a017a2b1d83bc1327b484bf2a223fab583b1ca750f11c1c2bb4f74522f600","8c3705c30437203b2845520c244c167a498ad4ae4624287f11429a4b424072fd","f408fb593ad8b84ce2ac6040641475658060fc4c0efb24cc05804a1e45ebea88","22cf1960752f0124003fa9f7984d82733019da709bd198d6dbf98ed585491387","1707af876374f577f5b7ed9993a3715e192bd9558a0b7df8206803dcedd73fba","ebc138e51212ed0f884ac5310237298c50b48d45b7902597f85604ad6851cff6","66c469d11bd5bf22fefd025e587f0672f5ad21bf2095706be89ac0afa4111eca","af357489e64b057dc99b7f42852aa61972d1db4836a8c284c88db68ca8d9abb7","4cdbc6e2f9ea733c647c4f134b3707a66d7579455e2901dafb79f93d9127fac0","bc7535cfc05c12f369a902ec94563a7fd8f0793a4acc327942d4bab150d08195","58a4a3136766ce6fbafc0849960287bf280379d13f737d80183f82c000ca9251","3d276c4026971487be0dc16fb160f784216d19b79dc551ca9df72985c6a539fd","a9bc176b0319da66a743b2f33c4db80c46cb57ebd82a8e0aa188995aaee2219f","89b20c074a5abe9208d39e7153ab01726c44a9fce77e9b46bb86f3cf4882ad0f","7c08e5514a423ea5d08163cbc21f3858b9bd5a7dd233c93f9dd8a02952f06db1","f4e6184e42a6f4b0f880e7cf8f97d67f8f2479e0394416d4f166aa2db83c4cb7","3eea6cbdf32fce708775ac2c4d8dd9faf964a0408ceaa4f86f3ad2380b8bdd39","127a73727ba0f2ab580280c8a8228762bee9d33a1cc58b607132da57ae0b274d","7db22639eeacc5a7105a692bcaa13de10eb49382a0130922dbd7a3745a2c0f36","311cccecab649ce5438dfc8d891bb192fd9669fd0a58d9b8b09538978247610c","1727ed355e4e8509313556dc0a0fff5b5e636b49ab28f6bc3fecdce16b96c7cb","cf5e6d1eb6d851978b44663bdbb35e38d3cb31a7a4f787739a2ccfcbabad5176","b83e8b7410d25112175c0587ac98ba439a481d238a3bd1046c56545ef7559be1","72e4a806db5cfec09a48c5a87a242e6ac4d433a79413eb8cf0bfa9527f9dadc5","f7cbd2a4d0149c99bba024defaaf5f6d87ca997316d9ad1c59336d7b5f0e581e","4cfa0530d70202980104c4b0e5053edab8e9b05534b74ffe53f39bfa0da3d2d6","e448f86b862b39e330b447215e46a0e16d92e0000144b7c6d7a4960ff7eeaf80","bdca3a59b1340b9ba7af4227ce500f2e1d27a8236c1bfc8d9b41a472736de1eb","e6b455aa6c2174107eff901037ceea8ac02d2eb141c9399536a627fbb439388b","f5308c02a5baa5114490988da2aaa844eb9e2709b1adbe02661f6a5a5920b12a","dbbcc037763d1b04677ca9547b511286ca031025df934efeff142ca4cbd8c137","7a490adff5b0556e77a3f1ba9673285d7caeb09b6eacfb0152d38fa4b02e6027","1e4ead35526cd960fee44faef4725f27b3ca29363f818bf73a76b33d4e0750b5","678f81852d7e64789179d255632885b66027cae24146088e0061cfacafee4152","2bde46db5aa261028035b36d00066902d18d8cd9b51e933c96bcf2c94d0fcc23","171792728ee2bad492204152640940a15304a58749b57459d49840afc9c4abf7","2eb627a4219c5ca4f4f99372ff8e7e5d370b862d3dd0f6fc0b7850601c473b46","ce3c9f232251b63c14fe658bc53187d8c3ae9fdb827e3b2d20aed8a276af3bd2","0c3412cd915aaf6145bcae2c5730b733ee717089c6fe14d0182d2055accb5500","827894734dbe5f52db7b7e86c3abad26db08a0da63f0dc6df2fa10f220497a8f","6a50c27254f43a06c80822a0645c0e8ec85bdf9c111540c6762a784a588c0201","81cbbaf1089bc937bcced90dd4f018dd0c11bc66a234e06b4dbaf8932e86f512","4d64f3826fdf9d29710e704f75dae5a691a9f3210b5c618a72733a104d199265","5a7ed05b0b22c78aed90091b4d11648a8162bc78db40a5320806fec074ffddcb","5edaecf61850e689c92168580fe06fe310b77280c3577e85fa937f4ba1986671","59bd2fca2c764fda52c249a0759d3057d6548606e1b628409eaa0d9c9b9f759a","6ef10dbf2980f162187038b1a37af5c8ebc1375fc1d8517697efa67f88115704","dffabe54aff3652fe5bb1577c95c05326efc4fd3f768fc4270bec3c8434931b5","d548ae7c6156b677da39f06d228a89339765e2a6762f5273e71932c247f342b7","78abe66f2e8762318d9f1d16c528db84a6fe52de595edd0df44c3beb50b8915d","f40cf16f9b6d2274dd6ad83e0679d51de268548c2f4b3f64a7b85b025edaa705","00ec15c82e4e5b5082ee95f281878201700857493f9e617a6b1f1558054d16db","9b9a21561e1d7c677b1aad4f58afefc33ad95dc9d73edca892827b45570c17a2","01a54c0f358c3c2f704c1cfb7a9d17d1c1181e3402cf75b827967a4880b06d72","a1b428dfb854a2df4b9921c0ad9561d2b270088f41e6126c935ad7e74dc5ae4a","b5d04666cbdb15c6c672a78765c0e80af9b689518b9f4e603bd5d47fff789e8b","3a78bcdab37d955b8726e540928ed741d1a5546dee6ffc3de9c9d4ad834a1437","8fbf3eabdfa459a67d9f7d25d73a5ab4457bbf2704ed0225262bdf4d1f64e9a3","c02f0b1b01ef6df02734f8d776efd371efafbe4a4da559fd5e597a97005a2b7e","75a50890f1ba583165adcd02e72a62f68e733ed94e6919cb43f090fc9d049b6d","ea23e5ccd5246fb2045a764b0a1aba6cbc8566e68609c7b5f4e6624aacd2acbc","b60c07967a2e81de5ce56158282e8d074867c6564f281d98f1b5114f67ce3d65","bf96e3cd8ac82645c19c2ff81770a133c75d54b0ee98086bed5e6acdfbd54f6c","6d84b7cb7e4d9db0ed8ca5ab79061661f6a4e9ab1fb9e44e2df551eb1c5affed","a85c592d9405f057e7b69487baaa2f75c6e440bf614d24e39a109cdcfaaae65b","97181768db0a446bcea80e6449e884f6d68d85e324e4ea923b2c3c284ab7b80a","31a8272b826e3aad468c7d378faac6bd584a207c33266e293c9a365fec23f3f9","ffce3410bdde107aa3190579db2cd0aa1c267ade3162e984febadc1a539e489c","7ca5cbc45d37cd33c255d0911a1cf346f94a8c55f95714fa1db723e69367d3dc","55584d80df8d11a0029d486e5c3f2139736136e6e9b5c105b52ac1f711d22afb","3757f0bb44d316f49f758dc88819ee3e56b31ad4acefda195cbf6c51ba7b7092","2bc76065771be133978a14314bf9e0a562a28377b113852fd89e76406135dba9","e759a9e1319a000b078c5c968929217b856091125b1e025f2c63ce4edef57d7d","f2c969536e3b97cc4db373d347c4780cf0e0a0c17befb7badc9b5dbad7652fa0","c0f7e3054a476fe3bb35577b03af576cb2c9d0054a687bc4dc72cccd1aacc65d","fe990c9d7d8408b5a7e897b7bd705bf6b547c65ff20b450ed9234ecf3dbeae7c","40d76080f9e55d4bf608fbfa425becff2ff14cd83821202e283626359910a59c","d791919d7f29ed0cd5c7f375d238882dab29a43aa07010a967c7e0cf50a2bf4b","79cd9ee099d926504d2c5281df43e3b013ed1cdb413808ce78c6c8e41a95ef07","e4eceee438d823c529f596806842c342cd8620088d41ceb6b756064c664f3a08","5ad5ab6e4ed985a205b631c9deeb6a47c5f2277fa550f3dd30903dfd30e64e46","f98905b0043d1c0ad988a9cc5ab583acec308482d2c31d31da84c0616f2f0d64","ec033abf3a3102ab9cfa6a9e7dffd5039d4cb7cca132ffd26e2fe83f4b3e7861","e1c948fe8884e496816f39c8798c8588347285984778dabc77eb56a0cc7f4315","291025a5b950003bb695197781fc77b2a1fd0eed93e9176ec6e1e6a21e195615","ea6914af1c8816de78e112f4a825aaa8ce1661cf3d002328fc523ba9b0fe872e","3f60955be9da72f0c8c536b5b9553da1d499f91ff38d844a5053ce5cd87a3b79","1761017a42df74ef2b3ef3764ca764d1b843ea377b5042c7828d3c81af498a94","c798189a7ad24587872bca1fc8c7b986b73297295b19a658a5e80c92cb05b974","b09e3038a2b6fcbe65f6b94dd22bc1a0ba835a2e3eb45fd8ba168c60454268df","4c7e372a8042e2e70fd52aa2668d6e5b892d45cb8519e1d02e69417bf5494a56","766d958840f9449394ff5ee9ac8a4c4ed9d86d65c2a387a0c2dcf728b1ad1c93","f0950ee2de5b3dce7a7bf2907e0f0f38f593611a79fb8421e93c097bac63cf54","a3b36911d8bf20bd2f3e43e3b2aff8cceda729f7fca3557e469d5ef3f23f37ce","ca9341a685db323ea017a909cec7162778e0633e007f60032d6995ccac7ccce7","22f26a9373ee588b1ddb3456d839db953fb3c6fed72e25d31c3b582f0136dfb7","f8d698c6794fc3c5116d9af4b75b674942947a58fb689bb9e93b30fcbd12912c","cec4677c54b7ece2b415da069a5b88f9abc1c1e4074199d6042df2396e9c0f9e","e9e1b41a02b3114837eee6e57d8a65965b6edf8e82a406b19595069273c73136","c80708b3a474b746a3fe7b5848f39d55bff904c643901eb74344b7578c75aab2","774f43648cb10a2b999b38750e948c662b79deb59996a4bb6b08e026e888895a","d3b9079ef5d29d89219767d9b063331a74ab113fe837e620a02efb7f5920d7ec","44a1a32a8477427b076edf7911cc008fc9f01ed593270806812d673419893a89","3272ee1bd9d15f9c5b7ee04e78ad993cde0e9fe840cdb6745adae4309f1d6259","6bb62f95f072b3f9e4ea992709d0cb0b5404db6e43f276e18ff840223aab6e42","768a7212136cb4aa385d635aa76def2fd7dea8bcd8be7ce5bec96ad7d8f5f314","d43d918a425a086113ee6cc901185771c0052b9a8568fb240a1f6801e7d66cbf","28c2481527e93759b7a871a62d79a23aa8745fe9c4f4465ef688d84ded0eddb0","da4ebc8c9666e0893aa19779a33a9af11e3e1ececd858ea10e27d071f2714ed5","d6a50ecc2edc5c8d11b26681726b74249399eef9978f853545c099a2edd3b434","cb3a04ad5c0a544478a85baaaa51ce6ea17e374773ac9b35e9c4fd5954171cf8","4caa861c4e842f0613db58a66a005b3fd4fcb0a89341922d1dbe055685ade863","5380c75f0cbab7c65c3cbac98e1a1800bc09620e9650a27490e91ec2b8030f19","6cc24df7659c2cb3807315d251ed8421d9189e9611777c5047c1ec83936ba4d0","8c5ebfd73edb27a76e83f518b798e3d0b6ea084cca334d4ca88fbc8d9ba7c8f3","d3f03803d9165bd3cb740c0b304657adebb48bc2b92436b0e9ec4a1e6a14823d","6a18a20d75ef00cb5a3915746d6ebc092364b49e23a76286a3a5689e36edacdf","73bffb65085163743ca7cc23d7f02ecc8e2fca1089ae50b433cdaec48c3e58b6","013600ce63487c1696ea3b4cf60f401cdc24e74d1b0ac836a0193aeec632e2fe","da7f7f21cf449e1a9cc262b43c4fe9f5d272ce4c54dc972158f9034c06c8e68c","bb256b10066e0f4609d77510bba25a7f24325d81dd5315c70e6666dab19ade01","9c2faa7239c5785950d9852f56ddf2c66adc00f2279faca943ac6b283ae84fec","876f27bea23ee1bdcd7ffa26b38e150a67b0456c509e611548b6f986a7e9f90a","5890dc25a35e8a22b60af24aa9d04c26a2b0f2a8ee9701431b088c83fa436afa","ca9be90bb0409c07e622a4e03b968974c5736cccad75533c60fb14dcbec7c73b","a5d2e760f70944dc42357d7b69e86dc74f33bf98e948a115357e1882d5230ed4","0f71d78c1866fff1148880acbed18aaf4ea3d6fa13ce7e1f29255545ee9a1f90","ec94d5d3a4f131ad79abfade176f9fb7472e6a8f202015bb4f7f29b0f0bf0e32","9a41bfd332d609c5e522b297b604d52c9e7ca575890ef07a6e5e055a008d119b","626b6e595e1482518dbb949256ae3256ed564a474b6bcd39e20b953f0950a8e8","80bb561bd66489e524790d47a287833179baacd89ae2b60532c7f92023f48cc2","456b7187f14e1d2477b74bfa9271e4825bd51183254624b44c5f6005766b8ff0","e4114911dd8dbd6249b4e508966e640e6c8a6d7d6620be759c1dbf104a9b1ed1","cadde74af3321fe5dfb348dc1d72e19c6a11475d990a2809aa8a8a0c968ff968","a1b67f80bf98af46430ad7b494465b1ed5597c96b47248cedae3b01a554de9f7","6e862749a30fe62f5aa92d8b69922c33b204cb3835dc568902f4d41c265e8ca8","e26157bf8b0af813b09249276b4c2790e3babb1f4c6ebd84ba52d15d61cd33f4","656d4ce2f4429e860044aecc583d7f11c7a6e5054e92eade020bc70f43862827","a4d407e4ef081fcafa039e009c54a4af266a61e8a831af5fc8b01f728d90fc0c","261c41c9919bebafccdef0c501c7eaf7034258b3c027a22b1166cd096834556f","7ac116a9a8c012220f82014b63dd744115d09a6fa83021f909c87ddac2e39cb2","48437a6684da92d4047d496da95aff7400e866b8bcf3333d9e625e2cd0dac0c8","6231cded9a3b79d8a9c355048efed866c8eaeb4f2cd395951752cdab6318da10","c6d860360ececa1e5e01a4b39fac1e9db8924627c30726932db4f7109f0a551f","6947e6e701b3e26ed0fcc48d072514688e7804439252b25b93bc2d7ca4951734","da2befd0f2bc68a6fccbac9933710f57afb1a3792d4467f8835439bb5a587f05","4f601f3512de25ff952038e8a74ba39ce2e96a1e8a7c773024e31a6c318e9272","44319d05d0f9897a465338569dceacaee5b7d8aa9883b46fd585cc7bad08860f","e3b9222330621eac375f6bc4b52ea78c8469b4c94ae2a8b09fb1d1c3113307d3","4485370e15e4376b92686fd39336d9027b26b371248e25e1cb2d0244e94a1fa1","99e8e188456e5dc71e60d7790267772ad0f22e854fef5d40d8ecb48981fc3296","b88c260399542fb51f72a67584d6390c0e1b68c361b3b927e817a57f93121148","b4d8db98dd156faedac67ce5ebff025cde23317b4716d4d42a24038cfb6fe4df","4ab1d7449e320bc6372c186542ba1e861afb26e29ba80d8d68c679ee6588df35","18cbbf6b5435252e0b8e76b51d80f697d188cc6cc023265982a83e82c3ad59b7","f2a48883bd34468767d72a12463abc79dfc968713363a28968ed7c20e88a60f4","0319c1171fff27474e6fa314db32cbaf2f18718f786fe2dcd5512cf30f0622d8","cafdbf1ffebb3354670421e295bda97e24b3d947d0375468885b1096408f7b35","e5b4afb12f10959857833694ea01e354e89a7462fc387adf97bfdd82f6388742","7081de963485a95c2bbafea2d4f628f16c08651444806d6d22452f09384a3c3a","c1615996c69f404d06b7f86ca0b7b42029d3e8c8e0f6d4fd0676d32661501abb","da019102509adb46470bd6afe52d8672519924f4aec557231ff73b16327f1edc","ba402e05d468c8b6968e00534fd3af86f676b5b99a52ef38981f7aeb69cf287c","5290526008e8c7c9cd4a40f3396ee7b505c4a6bd9bd49db82e4d2a3841ac4678","7a07f297926b30d80dfc942817a880606b8c85ee77d877163eb8820f7d3e618f","8787e8b8de6e99fe4a5078d96cb258085acba212cc9b46d49e4b795ff97298e0","830ee5a839ffd8a52c15ff221162ebbe13c1ec37a51d1899f15ae2d414bc09cd","ed9dd9b6b7d069e4b326c8a9fdc7c6faeb5f3459eafc5f6d7caf98b23a3b4533","80a24176b55cd831d223ab4cd9845c98e2253b8d4ac27bc4741786ecd7a7fd83","3475b2f9aa9fbef7fe3da207715249eb06e58112c2e3cdf952d271e379dc26da","c60ec631ac1a01a9710cb29a8ca97448989f5d984daf8e674a795c6751269214","25fd1c566cd76e5ef0fbac2527d2b2dd788a8f837ecc4146fb6b5db88f7dbefa","dd926168397cc23b62b85793c28e99f0fe0d0ce2ef59a835138d4acde1af0a7d","b14328208698cdf6cc785967e757ca57ab0f98de307b0e0de4d43fc32b2fe6dc","c2a958791dcc54c739c1bb1a6bf62eaa811ced24939b5dd72ef71e4598cfff44","1bb0e0c0da140940cbb9f677b785ae34131182137b62c710ff2fa8de77fb476c","04043c4fed248b90bc717b0fffbe4d32acd47eddc79342c91670df0f31f9e14e","e8086285cbe7264698288aebb68334c0b1c6daaa4031ab9d711d09096f343a78","e00aed0f8e5f35807d735a1fc5424e3a15fcf4052eab5cc59887006db55d5ee7","1b0a1ef26cf6b0213df8a398691e166dc3aff2e903cb4e366d98caf31c727bc4","b91870747dffc971aa7b42a317570b972be09503cd77b1e89f48c803651b81e8","9d459e023609e74bbc8da58e71d21fafd293bad7130da8fe9c12b2200750ca36","67ffd3a5da2f3d10cf5affc2e307f174b0a6a0cbabef3473e14e63750fdc1027","8f427a8f41df9fdb1e30639596693f8495c7054af30fbd2e4b83d41de7d22e17","1df07983c5e6faa1957e9f19b4b2525b70c381d728517016ade756c794f7b7a5","e65b4fe703a1ad2af90356ced0a7ccfbd171786eb62512b5926384cca2da078e","f48aea18784f156fb8ab21a840f90bdba99a98f30fc0fc559885310c745b5574","ae05df68f96d14bc4d73bc13fd56a563b38dc93cf022b5eab6378a2f52fa046b","44994612582f8d0ca92ad4fe55775b6e33f40ac24214036ea53841053fcbbd3f","356fc6c57f7bdbf7943bbd890bda18f856d4b81767844a3d6f3f8071a4b3b82f","0b2374739fd5153f201f7a63f86546fabd975c86a4fef8246693726502cc5234","9d21c209529f9f10237e0976cc262bb81ad5eb28ac6d188c1829e8057e9623f8","edb30bf83d7ba43b2f893700e135e83c426401b5ad1365967f2124da4e1f47db","c9e0ccd766122e1ed841815a699c453c3267c4c6104c5f01776b719dbd0df457","ed575089e29f248e6b3ee6894de23ae001043f71717ac49396eb3e3a6aef4ef0","5dc803b80e8bb57ecfa8cceb484d0c29be142f5df3b33c9594710b09d6a341b7","86569cc8df5889f3ce6fa0de79866a2d1e9e03348530b8d4c8a06ca05bb7685f","5c09513e6f0bd934425d0d3ddfbdd3cdf4fdeba8a186e903df3c48043116e3d6","53fd33fd439c753899684518742fef08106dc63afcc1c9f62353eff3601e7fdb","9a2e75d1d72d7463cb3a0d4a01c5648bdb4f54866acaffb0360da91234c0df8c","b8a6419ec42bf4d8eed52f187e161b7dee898c96faf691713fe1a4ae0d89234b","d8152d831ceac05eb3318387bb7b63241aa6c718ae3913d9e1f23395d74baf2c","20d7df13f5c0f787c1c7c1c66c13e38f65a6ce33f317971868784f6687ea1311","3b42de7a371ac6face90886bfbb3ceecd9c32b1aca61fc55cf187eb2b0ccdc30","bd42e75f00e559514fd8c0f8b1efdff737ebfd9dfc4d420b7942ac8921530b6e","cb22feee63d3d834d1d446f67f20c8fef997ccc73277783a968050d765679ae3","539a3bffcfa928515e72361427ccb495ed594678afc0d6bbfba9b6a6d65f8791","ddf497fa967334e614c8cab70f2e498ec022328f51e7db6a861233e9edc7e64f","6b66f3c16dd2e4cb7a1cc0429390ba3aa41e5b7769e982f8387efe4c46e467a6","0cda91f6d8dbeae240d4c1ba5ea530206d63a2ae2a17056e6bae9ec69b59b378","83789ad203d0ca497e5a0c3b797b23b7a7eff9b083fbf88db3b871464522e76e","a273bb46ef5465ad1fe1b7bb5b1fddcc119fe788c4e73e226834a186fa052798","a1af0abffba61d11fe81b8338e62f2b7f4e5ef73828a162bb380d9cacc54e111","256632828010640ffb22db386941d4b1f200b43c58d5f08409e8c098cd83dd73","94ba095ba3e0fc474c0106211ad66c7f6c19aad4d62af9427e38069d9c0ed3ca","0ca85d9c311581d1093bb6d76360d6039b0b6e29679578ffe076fdce1ab9c2a4","9e7c4846057815d55e1eaf27214286ec0768a1b463a4669e1ce37849b6cc1016","19087a05c31ff776b0fc4b16617c7898f7bed243d2f4fc38d33896c8c1c6e2fd","c850c70698b79645345bb3d781b9cbcab82c6f94ac1a801261ab0cece5beeef4","a1169652d59c748c5ec81a332734e2eb2a0294bc1abd941e39ddc1cf6c0a3868","44817dc2eedcd14b310fa0e1e3493ca7453f8f97883fed427fe7ada37af15858","c0c70bd2a30bdd668a76c0d4a27adcc7b51e45fa14247eda93c70405438450ad","875389947a637bf9ab16bc873c083a77e4656eece216498734bc34789d86b2d6","9ddf86b119d73185b070607f683dc588264e56e7846170d4f238853e189e32be","4fa5c6721346cafc445797831da394916f173d79a8343ac8bbf183d06042e869","a8c897d63ae6e779bbc4f4753a386389dfc3a45ceec6b6672f55b072d822d302","8fddb452bfcb60c598245e997aa9c9dce14b85a4c2e02489a50d97ab49e9b622","25d505ffc43befd205d780441b0a16e752ec1028f383a55cadd41841d1c7f153","39cb5be3f5302e759253b89f11bd3e885930b5649b840f4d5a81a763a5dd6c40","8a460dcdabe873ab0a85e421a7f339ad74445f60917bf67deed7d15d836b0247","a3b6c93a9838b8c94c6998e85646d6f2d07c20ecfe1e235dba62158b29451391","8f2d349c69976569d4c32e0e4e66598c9688159cac28cde38bbe0039dd1cadfa","6adc0305186bd1f72ca64adbd054b8e5e71f93b1d0623e90ebabf153541c06c0","c85a93f216df4ebb6dfea7ad46c8d6161a0f1948a20967ba0c85f0fff3f9edcd","0df330f74158aee4ce076b0bb15eb53fab95f615d26ccbd6ec6f5c4273110047","7b2ff705f3c3358807afce85ef146b7f7cdc882a79442630b034ec24d6a3906e","344ac2d6764eaa6b23b2e8e736c9bf0ae06a53479c6a1371d3d89ac964022692","e5907221fa3198e26f294ad77bf8f2996990b40484fe6781b65e099b1fe57933","ada362e162ad90df10c921c845546d911a6ad648a641a6945bf08c3ef1a09a17","f156602a8527c97f898fc96a33b7e025eed27870c2a63842c0c9ed506d7203ea","a8c34714c5da0bb0d2f74d31a44c9fb8b3b87efe6d8a0891182f9f6077723e69","4b51be04eb5bd9b929448380b3ced483ef1f6c3bbfaf7d3425bdbfa3b8eab11f","c24944ff5879b91478b153cf16802b9c6a10cfa3b7d85855813a08431ec2d36a","f1ba7a42f644ba5a281dd41b4bfc813d1f4a59e9c99227315cf778284d1e0b22","7adc301a699032ffd6d57e9ce97b2507e2ad652771cda558cb7ebb49a06e7696","f6319ead2de997fe24e6acc3594942d6819a4570f40e42cb979f5b078f3da1ca","4d3ae1585844151755e9d76cc41d82a6770b150559cb318c5366c869d487e01f","589cbf58df97db61280be456952054f5d54070e87a2c371303844a4bb288d8fa","c4e910182d6de2fcb3922631733faafdecd593370248adc1013be93352a8cc78","6bbf574c575a0491388f32aaa69c648140f24637b1d98ea6f3c97074c339f9e9",{"version":"07104ffff8802481908f08b4a220e399cc692d5edcfaaa7e6632156fc267be35","affectsGlobalScope":true},"3e135eeb6a6be4b07c1d2a170c105dde5f8b5c705f9be4e0f01166259724f125","f6c30cfb96957bb21586996d7c5d5861c236417f31b5f790055624c7df07e944","be04184c354d4b7207e68298ea4e0539cd3e55889778f3bad120c71593ad408e","37cf86c0651242b9b8c1b0bf89228a7be8ae40db6f3aac0b9e1de75bc7ddd5cb","32e5beeefac1493f9dbf2498eb4de6b5ef69a411eb1b9321cdf25a6f37086361","1a7ff463035323e853f8e8a7cd4bccc43dee61645f954c62934db2f98a185de7","6cbff8f7c37fb848bcc47108618eb79a85cf57a2436b5e01f8965db85f7e8bb0","7a42fcd6020b23edbcbb5d95368ea773c1f3df55a69162d5edbadafcd7648de1","821689ba32857e2c35aaa2c14da606f7e98551ed50bc528f8275a7bfc162aa2f","448ab3e3166f9e7c6af07bd2f8c68088e583b45791ce80196456baf18fbb17a8","0d4096267fc4839c5a2faf94fa3ea68550126c8b1a2361b9dbcc590683b28ef6","c3231f3894f21ba8781509291c202279056eed47330b5b2978d64c16ff181e2e","4d72a679373fc412eea0d9b62c9be2dfbcf8a89122ffd22b9980ec0a095abb7c","79382dd293d49e1e66437468d04dcc52e56941ce1e7de8ff2699764a2bc97c37","ad40c359b645aff278c5110452248028a0443df8caa82b3db7fc5a74303b7f45","42f1ae0eaf1e957af9a8eb239effa4e186f2269bc6bfb256c4498c8bd4d189e7","19682924b17209f416b4d3326e952b6632d0ca53e92669a79e42ccf6d67b364d","fbbf80ef3b5e98f26e3688b75294c138ec61b9e2938102bcc9c1e25fa4798289","36a269133af4b29444e589e1ea4ae37d3d3549a405b31a4dc9d7fc9074407242","4f935e96ad76cc32067565be976ad238241f5e748c7f6c28c0b77d61c709507a","561836eb066670256528e44be62a179a95eb6b6c4d5d567fae547bc833c5e8f3","36797e4783dca6ae18d64738900d05c710571f8ec9fe0c2025b6a1742372a394","050fab6e4ee652ce4542a761a1c2b2bd704954cbd71beaa83ff28c49bd0e2d0e","8295769b7cd117211e6f524b087b5d6450544d71ca5c7aa3d8c9875256dd8f71","b24f29703f17627b86c4347faaf9bac482eec8f9f50360bad3ef137f4d70c290","17e52647222b8f5547794ff1ae97f7251920a861615a07c7bd5192ab383ad521","7356ac1d79ad845e101737f8acb060175c16701fbf125383328a93ca6c8c8725","44d3810b6d2227703f3dafbc353a6b80913d1681c52e3eaab04a38ebf7eb8553","fd1d74f59a7a05e825c1f4c547fb786ebbfc438bf51621b70c798809cc75c812","bec45e0777e88662fdbb5e8ef48f3fd1a474768075abe838b184973025c94244","80082a8f59dd61edde05683ebbdf71f601700e3d203db76833e40698dc20b3fc","ab4e965e42ba46eb2b967c394443c28c0a769f100bf5a394f153b2d9dab7203f","c1b7ca5f44a03f17fe8bbbad8e229cecfe5ec435d1a027989b8232420bc8a16f","fe453fb0c5525089424ad763f51ae54b43616e801ba0ae93f9d0adf641407736","39271e7436373e7115385539a112060fac7f5bdeab5042203dd505124c7f5fbd","fdfdec7aeb097b154eb6dc75a1a603a03b187c3f2326278237ba13bc1c95542f","01e63023989d79d72af2a4ef6b0b9d69e359ebeecc5266d076857de82c7514a2","f28b7a5d852e495c250670f22f4410c3db51206aea921258c0a3aede240ebe56","140e4f23d16f9d12468416d4f1dc48ac0a86ebc4c4a88d4c6a084ce03dd8c5a1","4d49aaf08b4b39f220b6518bf0abd47b4d3b9d630b0192a9af216878c61e9d35","6f5560503a2ce6e41ecf17c5977c8062430bf927a1dc0116b86207f6e7f07c39","da3e81c1445622429d6da3528dc9a3429b517d9ee4b8c2a6d6a9ca884f5011e9","2c23b4c17ac906cc1fdcffce2aa8f9e5df09eb008129d3a7b2d2d052e3ecb146","df4961d503a17cf1825ddc06b1d9ef68f3dcb8cb4a2ddc8f2cc7c5910020324a","0008d493dae86b4cb9b133293ea243d9290ba944b1d5e845931626d65ace897e","690732dc5af08b5dded7cfd5a55c520fab245f872287d6e3beb3278a1c834b45","052a40c9a9688ead2aafd6577153ebf59c0af8c4c4f7e0212b38386cc06b87c2","f3be5de3f7cb8c1f37a878a11168adb6130ef0fccb612e3881a806e2421a2908","30f2615ba1c5f8b474d6f7b8d18240cbe9c3f11bc0ed399dfd79af6ea3ea8aa5","e8a73687ef47ff801bc5acc898bc664728b729fcb327121fb54525cc97e42c5f","90814a5be3338ef9a53e68df2e284db40e90ade3106c3e529b7edf2ac30a0fd9","7c37c052f36c0188f428035b3ab63c2e8677ff4f5e856d2742a6c087de9b7398","91f1d2ecf9f0d709c1b25dd8603bc0b3500fbc6e0dee1a60e3a60ebb8fe23412","7c3ba95b94d3645642b81314235eda3b533b0215f6d527822453e8a1ac602b69","5107e477cc4dd5a772240ca26d1b7dba66c6e4606e10ec20faa3b5ff15afff9e","dd9917ab10e20d2e4ae42c83f1168121a18cfc694a5621d9e3f671ea715b792b","04976abe821edd6b1fd91439a8543ebb061ee50754518bbf2add524254a5aed8","8ace058692d8bfb9154db28e1443eb182726038277de932cc88f9eb7ebc05a5e","01ec66f007d7ad90de5f1d0bc8a608a7a927150f2ea1b7c583b6cd61b2422b73","4e5e77169c57ed9fd6c147d1bd385c7616668d2ecd8770f63e01022514852c74","b82341c290bdba64aa143c0d6585e30d33250a3e6eecd1a469d578bc6ee303d3","1a4cd462b6ed0b43026277c94e03194a0cb75b3a68183b7a7b4a355724b7bd8e","06c6fdf0a0b00b69455eb1ef50d780772ce7255c3af4ceb5103f1bf342cdc776","924de0f1fb1c93dcb5d1bad7e4e97bad60d1a45a3346d147ff3faf6d55405738","6fbd8f206a2e394af9fec09820e9c1941488e56601979d6a588a31f5206a16bb","a2d65d5e959da9e1b9720d815eb20b6c280a5a080fc78cc868d06083abf29ca3","336313284984e0c856c718e504a5c1dcc7fa33082fd27cab9cc135d7aff62457",{"version":"ee17cba86bed60dc2d41ed369fa9b3d31e0085b3da102acfa9144b2291950d3d","affectsGlobalScope":true},{"version":"8617a635e938de81aef08736fb88e6d5439808385c25bb2d7943deec8eb3dbe8","signature":"f761c91419d0a89422a0004ef1a92929dd4d2d5e5c16758654d8b0467d1998c6"},"291ea92decea690e170a53de186d87b4cfe237124cdbf4e533755d046179cdec",{"version":"3494161b0b4d5e1de80cfb21a484eef70558a8cbd326f30a9c4597b426f4e91d","signature":"0fdf3ff3b2f8f9c4475628eda7d8c4468b339b4a83996a85946a840d08440855"},"4ab4fc2aff57d4600ad05f0dc662233f9778484057640e224eca2cb8d00490cd","1ad36b9a4728eb0224450bcefd31c6bae7f9de1434dc14cdb92594840d6590e9",{"version":"1ce35e4aeb12246eccae6bee984f35be0094504b304fa35212f9ff4ef1a8649c","signature":"f761c91419d0a89422a0004ef1a92929dd4d2d5e5c16758654d8b0467d1998c6"},"21522c0f405e58c8dd89cd97eb3d1aa9865ba017fde102d01f86ab50b44e5610","ac65f04c2df0218cb8e54f012745cbfcc3c0e67c1f6b1e557d88842bbb72e2db","cc957354aa3c94c9961ebf46282cfde1e81d107fc5785a61f62c67f1dd3ac2eb","a2e86df4db576d80704e25293cec6f20fc6101a11f4747440e2eef58fb3c860c","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","6704f0b54df85640baaeebd86c9d4a1dbb661d5a4d57a75bc84162f562f6531d","9d255af1b09c6697089d3c9bf438292a298d8b7a95c68793c9aae80afc9e5ca7","6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","d78e5898c8de5e0f934eee83f680262de005caa268d137101b833fd932f95e07","92edb6e257fa64d3baae647490e041912684f5dc1f243d0aedd60b4b383ff50b","cab425b5559edac18327eb2c3c0f47e7e9f71b667290b7689faafd28aac69eae","3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","f992cd6cc0bcbaa4e6c810468c90f2d8595f8c6c3cf050c806397d3de8585562","16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc",{"version":"c5dd1fef4cd4aaffc78786047bed5ae6fc1200d19a1946cbc4e2d3ed4d62c8fa","affectsGlobalScope":true},"56cbe80e6c42d7e6e66b6f048add8b01c663797b843a074d9f19c4a3d63a269a","68cc8d6fcc2f270d7108f02f3ebc59480a54615be3e09a47e14527f349e9d53e","3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"bee89e1eb6425eb49894f3f25e4562dc2564e84e5aa7610b7e13d8ecddf8f5db","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6","e392c96e53344b853b3c03531a4b0189bddb2a933c6b424165c67e30fc28191c","e050a0afcdbb269720a900c85076d18e0c1ab73e580202a2bf6964978181222a","5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","f47887b61c6cf2f48746980390d6cb5b8013518951d912cfb37fe748071942be","43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","bf88ef4208a770ca39a844b182b3695df536326ea566893fdc5b8418702a331e","bfe1b52cf71aea9bf8815810cc5d9490fa9617313e3d3c2ee3809a28b80d0bb4","ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","c1d5cc0286eef54f6246a972ec1720efbba6b7b0a53a303e1f2067ca229ecd16","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","6c1e688f95fcaf53b1e41c0fdadf2c1cfc96fa924eaf7f9fdb60f96deb0a4986","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","6d969939c4a63f70f2aa49e88da6f64b655c8e6799612807bef41ccff6ea0da9","bed2c4f96fab3348be4a34d88dcb12578c1b2475b07c6acd369e99e227718d81",{"version":"eb9e147dbb7289f09af3b161483c09a9175c3b222ed587f4a3c0112841e7d6ff","affectsGlobalScope":true},"ba600bf38b5c1a5dffa1b99dd7a783549082bbba3b4fe9497eaaf5e4c1764b20","ae8cd6af37275eac75f5369cdb5f01063bcf1f48d74cb434303ee50ec446acfe","2518830a2fda9c272ba48798d0e7b857037443b06594db8e42c87e86944ee9e4","95c1cf650d16b197525b5bfdf8dd7abba0a49d99ddb12a4ba66466a8a6903e49","1fe0aabe758d56ad72495d6e6c7b6ae75619faaeaaf03f0ddf1948eea4cfac84","bbc57966c8c48ee78fd58aadb893784025be056ae538ae22d1e83c502a987e68","5e5d6f6697e378b0660b567866bf67d099d0ea754f8810c0dabe737805f5cf03","99ab49d4732fdc98cf5c495925e65e796544cb4086fe42afc235dfc02bcf2351","af8339d509c40da075088e544c28ed37b519876e5c4d36a48644ebfb3c6ae6c8","d393adc32e520d4274bb4c3dfdcdb342b806a230b66ef0f82b35bffbc4aa2590","c26af7eaedb4f710984634e419ab15e54e5bb99a0b3cae71188c2fff572276de","38b58ef018d0aeee42ef74c42978bb5805503233fdeeb82cd2aed2199fb0d013","3b6040253231d44e6778eb6861cc86c1758562e77783d21b7ecbc73322ded539","cc256fd958b33576ed32c7338c64adb0d08fc0c2c6525010202fab83f32745da","fd0589ca571ad090b531d8c095e26caa53d4825c64d3ff2b2b1ab95d72294175",{"version":"669843ecafb89ae1e944df06360e8966219e4c1c34c0d28aa2503272cdd444a7","affectsGlobalScope":true},"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","d88a5e779faf033be3d52142a04fbe1cb96009868e3bbdd296b2bc6c59e06c0e","2e01303400518ac4b032f1848ee3f2cf62d1694d4d0c7e992cc6d95f5c5c0538","a95b76aef31395752eb5cb7b386be2e287fdc32dfdf7bdbbb666e333133b1ef7",{"version":"fd624f7d7b264922476685870f08c5e1c6d6a0f05dee2429a9747b41f6b699d4","affectsGlobalScope":true},"bc0fcbd1d24fc838fbbadaef30b05ff0c49d3a1f4037e9534d0b93907a071bc5","408cc7117448f4994a1f50468648a2d06eff4112a7707dbef6ceea76d2684707","960a68ced7820108787135bdae5265d2cc4b511b7dcfd5b8f213432a8483daf1","2e7ebdc7d8af978c263890bbde991e88d6aa31cc29d46735c9c5f45f0a41243b","b57fd1c0a680d220e714b76d83eff51a08670f56efcc5d68abc82f5a2684f0c0","8cf121e98669f724256d06bebafec912b92bb042a06d4944f7fb27a56c545109","1084565c68b2aed5d6d5cea394799bd688afdf4dc99f4e3615957857c15bb231","199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","74b0245c42990ed8a849df955db3f4362c81b13f799ebc981b7bec2d5b414a57","acebfe99678cf7cddcddc3435222cf132052b1226e902daac9fbb495c321a9b5","82b1f9a6eefef7386aebe22ac49f23b806421e82dbf35c6e5b7132d79e4165da","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","49c972b1c491933723861f15cba6ae694466abfd0938ca4f366621127bb51962",{"version":"910199067bfd07a4605bf51001677680e1691f8d403e9d410c0fe33a6079cd58","affectsGlobalScope":true},"61f41da9aaa809e5142b1d849d4e70f3e09913a5cb32c629bf6e61ef27967ff7","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","dee5d387e2e6f3015cbf91fc0c13ed6f016f9c5c1f2ad9c62602f4fd398fa83a","67f129ed8b372622ff36b8b10e39d03e09e363a5ff7821105f92f085b8d1ccba","20e907e2b3049552b766d0451aa73a04a5182e8f30140482b1129ec10d2fc3b6","0d7569149194d622212c21d5d162b0715d5a6ca764cebae7145fdbaff1e07311","cd74c8275483d3fe0d07a9b4bba28845a8a611f0aa399e961dbd40e5d46dd9ad","04edfecaf2ca39493aa4256e14f84a2dd602c467b4772b03583e4a255431a0ee","c0b992907b4e59e9d3b5a9beba80f67b06de8408f305aeabe304b679926f50a3","77c5c7f8578d139c74102a29384f5f4f0792a12d819ddcdcaf8307185ff2d45d","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","ae84439d1ae42b30ced3df38c4285f35b805be40dfc95b0647d0e59c70b11f97","65dfa4bc49ccd1355789abb6ae215b302a5b050fdee9651124fe7e826f33113c"],"options":{"allowSyntheticDefaultImports":true,"esModuleInterop":true,"jsx":4,"module":1,"outDir":"./dist","rootDir":"./src","sourceMap":true,"strict":true,"target":8},"fileIdsList":[[101,1068],[101],[101,278,279],[101,280],[53,101],[53,101,281,283,284,285,286],[53,101,283,287],[53,101,285,287],[50,101,278],[101,282],[101,274],[101,287,288],[101,276],[101,275],[101,277],[101,1105],[101,545],[53,101,363,370,372,472,522,626,965],[101,626,627],[53,101,363,620,965],[101,620,621],[53,101,363,623,965],[101,623,624],[53,101,363,370,535,629,965],[101,629,630],[53,101,272,363,373,374,472,965],[101,374,473],[53,101,363,475,965],[101,475,476],[53,101,272,363,370,372,478,965],[101,478,479],[53,101,272,363,373,483,509,511,512,965],[101,512,513],[53,101,272,363,370,472,515,899],[101,515,516],[53,101,272,363,517,518,965],[101,518,519],[53,101,363,370,522,524,525,899],[101,525,526],[53,101,272,363,370,472,528,899],[101,528,529],[53,101,363,370,539,965],[101,539,540],[53,101,363,370,535,536,965],[101,536,537],[101,272,363,370,899],[101,939,940],[53,101,363,370,472,542,545,899],[101,542,546],[53,101,272,363,370,535,553,899],[101,553,554],[53,101,363,370,532,533,899],[101,531,533,534],[53,101,531,965],[53,101,272,363,370,548,965],[53,101,549],[101,548,549,550,551],[53,101,272,363,370,373,574,965],[101,574,575],[53,101,363,370,535,556,965],[101,556,557],[53,101,363,559,965],[101,559,560],[53,101,363,370,562,965],[101,562,563],[53,101,363,370,567,568,965],[101,568,569],[53,101,363,370,571,965],[101,571,572],[53,101,272,363,578,579,965],[101,579,580],[53,101,272,363,370,481,965],[101,481,482],[53,101,272,363,582,965],[101,582,583],[101,778],[53,101,363,522,585,965],[101,585,586],[101,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919],[53,101,363,370,588,899],[101,363],[101,588,589],[53,101,899],[101,591],[53,101,363,373,522,605,606,965],[101,606,607],[53,101,363,593,965],[101,593,594],[53,101,363,596,965],[101,596,597],[53,101,363,370,567,599,899],[101,599,600],[53,101,363,370,567,609,899],[101,609,610],[53,101,272,363,370,612,965],[101,612,613],[53,101,363,373,522,605,616,617,965],[101,617,618],[53,101,272,363,370,535,632,965],[101,632,633],[53,101,522],[101,523],[101,363,637,638,965],[101,638,639],[53,101,272,363,370,644,899],[53,101,645],[101,644,645,646,647],[101,646],[53,101,363,567,641,965],[101,641,642],[53,101,363,649,965],[101,649,650],[53,101,272,363,370,652,899],[101,652,653],[53,101,272,363,370,655,899],[101,655,656],[101,471],[101,363,899],[101,957],[53,101,272,363,370,658,899],[101,658,659],[101,943],[53,101,363],[101,945],[53,101,272,363,370,668,899],[101,668,669],[53,101,272,363,370,535,665,965],[101,665,666],[53,101,272,363,370,671,965],[101,671,672],[53,101,363,370,677,965],[101,677,678],[53,101,363,674,965],[101,674,675],[53,101,272,373,471,474,477,480,483,504,509,511,514,517,520,524,527,530,535,538,541,545,547,552,555,558,561,564,567,570,573,576,581,584,587,590,592,595,598,601,605,608,611,614,616,619,622,625,628,631,634,637,640,643,648,651,654,657,660,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,715,718,721,723,726,729,732,736,737,740,744,747,752,755,758,761,765,768,774,777,779,782,786,789,792,795,798,801,804,807,810,813,817,821,823,826,829,832,835,838,842,845,848,851,854,857,860,863,866,869,872,875,899,920,938,941,942,944,946,949,952,954,956,958,959,960,961,964],[101,686,687],[101,363,637,686,965],[101,680,681],[53,101,363,370,680,965],[101,635,636],[53,101,272,363,635,899,965],[101,683,684],[53,101,272,363,370,657,683,899],[53,101,535,577,965],[101,689,690],[53,101,272,363,689,965],[101,692,693],[53,101,272,363,370,567,692,899],[101,713,714],[53,101,363,370,713,965],[101,701,702],[53,101,363,370,535,701,899],[101,695,696],[101,363,695,965],[101,704,705],[53,101,363,370,535,704,899],[101,698,699],[53,101,363,698,965],[101,707,708],[53,101,363,707,965],[101,710,711],[53,101,363,567,710,965],[101,716,717],[53,101,363,370,716,965],[101,727,728],[53,101,363,373,522,723,726,727,899,965],[101,719,720],[53,101,363,370,535,719,899],[101,722],[53,101,370,715],[101,730,731],[53,101,363,373,691,730,965],[101,602,603,604],[53,101,272,363,370,472,504,527,603,899],[101,734,735],[53,101,363,688,733,734,965],[53,101,363,965],[101,947,948],[53,101,947],[101,738,739],[53,101,363,637,738,965],[53,101,272,899],[101,742,743],[53,101,272,363,741,742,899,965],[101,745,746],[53,101,272,363,370,741,745,899],[101,371,372],[53,101,272,363,370,371,899],[101,724,725],[53,101,363,373,471,522,605,724,899,965],[53,101,472,501,504,505],[101,506,507,508],[53,101,363,506,899],[101,502,503],[53,101,502],[101,753,754],[53,101,272,363,578,753,965],[101,748,750,751],[53,101,651],[101,651],[101,749],[101,756,757],[53,101,272,363,756,965],[101,759,760],[53,101,363,370,759,899],[101,763,764],[53,101,363,640,688,729,740,762,763,965],[53,101,363,729,965],[101,766,767],[53,101,272,363,370,766,965],[101,615],[101,772,773],[53,101,272,363,370,472,769,771,772,899],[53,101,770],[101,780,781],[53,101,363,522,777,779,780,899,965],[101,775,776],[53,101,363,373,775,899,965],[101,784,785],[53,101,363,634,783,784,899,965],[101,790,791],[53,101,363,634,789,790,899,965],[101,793,794],[53,101,363,793,899,965],[101,796,797],[53,101,363,370,880],[101,818,819,820],[53,101,363,370,818,899],[101,799,800],[53,101,363,370,535,799,899],[101,802,803],[53,101,363,802,899,965],[101,805,806],[53,101,363,522,805,899,965],[101,808,809],[53,101,363,808,899,965],[101,811,812],[53,101,363,810,811,899,965],[101,814,815,816],[53,101,363,370,373,814,899],[101,363,364,365,366,367,368,369,876,877,878,880],[101,876,877,878],[50,101,363],[101,965],[101,363,364,365,366,367,368,369,879],[50,53,101,365],[101,366],[53,101,336,363,894],[101,272,363,365,367,369,879,880],[101,273,363,364,365,366,367,368,369,876,877,878,879,880,881,882,883,884,885,888,889,890,891,892,893,894,895,896,897,898],[101,363,373,474,477,480,483,509,514,517,520,527,530,532,535,538,541,545,547,552,555,558,561,564,567,570,573,576,581,584,587,590,595,598,601,605,608,611,614,619,622,625,628,631,634,637,640,643,648,651,654,657,660,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,715,718,721,723,726,729,732,736,740,744,747,752,755,758,761,765,768,774,777,782,786,789,792,795,798,801,804,807,810,813,817,821,826,829,832,835,838,842,845,848,851,854,857,863,866,869,872,875,876],[101,373,474,477,480,483,509,514,517,520,527,530,532,535,538,541,545,547,552,555,558,561,564,567,570,573,576,581,584,587,590,592,595,598,601,605,608,611,614,619,622,625,628,631,634,637,640,643,648,651,654,657,660,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,715,718,721,723,726,729,732,736,737,740,744,747,752,755,758,761,765,768,774,777,782,786,789,792,795,798,801,804,807,810,813,817,821,823,826,829,832,835,838,842,845,848,851,854,857,863,866,869,872,875],[101,363,366],[101,363,880,886,887],[101,880],[101,879,880],[101,363,876],[101,543,544],[53,101,272,363,370,543,899],[101,822],[53,101,619],[101,824,825],[53,101,272,363,578,824,965],[101,855,856],[53,101,363,370,535,855,965],[101,843,844],[53,101,272,363,370,843,965],[101,827,828],[53,101,363,370,827,965],[101,830,831],[53,101,272,363,830,965],[101,833,834],[53,101,363,370,833,965],[101,852,853],[53,101,363,370,852,965],[101,836,837],[53,101,363,370,836,965],[101,840,841],[53,101,363,370,667,765,832,839,840,899],[53,101,545,666],[101,846,847],[53,101,363,370,846,965],[101,849,850],[53,101,363,370,535,849,965],[101,861,862],[53,101,272,363,370,472,545,860,861,899],[101,858,859],[53,101,363,472,535,858,965],[101,950,951],[53,101,950],[101,864,865],[53,101,272,363,637,640,648,654,685,688,740,765,864,899,965],[101,867,868],[53,101,272,363,370,535,867,965],[101,870,871],[53,101,272,363,870,899,965],[101,873,874],[53,101,272,363,370,873,965],[101,787,788],[53,101,363,509,522,787,965],[101,522],[53,101,521],[101,565,566],[53,101,272,363,366,370,565,899],[101,272,661],[101,356],[53,101,272,356,363,899],[101,661,662,663],[53,101,962],[101,962,963],[101,510],[101,331],[101,953],[101,396],[101,398],[101,400],[101,402],[101,471,472,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937],[101,404],[101,406],[101,408],[53,101,272],[101,410],[101,412],[101,363,471],[101,418],[101,420],[101,414],[101,422],[101,424],[101,416],[101,432],[101,955],[101,313,315,317],[101,314],[101,313],[101,316],[53,101,287],[101,292],[50,101,287,289,291,293],[101,290],[53,101,272,305,308],[101,309,310],[101,294,295,305,308],[101,272,347],[53,101,272,305,308,346],[53,101,272,294,308,347],[101,346,347,349],[101,272,308,311],[53,101,294,305,308],[101,294],[101,272],[101,294,295,296,297,305,306],[101,306,307],[53,101,336,337],[101,340],[53,101,336],[101,338,339,340,341],[53,101,294,308],[101,319],[101,294,295,296,297,303,305,308,311,312,318,320,321,322,323,324,327,328,329,331,332,334,340,341,342,343,344,345,348,350,356,361,362],[101,335],[101,311],[53,101,272,294,295,297,323,357],[101,357,358,359,360],[101,272,357],[53,101,272,305,308,311],[101,294,311],[101,323],[101,298],[101,303,311],[101,301],[101,298,299,300,301,302,304],[50,101],[50,101,294,298,299,300],[101,333],[101,318],[53,101,272,294,323,351],[101,272,351],[101,351,352,353,354,355],[101,295],[101,330],[101,308],[101,325,326],[101,457],[101,395],[51,101],[101,375],[101,455],[101,453],[101,447],[101,397],[101,399],[101,377],[101,401],[101,379],[101,381],[101,383],[101,460],[101,467],[101,385],[101,449],[101,451],[101,387],[101,469],[101,433],[101,439],[101,389],[101,376,378,380,382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416,418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,454,456,460,464,466,468,470],[101,443],[101,403],[101,461],[53,101,272,459,460],[101,405],[101,407],[101,391],[101,393],[101,409],[101,465],[101,445],[101,435],[101,411],[101,417],[101,419],[101,413],[101,421],[101,423],[101,415],[101,431],[101,425],[101,429],[101,437],[101,463],[53,101,272,458,462],[101,427],[101,441],[101,500],[101,494,496],[101,484,494,495,497,498,499],[101,494],[101,484,494],[101,485,486,487,488,489,490,491,492,493],[101,485,489,490,493,494,497],[101,485,486,487,488,489,490,491,492,493,494,495,497,498],[101,484,485,486,487,488,489,490,491,492,493],[53,101,1048],[101,1048,1049],[53,101,1044],[101,1044,1045,1046],[53,101,1040],[53,101,1008],[53,101,1008,1022],[53,101,1006,1008],[101,1008],[101,1008,1022],[101,999,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039],[101,998,1000,1001],[53,101,997,998,1000,1001,1002,1003,1004,1008],[101,998,1000,1001,1002,1003,1004,1005,1007],[53,101,999,1008],[101,997,1008],[101,1041,1042],[53,101,1041],[101,1054,1055,1056],[53,101,1054],[53,101,976],[101,1051,1052],[53,101,1051],[101,1068,1069,1070,1071,1072],[101,1068,1070],[74,101,108,1074],[65,101,108],[71,74,100,101,108,1077,1078,1079],[100,101,108,1083],[74,101,108],[101,967,995],[101,966,972],[101,977],[101,972],[101,971],[101,989],[101,985],[101,967,984,995],[101,966,967,968,969,970,971,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996],[101,1085],[101,1088,1090],[101,1087,1088,1089],[71,74,101,108,1081,1082],[101,1075,1082,1083,1094],[72,101,108,205,206],[72,101,108],[71,74,76,79,89,100,101,108],[101,1100],[101,1101],[101,1110,1111],[101,1106],[71,101,103,108,1125,1126,1128],[101,1127],[72,100,101,108],[71,101,108],[101,1092],[101,1093],[55,101],[58,101],[59,64,92,101],[60,71,72,79,89,100,101],[60,61,71,79,101],[62,101],[63,64,72,80,101],[64,89,97,101],[65,67,71,79,101],[66,101],[67,68,101],[71,101],[69,71,101],[71,72,73,89,100,101],[71,72,73,86,89,92,101],[101,105],[67,74,79,89,100,101],[71,72,74,75,79,89,97,100,101],[74,76,89,97,100,101],[55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107],[71,77,101],[78,100,101],[67,71,79,89,101],[80,101],[81,101],[58,82,101],[83,99,101,105],[84,101],[85,101],[71,86,87,101],[86,88,101,103],[59,71,89,90,91,92,101],[59,89,91,101],[89,90,101],[92,101],[93,101],[71,95,96,101],[95,96,101],[64,79,89,97,101],[98,101],[79,99,101],[59,74,85,100,101],[64,101],[89,101,102],[101,103],[101,104],[59,64,71,73,82,89,100,101,103,105],[89,101,106],[53,101,1097,1135],[101,521,1138,1139,1140,1141],[49,50,51,52,101],[74,89,101,108],[101,124,163],[101,124,148,163],[101,163],[101,124],[101,124,149,163],[101,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[101,149,163],[72,101,1095],[74,101,108,1093],[101,1112,1148],[74,79,101,108,1157],[71,74,76,89,97,100,101,106,108],[101,1160],[71,89,101,108],[64,74,89,100,101,108,113,114],[101,113,114,115,116,117,118,119,120,121],[89,101,108,113],[101,108],[71,72,101,108,214],[74,101],[101,122,169,170],[74,101,108,109,122,123,163,164,165,166,167,168,174],[101,122,164,169],[101,122,174],[74,101,108,109,122],[71,100,101,108,122,166,167,169,171,172,173],[101,122,164,169,170],[74,100,101,108,122,166,174],[71,72,101,108],[58,101,108,1103,1109],[101,1107],[101,1104,1108],[101,1114],[101,1113,1114],[101,1113],[101,1113,1114,1115,1117,1118,1121,1122,1123,1124],[101,1114,1118],[101,1113,1114,1115,1117,1118,1119,1120],[101,1113,1118],[101,1118,1122],[101,1114,1115,1116],[101,1115],[101,1113,1114,1118],[72,81,101,108,227,228],[71,93,101,108],[101,1040,1043,1047,1050,1053,1057],[72,101,108,240],[101,108,226,229,233,234,237],[101,238],[101,229,233,236],[101,226,229,233,236,237,238,239],[101,108,233],[101,229,233,234,236],[101,108,226,229,234,235,237],[101,233],[101,230,231,232],[101,1154],[101,1089,1152,1153],[101,1089,1154],[59,74,79,97,101,1088,1152,1154,1155,1156],[101,1020,1021],[101,1020],[54,101,109],[54,101,112,207],[54,101,112,241],[54,101,112,199,224],[54,73,101,112,199],[54,60,81,101,112,199,201],[54,101,109,112,225,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269],[54,101,109,112,199],[54,101,109,224],[54,73,81,101,109,199,201],[54,73,101,112,201],[54,73,101,112],[54,101,109,199,224],[54,101,109,217,224],[54,73,101,109,201],[54,101,109,202],[54,101,109,218,224],[54,101,1062,1063,1064],[54,101],[54,101,199,224,1062,1063],[54,72,81,101,109,112,174,175,176,201,202,223,224,270],[54,101,109,112,1060],[54,101,109,112,199,204,209,211,212,213,217,218,219,223],[54,101,203,218],[54,101,220,221,222],[54,101,199,219],[54,101,201,203,204,207,209,211,212,213,216,217,219,220],[54,101,203,220],[54,101,112],[54,73,81,101,112,199,210,224],[54,101,112,199,203],[54,60,73,81,100,101,112,199,201,203,204,207,208,224],[54,73,101,112,203,216,224],[54,81,101,112,199,215,224],[54,101,112,204,209,211,212,213,216,217],[54,73,81,101,112,224],[54,73,101,199],[54,73,101],[54,101,177,178,179,200],[54,81,101,109,110],[54,101,177],[54,81,100,101],[101,109],[101,111],[53,101,111,112,965,1058,1059],[101,197,198],[101,112],[101,189],[101,180,181,182,183,184,185,189,190,191,192,193,194,195,196],[101,191],[101,186,187,188],[101,187],[112],[109],[112,199,203]],"referencedMap":[[1070,1],[1068,2],[280,3],[279,2],[281,4],[285,5],[287,6],[284,7],[286,8],[282,9],[283,10],[274,2],[275,11],[288,7],[289,12],[277,13],[276,14],[278,15],[1103,2],[1106,16],[1059,17],[627,18],[626,2],[628,19],[621,20],[620,2],[622,21],[624,22],[623,2],[625,23],[630,24],[629,2],[631,25],[473,26],[374,2],[474,27],[476,28],[475,2],[477,29],[479,30],[478,2],[480,31],[513,32],[512,2],[514,33],[516,34],[515,2],[517,35],[519,36],[518,2],[520,37],[526,38],[525,2],[527,39],[529,40],[528,2],[530,41],[540,42],[539,2],[541,43],[537,44],[536,2],[538,45],[939,46],[940,2],[941,47],[546,48],[542,2],[547,49],[554,50],[553,2],[555,51],[534,52],[533,2],[535,53],[532,54],[531,2],[549,55],[551,5],[548,2],[550,56],[552,57],[575,58],[574,2],[576,59],[557,60],[556,2],[558,61],[560,62],[559,2],[561,63],[563,64],[562,2],[564,65],[569,66],[568,2],[570,67],[572,68],[571,2],[573,69],[580,70],[579,2],[581,71],[482,72],[481,2],[483,73],[583,74],[582,2],[584,75],[778,5],[779,76],[586,77],[585,2],[587,78],[900,2],[901,2],[902,2],[903,2],[904,2],[905,2],[906,2],[907,2],[908,2],[909,2],[920,79],[910,2],[911,2],[912,2],[913,2],[914,2],[915,2],[916,2],[917,2],[918,2],[919,2],[589,80],[588,81],[590,82],[591,83],[592,84],[942,2],[607,85],[606,2],[608,86],[594,87],[593,2],[595,88],[597,89],[596,2],[598,90],[600,91],[599,2],[601,92],[610,93],[609,2],[611,94],[613,95],[612,2],[614,96],[618,97],[617,2],[619,98],[633,99],[632,2],[634,100],[523,101],[524,102],[639,103],[638,2],[640,104],[645,105],[644,2],[646,106],[648,107],[647,108],[642,109],[641,2],[643,110],[650,111],[649,2],[651,112],[653,113],[652,2],[654,114],[656,115],[655,2],[657,116],[960,117],[961,117],[957,118],[958,119],[659,120],[658,2],[660,121],[943,101],[944,122],[945,123],[946,124],[669,125],[668,2],[670,126],[666,127],[665,2],[667,128],[672,129],[671,2],[673,130],[678,131],[677,2],[679,132],[675,133],[674,2],[676,134],[965,135],[688,136],[687,137],[686,2],[682,138],[681,139],[680,2],[637,140],[636,141],[635,2],[685,142],[684,143],[683,2],[578,144],[577,2],[691,145],[690,146],[689,2],[694,147],[693,148],[692,2],[715,149],[714,150],[713,2],[703,151],[702,152],[701,2],[697,153],[696,154],[695,2],[706,155],[705,156],[704,2],[700,157],[699,158],[698,2],[709,159],[708,160],[707,2],[712,161],[711,162],[710,2],[718,163],[717,164],[716,2],[729,165],[728,166],[727,2],[721,167],[720,168],[719,2],[723,169],[722,170],[732,171],[731,172],[730,2],[605,173],[604,174],[603,2],[602,2],[736,175],[735,176],[734,2],[733,177],[949,178],[948,179],[947,5],[740,180],[739,181],[738,2],[370,182],[744,183],[743,184],[742,2],[747,185],[746,186],[745,2],[373,187],[372,188],[371,2],[726,189],[725,190],[724,2],[506,191],[509,192],[507,193],[508,2],[504,194],[503,195],[502,5],[755,196],[754,197],[753,2],[752,198],[748,199],[751,200],[749,5],[750,201],[758,202],[757,203],[756,2],[761,204],[760,205],[759,2],[765,206],[764,207],[763,2],[762,208],[768,209],[767,210],[766,2],[616,211],[615,101],[774,212],[773,213],[772,2],[771,214],[770,2],[769,5],[782,215],[781,216],[780,2],[777,217],[776,218],[775,2],[786,219],[785,220],[784,2],[792,221],[791,222],[790,2],[795,223],[794,224],[793,2],[798,225],[796,226],[797,81],[821,227],[819,228],[818,2],[820,5],[801,229],[800,230],[799,2],[804,231],[803,232],[802,2],[807,233],[806,234],[805,2],[810,235],[809,236],[808,2],[813,237],[812,238],[811,2],[817,239],[815,240],[814,2],[816,5],[881,241],[879,242],[364,243],[365,244],[882,2],[880,245],[368,2],[366,246],[890,247],[895,248],[898,2],[894,249],[896,2],[273,2],[899,250],[891,2],[877,251],[876,252],[883,253],[887,2],[367,2],[897,2],[886,2],[888,254],[889,81],[884,255],[885,256],[878,257],[892,2],[893,2],[369,2],[545,258],[544,259],[543,2],[823,260],[822,261],[826,262],[825,263],[824,2],[857,264],[856,265],[855,2],[845,266],[844,267],[843,2],[829,268],[828,269],[827,2],[832,270],[831,271],[830,2],[835,272],[834,273],[833,2],[854,274],[853,275],[852,2],[838,276],[837,277],[836,2],[842,278],[841,279],[839,280],[840,2],[848,281],[847,282],[846,2],[851,283],[850,284],[849,2],[863,285],[862,286],[861,2],[860,287],[859,288],[858,2],[952,289],[951,290],[950,5],[866,291],[865,292],[864,2],[869,293],[868,294],[867,2],[872,295],[871,296],[870,2],[875,297],[874,298],[873,2],[789,299],[788,300],[787,2],[783,301],[522,302],[567,303],[566,304],[565,2],[662,305],[663,306],[661,307],[664,308],[963,309],[962,5],[964,310],[511,311],[510,5],[737,312],[741,5],[954,313],[953,2],[921,314],[922,315],[923,17],[924,316],[925,317],[938,318],[926,319],[927,320],[928,321],[505,322],[929,323],[930,324],[472,325],[933,326],[934,327],[931,328],[935,329],[936,330],[932,331],[937,332],[959,2],[956,333],[955,101],[313,2],[318,334],[315,335],[314,336],[317,337],[316,336],[292,338],[293,339],[294,340],[291,341],[290,5],[309,342],[310,2],[311,343],[312,344],[332,2],[349,345],[346,2],[347,346],[348,347],[350,348],[322,349],[323,350],[306,351],[295,352],[297,2],[307,353],[308,354],[296,2],[338,355],[341,356],[343,2],[344,2],[339,357],[342,358],[340,2],[337,2],[319,359],[320,360],[363,361],[336,362],[335,5],[345,2],[321,363],[359,364],[361,365],[358,366],[360,2],[357,367],[303,368],[324,369],[299,370],[304,371],[302,372],[305,373],[300,374],[298,374],[301,375],[334,376],[333,377],[353,378],[352,379],[354,2],[351,367],[356,380],[355,381],[331,382],[330,2],[328,383],[326,2],[327,384],[325,2],[329,2],[362,2],[272,5],[457,322],[458,385],[395,2],[396,386],[375,387],[376,388],[455,2],[456,389],[453,2],[454,390],[447,2],[448,391],[397,2],[398,392],[399,2],[400,393],[377,2],[378,394],[401,2],[402,395],[379,387],[380,396],[381,387],[382,397],[383,387],[384,398],[467,399],[468,400],[385,2],[386,401],[449,2],[450,402],[451,2],[452,403],[387,5],[388,404],[469,5],[470,405],[433,2],[434,406],[439,5],[440,407],[389,2],[390,408],[471,409],[444,410],[443,387],[404,411],[403,2],[462,412],[461,413],[459,2],[406,414],[405,2],[408,415],[407,2],[392,416],[391,2],[394,417],[393,387],[410,418],[409,5],[466,419],[465,2],[446,420],[445,2],[436,421],[435,2],[412,422],[411,5],[460,5],[418,423],[417,2],[420,424],[419,2],[414,425],[413,5],[422,426],[421,2],[424,427],[423,5],[416,428],[415,2],[432,429],[431,5],[426,430],[425,5],[430,431],[429,5],[438,432],[437,2],[464,433],[463,434],[428,435],[427,2],[442,436],[441,5],[501,437],[497,438],[484,2],[500,439],[493,440],[491,441],[490,441],[489,440],[486,441],[487,440],[495,442],[488,441],[485,440],[492,441],[498,443],[499,444],[494,445],[496,441],[1049,446],[1050,447],[1048,5],[1046,448],[1045,448],[1047,449],[1044,450],[1026,5],[1017,451],[1014,451],[1011,451],[1015,451],[1016,451],[1013,451],[1012,451],[1023,452],[1010,451],[1006,451],[1025,451],[1024,5],[1009,453],[1039,5],[1030,454],[1038,454],[1032,454],[1029,454],[1033,451],[1037,2],[1036,454],[1035,454],[1027,454],[1034,455],[1028,454],[1031,454],[1040,456],[1002,457],[1007,453],[1001,451],[1005,458],[1003,454],[1008,459],[1004,454],[1000,460],[998,2],[1019,454],[1018,461],[999,451],[1043,462],[1042,463],[1041,450],[1057,464],[1055,465],[1056,465],[1054,466],[1053,467],[1052,468],[1051,450],[1105,2],[1067,2],[1073,469],[1069,1],[1071,470],[1072,1],[1075,471],[1076,472],[1080,473],[1084,474],[1074,475],[966,2],[968,476],[969,476],[970,2],[971,2],[973,477],[974,2],[975,2],[976,476],[977,2],[978,2],[979,478],[980,2],[981,2],[982,479],[983,2],[984,480],[985,2],[986,2],[987,2],[988,2],[991,2],[990,481],[967,2],[992,482],[993,2],[989,2],[994,2],[995,476],[996,483],[997,484],[1086,485],[1091,486],[1087,2],[1090,487],[1088,2],[1083,488],[1095,489],[207,490],[972,2],[1096,491],[1097,5],[1098,2],[1078,2],[1099,492],[1100,2],[1101,493],[1102,494],[1112,495],[1111,496],[1127,497],[1128,498],[1089,2],[1129,2],[205,499],[206,2],[1130,500],[1093,501],[1092,502],[1085,2],[55,503],[56,503],[58,504],[59,505],[60,506],[61,507],[62,508],[63,509],[64,510],[65,511],[66,512],[67,513],[68,513],[70,514],[69,515],[71,514],[72,516],[73,517],[57,518],[107,2],[74,519],[75,520],[76,521],[108,522],[77,523],[78,524],[79,525],[80,526],[81,527],[82,528],[83,529],[84,530],[85,531],[86,532],[87,532],[88,533],[89,534],[91,535],[90,536],[92,537],[93,538],[94,2],[95,539],[96,540],[97,541],[98,542],[99,543],[100,544],[101,545],[102,546],[103,547],[104,548],[105,549],[106,550],[1131,2],[1132,2],[51,2],[1082,2],[1081,2],[1133,5],[1134,5],[1136,551],[1137,5],[1138,2],[1139,302],[1142,552],[1140,5],[521,5],[1141,302],[49,2],[53,553],[54,5],[1079,554],[1143,2],[1144,2],[52,2],[148,555],[149,556],[124,557],[127,557],[146,555],[147,555],[137,555],[136,558],[134,555],[129,555],[142,555],[140,555],[144,555],[128,555],[141,555],[145,555],[130,555],[131,555],[143,555],[125,555],[132,555],[133,555],[135,555],[139,555],[150,559],[138,555],[126,555],[163,560],[162,2],[157,559],[159,561],[158,559],[151,559],[152,559],[154,559],[156,559],[160,561],[161,561],[153,561],[155,561],[1145,562],[1094,563],[1146,475],[1147,2],[1149,564],[1148,2],[1126,2],[1150,2],[210,2],[1158,565],[1159,566],[1160,2],[1161,567],[1162,568],[1153,2],[214,2],[1151,2],[121,2],[113,500],[115,569],[122,570],[114,571],[116,475],[118,2],[117,2],[119,572],[120,2],[1104,2],[215,573],[50,2],[175,574],[164,2],[171,575],[169,576],[170,577],[165,578],[166,579],[172,577],[174,580],[173,581],[167,582],[109,583],[1110,584],[1108,585],[1107,496],[1109,586],[1077,514],[123,2],[1115,587],[1124,588],[1113,2],[1114,589],[1125,590],[1120,591],[1121,592],[1119,593],[1123,594],[1117,595],[1116,596],[1122,597],[1118,588],[229,598],[227,2],[228,599],[1058,600],[1135,2],[241,601],[238,602],[239,603],[237,604],[240,605],[234,606],[235,607],[236,608],[230,609],[231,609],[233,610],[232,609],[226,568],[1155,611],[1154,612],[1152,613],[1156,2],[168,2],[9,2],[10,2],[12,2],[11,2],[2,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[3,2],[4,2],[24,2],[21,2],[22,2],[23,2],[25,2],[26,2],[27,2],[5,2],[28,2],[29,2],[30,2],[31,2],[6,2],[35,2],[32,2],[33,2],[34,2],[36,2],[7,2],[37,2],[42,2],[43,2],[38,2],[39,2],[40,2],[41,2],[8,2],[47,2],[44,2],[45,2],[46,2],[1,2],[48,2],[1157,614],[1022,615],[1021,616],[1020,2],[110,617],[225,618],[242,619],[245,620],[243,621],[244,622],[270,623],[246,624],[264,625],[247,626],[248,627],[249,628],[250,628],[263,629],[267,629],[252,629],[259,630],[256,629],[251,631],[255,625],[253,629],[266,625],[258,625],[262,632],[254,625],[269,633],[265,629],[268,629],[260,625],[261,625],[257,625],[1062,2],[1065,634],[1063,635],[1064,636],[271,637],[176,617],[1061,638],[224,639],[219,640],[223,641],[220,642],[222,643],[221,644],[203,645],[212,646],[204,647],[209,648],[208,620],[217,649],[216,650],[211,646],[218,651],[213,652],[200,653],[178,654],[201,655],[179,656],[1066,657],[177,658],[202,617],[111,659],[112,660],[1060,661],[199,662],[183,663],[195,2],[196,2],[182,663],[190,664],[197,665],[192,666],[191,2],[193,666],[181,2],[184,663],[180,2],[189,667],[186,663],[187,2],[188,668],[185,2],[194,2],[198,2]],"exportedModulesMap":[[1070,1],[1068,2],[280,3],[279,2],[281,4],[285,5],[287,6],[284,7],[286,8],[282,9],[283,10],[274,2],[275,11],[288,7],[289,12],[277,13],[276,14],[278,15],[1103,2],[1106,16],[1059,17],[627,18],[626,2],[628,19],[621,20],[620,2],[622,21],[624,22],[623,2],[625,23],[630,24],[629,2],[631,25],[473,26],[374,2],[474,27],[476,28],[475,2],[477,29],[479,30],[478,2],[480,31],[513,32],[512,2],[514,33],[516,34],[515,2],[517,35],[519,36],[518,2],[520,37],[526,38],[525,2],[527,39],[529,40],[528,2],[530,41],[540,42],[539,2],[541,43],[537,44],[536,2],[538,45],[939,46],[940,2],[941,47],[546,48],[542,2],[547,49],[554,50],[553,2],[555,51],[534,52],[533,2],[535,53],[532,54],[531,2],[549,55],[551,5],[548,2],[550,56],[552,57],[575,58],[574,2],[576,59],[557,60],[556,2],[558,61],[560,62],[559,2],[561,63],[563,64],[562,2],[564,65],[569,66],[568,2],[570,67],[572,68],[571,2],[573,69],[580,70],[579,2],[581,71],[482,72],[481,2],[483,73],[583,74],[582,2],[584,75],[778,5],[779,76],[586,77],[585,2],[587,78],[900,2],[901,2],[902,2],[903,2],[904,2],[905,2],[906,2],[907,2],[908,2],[909,2],[920,79],[910,2],[911,2],[912,2],[913,2],[914,2],[915,2],[916,2],[917,2],[918,2],[919,2],[589,80],[588,81],[590,82],[591,83],[592,84],[942,2],[607,85],[606,2],[608,86],[594,87],[593,2],[595,88],[597,89],[596,2],[598,90],[600,91],[599,2],[601,92],[610,93],[609,2],[611,94],[613,95],[612,2],[614,96],[618,97],[617,2],[619,98],[633,99],[632,2],[634,100],[523,101],[524,102],[639,103],[638,2],[640,104],[645,105],[644,2],[646,106],[648,107],[647,108],[642,109],[641,2],[643,110],[650,111],[649,2],[651,112],[653,113],[652,2],[654,114],[656,115],[655,2],[657,116],[960,117],[961,117],[957,118],[958,119],[659,120],[658,2],[660,121],[943,101],[944,122],[945,123],[946,124],[669,125],[668,2],[670,126],[666,127],[665,2],[667,128],[672,129],[671,2],[673,130],[678,131],[677,2],[679,132],[675,133],[674,2],[676,134],[965,135],[688,136],[687,137],[686,2],[682,138],[681,139],[680,2],[637,140],[636,141],[635,2],[685,142],[684,143],[683,2],[578,144],[577,2],[691,145],[690,146],[689,2],[694,147],[693,148],[692,2],[715,149],[714,150],[713,2],[703,151],[702,152],[701,2],[697,153],[696,154],[695,2],[706,155],[705,156],[704,2],[700,157],[699,158],[698,2],[709,159],[708,160],[707,2],[712,161],[711,162],[710,2],[718,163],[717,164],[716,2],[729,165],[728,166],[727,2],[721,167],[720,168],[719,2],[723,169],[722,170],[732,171],[731,172],[730,2],[605,173],[604,174],[603,2],[602,2],[736,175],[735,176],[734,2],[733,177],[949,178],[948,179],[947,5],[740,180],[739,181],[738,2],[370,182],[744,183],[743,184],[742,2],[747,185],[746,186],[745,2],[373,187],[372,188],[371,2],[726,189],[725,190],[724,2],[506,191],[509,192],[507,193],[508,2],[504,194],[503,195],[502,5],[755,196],[754,197],[753,2],[752,198],[748,199],[751,200],[749,5],[750,201],[758,202],[757,203],[756,2],[761,204],[760,205],[759,2],[765,206],[764,207],[763,2],[762,208],[768,209],[767,210],[766,2],[616,211],[615,101],[774,212],[773,213],[772,2],[771,214],[770,2],[769,5],[782,215],[781,216],[780,2],[777,217],[776,218],[775,2],[786,219],[785,220],[784,2],[792,221],[791,222],[790,2],[795,223],[794,224],[793,2],[798,225],[796,226],[797,81],[821,227],[819,228],[818,2],[820,5],[801,229],[800,230],[799,2],[804,231],[803,232],[802,2],[807,233],[806,234],[805,2],[810,235],[809,236],[808,2],[813,237],[812,238],[811,2],[817,239],[815,240],[814,2],[816,5],[881,241],[879,242],[364,243],[365,244],[882,2],[880,245],[368,2],[366,246],[890,247],[895,248],[898,2],[894,249],[896,2],[273,2],[899,250],[891,2],[877,251],[876,252],[883,253],[887,2],[367,2],[897,2],[886,2],[888,254],[889,81],[884,255],[885,256],[878,257],[892,2],[893,2],[369,2],[545,258],[544,259],[543,2],[823,260],[822,261],[826,262],[825,263],[824,2],[857,264],[856,265],[855,2],[845,266],[844,267],[843,2],[829,268],[828,269],[827,2],[832,270],[831,271],[830,2],[835,272],[834,273],[833,2],[854,274],[853,275],[852,2],[838,276],[837,277],[836,2],[842,278],[841,279],[839,280],[840,2],[848,281],[847,282],[846,2],[851,283],[850,284],[849,2],[863,285],[862,286],[861,2],[860,287],[859,288],[858,2],[952,289],[951,290],[950,5],[866,291],[865,292],[864,2],[869,293],[868,294],[867,2],[872,295],[871,296],[870,2],[875,297],[874,298],[873,2],[789,299],[788,300],[787,2],[783,301],[522,302],[567,303],[566,304],[565,2],[662,305],[663,306],[661,307],[664,308],[963,309],[962,5],[964,310],[511,311],[510,5],[737,312],[741,5],[954,313],[953,2],[921,314],[922,315],[923,17],[924,316],[925,317],[938,318],[926,319],[927,320],[928,321],[505,322],[929,323],[930,324],[472,325],[933,326],[934,327],[931,328],[935,329],[936,330],[932,331],[937,332],[959,2],[956,333],[955,101],[313,2],[318,334],[315,335],[314,336],[317,337],[316,336],[292,338],[293,339],[294,340],[291,341],[290,5],[309,342],[310,2],[311,343],[312,344],[332,2],[349,345],[346,2],[347,346],[348,347],[350,348],[322,349],[323,350],[306,351],[295,352],[297,2],[307,353],[308,354],[296,2],[338,355],[341,356],[343,2],[344,2],[339,357],[342,358],[340,2],[337,2],[319,359],[320,360],[363,361],[336,362],[335,5],[345,2],[321,363],[359,364],[361,365],[358,366],[360,2],[357,367],[303,368],[324,369],[299,370],[304,371],[302,372],[305,373],[300,374],[298,374],[301,375],[334,376],[333,377],[353,378],[352,379],[354,2],[351,367],[356,380],[355,381],[331,382],[330,2],[328,383],[326,2],[327,384],[325,2],[329,2],[362,2],[272,5],[457,322],[458,385],[395,2],[396,386],[375,387],[376,388],[455,2],[456,389],[453,2],[454,390],[447,2],[448,391],[397,2],[398,392],[399,2],[400,393],[377,2],[378,394],[401,2],[402,395],[379,387],[380,396],[381,387],[382,397],[383,387],[384,398],[467,399],[468,400],[385,2],[386,401],[449,2],[450,402],[451,2],[452,403],[387,5],[388,404],[469,5],[470,405],[433,2],[434,406],[439,5],[440,407],[389,2],[390,408],[471,409],[444,410],[443,387],[404,411],[403,2],[462,412],[461,413],[459,2],[406,414],[405,2],[408,415],[407,2],[392,416],[391,2],[394,417],[393,387],[410,418],[409,5],[466,419],[465,2],[446,420],[445,2],[436,421],[435,2],[412,422],[411,5],[460,5],[418,423],[417,2],[420,424],[419,2],[414,425],[413,5],[422,426],[421,2],[424,427],[423,5],[416,428],[415,2],[432,429],[431,5],[426,430],[425,5],[430,431],[429,5],[438,432],[437,2],[464,433],[463,434],[428,435],[427,2],[442,436],[441,5],[501,437],[497,438],[484,2],[500,439],[493,440],[491,441],[490,441],[489,440],[486,441],[487,440],[495,442],[488,441],[485,440],[492,441],[498,443],[499,444],[494,445],[496,441],[1049,446],[1050,447],[1048,5],[1046,448],[1045,448],[1047,449],[1044,450],[1026,5],[1017,451],[1014,451],[1011,451],[1015,451],[1016,451],[1013,451],[1012,451],[1023,452],[1010,451],[1006,451],[1025,451],[1024,5],[1009,453],[1039,5],[1030,454],[1038,454],[1032,454],[1029,454],[1033,451],[1037,2],[1036,454],[1035,454],[1027,454],[1034,455],[1028,454],[1031,454],[1040,456],[1002,457],[1007,453],[1001,451],[1005,458],[1003,454],[1008,459],[1004,454],[1000,460],[998,2],[1019,454],[1018,461],[999,451],[1043,462],[1042,463],[1041,450],[1057,464],[1055,465],[1056,465],[1054,466],[1053,467],[1052,468],[1051,450],[1105,2],[1067,2],[1073,469],[1069,1],[1071,470],[1072,1],[1075,471],[1076,472],[1080,473],[1084,474],[1074,475],[966,2],[968,476],[969,476],[970,2],[971,2],[973,477],[974,2],[975,2],[976,476],[977,2],[978,2],[979,478],[980,2],[981,2],[982,479],[983,2],[984,480],[985,2],[986,2],[987,2],[988,2],[991,2],[990,481],[967,2],[992,482],[993,2],[989,2],[994,2],[995,476],[996,483],[997,484],[1086,485],[1091,486],[1087,2],[1090,487],[1088,2],[1083,488],[1095,489],[207,490],[972,2],[1096,491],[1097,5],[1098,2],[1078,2],[1099,492],[1100,2],[1101,493],[1102,494],[1112,495],[1111,496],[1127,497],[1128,498],[1089,2],[1129,2],[205,499],[206,2],[1130,500],[1093,501],[1092,502],[1085,2],[55,503],[56,503],[58,504],[59,505],[60,506],[61,507],[62,508],[63,509],[64,510],[65,511],[66,512],[67,513],[68,513],[70,514],[69,515],[71,514],[72,516],[73,517],[57,518],[107,2],[74,519],[75,520],[76,521],[108,522],[77,523],[78,524],[79,525],[80,526],[81,527],[82,528],[83,529],[84,530],[85,531],[86,532],[87,532],[88,533],[89,534],[91,535],[90,536],[92,537],[93,538],[94,2],[95,539],[96,540],[97,541],[98,542],[99,543],[100,544],[101,545],[102,546],[103,547],[104,548],[105,549],[106,550],[1131,2],[1132,2],[51,2],[1082,2],[1081,2],[1133,5],[1134,5],[1136,551],[1137,5],[1138,2],[1139,302],[1142,552],[1140,5],[521,5],[1141,302],[49,2],[53,553],[54,5],[1079,554],[1143,2],[1144,2],[52,2],[148,555],[149,556],[124,557],[127,557],[146,555],[147,555],[137,555],[136,558],[134,555],[129,555],[142,555],[140,555],[144,555],[128,555],[141,555],[145,555],[130,555],[131,555],[143,555],[125,555],[132,555],[133,555],[135,555],[139,555],[150,559],[138,555],[126,555],[163,560],[162,2],[157,559],[159,561],[158,559],[151,559],[152,559],[154,559],[156,559],[160,561],[161,561],[153,561],[155,561],[1145,562],[1094,563],[1146,475],[1147,2],[1149,564],[1148,2],[1126,2],[1150,2],[210,2],[1158,565],[1159,566],[1160,2],[1161,567],[1162,568],[1153,2],[214,2],[1151,2],[121,2],[113,500],[115,569],[122,570],[114,571],[116,475],[118,2],[117,2],[119,572],[120,2],[1104,2],[215,573],[50,2],[175,574],[164,2],[171,575],[169,576],[170,577],[165,578],[166,579],[172,577],[174,580],[173,581],[167,582],[109,583],[1110,584],[1108,585],[1107,496],[1109,586],[1077,514],[123,2],[1115,587],[1124,588],[1113,2],[1114,589],[1125,590],[1120,591],[1121,592],[1119,593],[1123,594],[1117,595],[1116,596],[1122,597],[1118,588],[229,598],[227,2],[228,599],[1058,600],[1135,2],[241,601],[238,602],[239,603],[237,604],[240,605],[234,606],[235,607],[236,608],[230,609],[231,609],[233,610],[232,609],[226,568],[1155,611],[1154,612],[1152,613],[1156,2],[168,2],[9,2],[10,2],[12,2],[11,2],[2,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[3,2],[4,2],[24,2],[21,2],[22,2],[23,2],[25,2],[26,2],[27,2],[5,2],[28,2],[29,2],[30,2],[31,2],[6,2],[35,2],[32,2],[33,2],[34,2],[36,2],[7,2],[37,2],[42,2],[43,2],[38,2],[39,2],[40,2],[41,2],[8,2],[47,2],[44,2],[45,2],[46,2],[1,2],[48,2],[1157,614],[1022,615],[1021,616],[1020,2],[225,669],[242,669],[245,620],[243,621],[244,622],[270,623],[246,624],[264,625],[247,626],[248,627],[249,669],[250,669],[263,629],[267,629],[252,629],[259,630],[256,629],[251,631],[255,625],[253,629],[266,625],[258,625],[262,670],[254,625],[269,633],[265,629],[268,629],[260,625],[261,625],[257,625],[1062,2],[1065,634],[1064,636],[271,637],[176,670],[224,639],[219,640],[223,641],[220,642],[222,643],[221,644],[203,669],[212,646],[204,647],[209,671],[208,620],[217,649],[216,650],[211,646],[218,651],[213,652],[200,653],[201,655],[202,670],[111,659],[112,660],[1060,661],[199,662],[183,663],[195,2],[196,2],[182,663],[190,664],[197,665],[192,666],[191,2],[193,666],[181,2],[184,663],[180,2],[189,667],[186,663],[187,2],[188,668],[185,2],[194,2],[198,2]],"semanticDiagnosticsPerFile":[1070,1068,280,279,281,285,287,284,286,282,283,274,275,288,289,277,276,278,1103,1106,1059,627,626,628,621,620,622,624,623,625,630,629,631,473,374,474,476,475,477,479,478,480,513,512,514,516,515,517,519,518,520,526,525,527,529,528,530,540,539,541,537,536,538,939,940,941,546,542,547,554,553,555,534,533,535,532,531,549,551,548,550,552,575,574,576,557,556,558,560,559,561,563,562,564,569,568,570,572,571,573,580,579,581,482,481,483,583,582,584,778,779,586,585,587,900,901,902,903,904,905,906,907,908,909,920,910,911,912,913,914,915,916,917,918,919,589,588,590,591,592,942,607,606,608,594,593,595,597,596,598,600,599,601,610,609,611,613,612,614,618,617,619,633,632,634,523,524,639,638,640,645,644,646,648,647,642,641,643,650,649,651,653,652,654,656,655,657,960,961,957,958,659,658,660,943,944,945,946,669,668,670,666,665,667,672,671,673,678,677,679,675,674,676,965,688,687,686,682,681,680,637,636,635,685,684,683,578,577,691,690,689,694,693,692,715,714,713,703,702,701,697,696,695,706,705,704,700,699,698,709,708,707,712,711,710,718,717,716,729,728,727,721,720,719,723,722,732,731,730,605,604,603,602,736,735,734,733,949,948,947,740,739,738,370,744,743,742,747,746,745,373,372,371,726,725,724,506,509,507,508,504,503,502,755,754,753,752,748,751,749,750,758,757,756,761,760,759,765,764,763,762,768,767,766,616,615,774,773,772,771,770,769,782,781,780,777,776,775,786,785,784,792,791,790,795,794,793,798,796,797,821,819,818,820,801,800,799,804,803,802,807,806,805,810,809,808,813,812,811,817,815,814,816,881,879,364,365,882,880,368,366,890,895,898,894,896,273,899,891,877,876,883,887,367,897,886,888,889,884,885,878,892,893,369,545,544,543,823,822,826,825,824,857,856,855,845,844,843,829,828,827,832,831,830,835,834,833,854,853,852,838,837,836,842,841,839,840,848,847,846,851,850,849,863,862,861,860,859,858,952,951,950,866,865,864,869,868,867,872,871,870,875,874,873,789,788,787,783,522,567,566,565,662,663,661,664,963,962,964,511,510,737,741,954,953,921,922,923,924,925,938,926,927,928,505,929,930,472,933,934,931,935,936,932,937,959,956,955,313,318,315,314,317,316,292,293,294,291,290,309,310,311,312,332,349,346,347,348,350,322,323,306,295,297,307,308,296,338,341,343,344,339,342,340,337,319,320,363,336,335,345,321,359,361,358,360,357,303,324,299,304,302,305,300,298,301,334,333,353,352,354,351,356,355,331,330,328,326,327,325,329,362,272,457,458,395,396,375,376,455,456,453,454,447,448,397,398,399,400,377,378,401,402,379,380,381,382,383,384,467,468,385,386,449,450,451,452,387,388,469,470,433,434,439,440,389,390,471,444,443,404,403,462,461,459,406,405,408,407,392,391,394,393,410,409,466,465,446,445,436,435,412,411,460,418,417,420,419,414,413,422,421,424,423,416,415,432,431,426,425,430,429,438,437,464,463,428,427,442,441,501,497,484,500,493,491,490,489,486,487,495,488,485,492,498,499,494,496,1049,1050,1048,1046,1045,1047,1044,1026,1017,1014,1011,1015,1016,1013,1012,1023,1010,1006,1025,1024,1009,1039,1030,1038,1032,1029,1033,1037,1036,1035,1027,1034,1028,1031,1040,1002,1007,1001,1005,1003,1008,1004,1000,998,1019,1018,999,1043,1042,1041,1057,1055,1056,1054,1053,1052,1051,1105,1067,1073,1069,1071,1072,1075,1076,1080,1084,1074,966,968,969,970,971,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,991,990,967,992,993,989,994,995,996,997,1086,1091,1087,1090,1088,1083,1095,207,972,1096,1097,1098,1078,1099,1100,1101,1102,1112,1111,1127,1128,1089,1129,205,206,1130,1093,1092,1085,55,56,58,59,60,61,62,63,64,65,66,67,68,70,69,71,72,73,57,107,74,75,76,108,77,78,79,80,81,82,83,84,85,86,87,88,89,91,90,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,1131,1132,51,1082,1081,1133,1134,1136,1137,1138,1139,1142,1140,521,1141,49,53,54,1079,1143,1144,52,148,149,124,127,146,147,137,136,134,129,142,140,144,128,141,145,130,131,143,125,132,133,135,139,150,138,126,163,162,157,159,158,151,152,154,156,160,161,153,155,1145,1094,1146,1147,1149,1148,1126,1150,210,1158,1159,1160,1161,1162,1153,214,1151,121,113,115,122,114,116,118,117,119,120,1104,215,50,175,164,171,169,170,165,166,172,174,173,167,109,1110,1108,1107,1109,1077,123,1115,1124,1113,1114,1125,1120,1121,1119,1123,1117,1116,1122,1118,229,227,228,1058,1135,241,238,239,237,240,234,235,236,230,231,233,232,226,1155,1154,1152,1156,168,9,10,12,11,2,13,14,15,16,17,18,19,20,3,4,24,21,22,23,25,26,27,5,28,29,30,31,6,35,32,33,34,36,7,37,42,43,38,39,40,41,8,47,44,45,46,1,48,1157,1022,1021,1020,110,225,242,245,243,244,270,246,264,247,248,249,250,263,267,252,259,256,251,255,253,266,258,262,254,269,265,268,260,261,257,1062,1065,1063,1064,271,176,1061,224,219,223,220,222,221,203,212,204,209,208,217,216,211,218,213,200,178,201,179,1066,177,202,111,112,1060,199,183,195,196,182,190,197,192,191,193,181,184,180,189,186,187,188,185,194,198],"affectedFilesPendingEmit":[[1070,1],[1068,1],[280,1],[279,1],[281,1],[285,1],[287,1],[284,1],[286,1],[282,1],[283,1],[274,1],[275,1],[288,1],[289,1],[277,1],[276,1],[278,1],[1103,1],[1106,1],[1059,1],[627,1],[626,1],[628,1],[621,1],[620,1],[622,1],[624,1],[623,1],[625,1],[630,1],[629,1],[631,1],[473,1],[374,1],[474,1],[476,1],[475,1],[477,1],[479,1],[478,1],[480,1],[513,1],[512,1],[514,1],[516,1],[515,1],[517,1],[519,1],[518,1],[520,1],[526,1],[525,1],[527,1],[529,1],[528,1],[530,1],[540,1],[539,1],[541,1],[537,1],[536,1],[538,1],[939,1],[940,1],[941,1],[546,1],[542,1],[547,1],[554,1],[553,1],[555,1],[534,1],[533,1],[535,1],[532,1],[531,1],[549,1],[551,1],[548,1],[550,1],[552,1],[575,1],[574,1],[576,1],[557,1],[556,1],[558,1],[560,1],[559,1],[561,1],[563,1],[562,1],[564,1],[569,1],[568,1],[570,1],[572,1],[571,1],[573,1],[580,1],[579,1],[581,1],[482,1],[481,1],[483,1],[583,1],[582,1],[584,1],[778,1],[779,1],[586,1],[585,1],[587,1],[900,1],[901,1],[902,1],[903,1],[904,1],[905,1],[906,1],[907,1],[908,1],[909,1],[920,1],[910,1],[911,1],[912,1],[913,1],[914,1],[915,1],[916,1],[917,1],[918,1],[919,1],[589,1],[588,1],[590,1],[591,1],[592,1],[942,1],[607,1],[606,1],[608,1],[594,1],[593,1],[595,1],[597,1],[596,1],[598,1],[600,1],[599,1],[601,1],[610,1],[609,1],[611,1],[613,1],[612,1],[614,1],[618,1],[617,1],[619,1],[633,1],[632,1],[634,1],[523,1],[524,1],[639,1],[638,1],[640,1],[645,1],[644,1],[646,1],[648,1],[647,1],[642,1],[641,1],[643,1],[650,1],[649,1],[651,1],[653,1],[652,1],[654,1],[656,1],[655,1],[657,1],[960,1],[961,1],[957,1],[958,1],[659,1],[658,1],[660,1],[943,1],[944,1],[945,1],[946,1],[669,1],[668,1],[670,1],[666,1],[665,1],[667,1],[672,1],[671,1],[673,1],[678,1],[677,1],[679,1],[675,1],[674,1],[676,1],[965,1],[688,1],[687,1],[686,1],[682,1],[681,1],[680,1],[637,1],[636,1],[635,1],[685,1],[684,1],[683,1],[578,1],[577,1],[691,1],[690,1],[689,1],[694,1],[693,1],[692,1],[715,1],[714,1],[713,1],[703,1],[702,1],[701,1],[697,1],[696,1],[695,1],[706,1],[705,1],[704,1],[700,1],[699,1],[698,1],[709,1],[708,1],[707,1],[712,1],[711,1],[710,1],[718,1],[717,1],[716,1],[729,1],[728,1],[727,1],[721,1],[720,1],[719,1],[723,1],[722,1],[732,1],[731,1],[730,1],[605,1],[604,1],[603,1],[602,1],[736,1],[735,1],[734,1],[733,1],[949,1],[948,1],[947,1],[740,1],[739,1],[738,1],[370,1],[744,1],[743,1],[742,1],[747,1],[746,1],[745,1],[373,1],[372,1],[371,1],[726,1],[725,1],[724,1],[506,1],[509,1],[507,1],[508,1],[504,1],[503,1],[502,1],[755,1],[754,1],[753,1],[752,1],[748,1],[751,1],[749,1],[750,1],[758,1],[757,1],[756,1],[761,1],[760,1],[759,1],[765,1],[764,1],[763,1],[762,1],[768,1],[767,1],[766,1],[616,1],[615,1],[774,1],[773,1],[772,1],[771,1],[770,1],[769,1],[782,1],[781,1],[780,1],[777,1],[776,1],[775,1],[786,1],[785,1],[784,1],[792,1],[791,1],[790,1],[795,1],[794,1],[793,1],[798,1],[796,1],[797,1],[821,1],[819,1],[818,1],[820,1],[801,1],[800,1],[799,1],[804,1],[803,1],[802,1],[807,1],[806,1],[805,1],[810,1],[809,1],[808,1],[813,1],[812,1],[811,1],[817,1],[815,1],[814,1],[816,1],[881,1],[879,1],[364,1],[365,1],[882,1],[880,1],[368,1],[366,1],[890,1],[895,1],[898,1],[894,1],[896,1],[273,1],[899,1],[891,1],[877,1],[876,1],[883,1],[887,1],[367,1],[897,1],[886,1],[888,1],[889,1],[884,1],[885,1],[878,1],[892,1],[893,1],[369,1],[545,1],[544,1],[543,1],[823,1],[822,1],[826,1],[825,1],[824,1],[857,1],[856,1],[855,1],[845,1],[844,1],[843,1],[829,1],[828,1],[827,1],[832,1],[831,1],[830,1],[835,1],[834,1],[833,1],[854,1],[853,1],[852,1],[838,1],[837,1],[836,1],[842,1],[841,1],[839,1],[840,1],[848,1],[847,1],[846,1],[851,1],[850,1],[849,1],[863,1],[862,1],[861,1],[860,1],[859,1],[858,1],[952,1],[951,1],[950,1],[866,1],[865,1],[864,1],[869,1],[868,1],[867,1],[872,1],[871,1],[870,1],[875,1],[874,1],[873,1],[789,1],[788,1],[787,1],[783,1],[522,1],[567,1],[566,1],[565,1],[662,1],[663,1],[661,1],[664,1],[963,1],[962,1],[964,1],[511,1],[510,1],[737,1],[741,1],[954,1],[953,1],[921,1],[922,1],[923,1],[924,1],[925,1],[938,1],[926,1],[927,1],[928,1],[505,1],[929,1],[930,1],[472,1],[933,1],[934,1],[931,1],[935,1],[936,1],[932,1],[937,1],[959,1],[956,1],[955,1],[313,1],[318,1],[315,1],[314,1],[317,1],[316,1],[292,1],[293,1],[294,1],[291,1],[290,1],[309,1],[310,1],[311,1],[312,1],[332,1],[349,1],[346,1],[347,1],[348,1],[350,1],[322,1],[323,1],[306,1],[295,1],[297,1],[307,1],[308,1],[296,1],[338,1],[341,1],[343,1],[344,1],[339,1],[342,1],[340,1],[337,1],[319,1],[320,1],[363,1],[336,1],[335,1],[345,1],[321,1],[359,1],[361,1],[358,1],[360,1],[357,1],[303,1],[324,1],[299,1],[304,1],[302,1],[305,1],[300,1],[298,1],[301,1],[334,1],[333,1],[353,1],[352,1],[354,1],[351,1],[356,1],[355,1],[331,1],[330,1],[328,1],[326,1],[327,1],[325,1],[329,1],[362,1],[272,1],[457,1],[458,1],[395,1],[396,1],[375,1],[376,1],[455,1],[456,1],[453,1],[454,1],[447,1],[448,1],[397,1],[398,1],[399,1],[400,1],[377,1],[378,1],[401,1],[402,1],[379,1],[380,1],[381,1],[382,1],[383,1],[384,1],[467,1],[468,1],[385,1],[386,1],[449,1],[450,1],[451,1],[452,1],[387,1],[388,1],[469,1],[470,1],[433,1],[434,1],[439,1],[440,1],[389,1],[390,1],[471,1],[444,1],[443,1],[404,1],[403,1],[462,1],[461,1],[459,1],[406,1],[405,1],[408,1],[407,1],[392,1],[391,1],[394,1],[393,1],[410,1],[409,1],[466,1],[465,1],[446,1],[445,1],[436,1],[435,1],[412,1],[411,1],[460,1],[418,1],[417,1],[420,1],[419,1],[414,1],[413,1],[422,1],[421,1],[424,1],[423,1],[416,1],[415,1],[432,1],[431,1],[426,1],[425,1],[430,1],[429,1],[438,1],[437,1],[464,1],[463,1],[428,1],[427,1],[442,1],[441,1],[501,1],[497,1],[484,1],[500,1],[493,1],[491,1],[490,1],[489,1],[486,1],[487,1],[495,1],[488,1],[485,1],[492,1],[498,1],[499,1],[494,1],[496,1],[1049,1],[1050,1],[1048,1],[1046,1],[1045,1],[1047,1],[1044,1],[1026,1],[1017,1],[1014,1],[1011,1],[1015,1],[1016,1],[1013,1],[1012,1],[1023,1],[1010,1],[1006,1],[1025,1],[1024,1],[1009,1],[1039,1],[1030,1],[1038,1],[1032,1],[1029,1],[1033,1],[1037,1],[1036,1],[1035,1],[1027,1],[1034,1],[1028,1],[1031,1],[1040,1],[1002,1],[1007,1],[1001,1],[1005,1],[1003,1],[1008,1],[1004,1],[1000,1],[998,1],[1019,1],[1018,1],[999,1],[1043,1],[1042,1],[1041,1],[1057,1],[1055,1],[1056,1],[1054,1],[1053,1],[1052,1],[1051,1],[1105,1],[1067,1],[1073,1],[1069,1],[1071,1],[1072,1],[1075,1],[1076,1],[1080,1],[1084,1],[1074,1],[966,1],[968,1],[969,1],[970,1],[971,1],[973,1],[974,1],[975,1],[976,1],[977,1],[978,1],[979,1],[980,1],[981,1],[982,1],[983,1],[984,1],[985,1],[986,1],[987,1],[988,1],[991,1],[990,1],[967,1],[992,1],[993,1],[989,1],[994,1],[995,1],[996,1],[997,1],[1086,1],[1091,1],[1087,1],[1090,1],[1088,1],[1083,1],[1095,1],[207,1],[972,1],[1096,1],[1097,1],[1098,1],[1078,1],[1099,1],[1100,1],[1101,1],[1102,1],[1112,1],[1111,1],[1127,1],[1128,1],[1089,1],[1129,1],[205,1],[206,1],[1130,1],[1093,1],[1092,1],[1085,1],[55,1],[56,1],[58,1],[59,1],[60,1],[61,1],[62,1],[63,1],[64,1],[65,1],[66,1],[67,1],[68,1],[70,1],[69,1],[71,1],[72,1],[73,1],[57,1],[107,1],[74,1],[75,1],[76,1],[108,1],[77,1],[78,1],[79,1],[80,1],[81,1],[82,1],[83,1],[84,1],[85,1],[86,1],[87,1],[88,1],[89,1],[91,1],[90,1],[92,1],[93,1],[94,1],[95,1],[96,1],[97,1],[98,1],[99,1],[100,1],[101,1],[102,1],[103,1],[104,1],[105,1],[106,1],[1131,1],[1132,1],[51,1],[1082,1],[1081,1],[1133,1],[1134,1],[1136,1],[1137,1],[1138,1],[1139,1],[1142,1],[1140,1],[521,1],[1141,1],[49,1],[53,1],[54,1],[1079,1],[1143,1],[1144,1],[52,1],[148,1],[149,1],[124,1],[127,1],[146,1],[147,1],[137,1],[136,1],[134,1],[129,1],[142,1],[140,1],[144,1],[128,1],[141,1],[145,1],[130,1],[131,1],[143,1],[125,1],[132,1],[133,1],[135,1],[139,1],[150,1],[138,1],[126,1],[163,1],[162,1],[157,1],[159,1],[158,1],[151,1],[152,1],[154,1],[156,1],[160,1],[161,1],[153,1],[155,1],[1145,1],[1094,1],[1146,1],[1147,1],[1149,1],[1148,1],[1126,1],[1150,1],[210,1],[1158,1],[1159,1],[1160,1],[1161,1],[1162,1],[1153,1],[214,1],[1151,1],[121,1],[113,1],[115,1],[122,1],[114,1],[116,1],[118,1],[117,1],[119,1],[120,1],[1104,1],[215,1],[50,1],[175,1],[164,1],[171,1],[169,1],[170,1],[165,1],[166,1],[172,1],[174,1],[173,1],[167,1],[109,1],[1110,1],[1108,1],[1107,1],[1109,1],[1077,1],[123,1],[1115,1],[1124,1],[1113,1],[1114,1],[1125,1],[1120,1],[1121,1],[1119,1],[1123,1],[1117,1],[1116,1],[1122,1],[1118,1],[229,1],[227,1],[228,1],[1058,1],[1135,1],[241,1],[238,1],[239,1],[237,1],[240,1],[234,1],[235,1],[236,1],[230,1],[231,1],[233,1],[232,1],[226,1],[1155,1],[1154,1],[1152,1],[1156,1],[168,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[1157,1],[1022,1],[1021,1],[1020,1],[110,1],[225,1],[242,1],[245,1],[243,1],[244,1],[270,1],[246,1],[264,1],[247,1],[248,1],[249,1],[250,1],[263,1],[267,1],[252,1],[259,1],[256,1],[251,1],[255,1],[253,1],[266,1],[258,1],[262,1],[254,1],[269,1],[265,1],[268,1],[260,1],[261,1],[257,1],[1062,1],[1065,1],[1063,1],[1064,1],[271,1],[176,1],[1061,1],[224,1],[219,1],[223,1],[220,1],[222,1],[221,1],[203,1],[212,1],[204,1],[209,1],[208,1],[217,1],[216,1],[211,1],[218,1],[213,1],[200,1],[178,1],[201,1],[179,1],[1066,1],[177,1],[202,1],[111,1],[112,1],[1060,1],[199,1],[183,1],[195,1],[196,1],[182,1],[190,1],[197,1],[192,1],[191,1],[193,1],[181,1],[184,1],[180,1],[189,1],[186,1],[187,1],[188,1],[185,1],[194,1],[198,1]]},"version":"4.9.5"} \ No newline at end of file diff --git a/packages/plugin-api/common.d.ts b/packages/plugin-api/common.d.ts new file mode 100644 index 0000000..eca4b9b --- /dev/null +++ b/packages/plugin-api/common.d.ts @@ -0,0 +1,109 @@ +import type { + IpcMainEvent, + IpcRendererEvent, + IpcMainInvokeEvent, +} from 'electron'; + +/** + * Logger interface for plugin logging + */ +export interface Logger { + debug(message: unknown | unknown[], tags: string[]): void; + info(message: unknown | unknown[], tags: string[]): void; + warning(message: unknown | unknown[], tags: string[]): void; + error(message: unknown | unknown[], tags: string[]): void; + fatal(message: unknown | unknown[], tags: string[]): void; + trace(message: unknown | unknown[], tags: string[]): void; +} + +export type IpcEvent = IpcMainEvent | IpcRendererEvent; +export type IpcAction = (event: IpcEvent, ...args: any[]) => void; +export type IpcInvokeEvent = IpcMainInvokeEvent; +export type IpcInvoke = ( + event: IpcInvokeEvent, + ...args: any[] +) => any | Promise; + +export type IpcResultStatus = 'OK' | 'ERROR'; + +export interface IpcResult { + status: IpcResultStatus; + errorMessage?: string | undefined; +} + +export type ChannelsMain = + | 'browseFileSystem' + | 'createNewProject' + | 'getXtoryTemplates' + | 'getFileTypes' + | 'openProject' + | 'openFileAsTab' + | 'fspExists' + | 'fspMkdir' + | 'fspWriteFile' + | 'fsMove' + | 'fsRemove' + | 'revealPathInOS' + | 'customIPC' + | 'logMessage' + | 'selectImageFile' + | 'importResource' + | 'getResources' + | 'updateResourceMetadata' + | 'removeResource' + | 'getPluginConfig' + | 'updatePluginConfig' + | 'updatePluginEnabled' + | 'restartApp' + | 'getCharacters' + | 'createCharacter' + | 'updateCharacter' + | 'removeCharacter' + | 'getCharacterSettings' + | 'updateCharacterSettings' + | 'serviceCall'; + +export type ChannelsRenderer = + | 'addFileMenuItem' + | 'broadcastLogMessage' + | 'toastMessage' + | 'onProjectOpened' + | 'onOpenFileAsTab' + | 'onProjectTreeUpdated' + | 'onLoadPlugins' + | 'onPluginsLoadingStart' + | 'onPluginsLoadingComplete'; + +/** + * The variable type of a variable. + * + * NOTE: zero is used as uninitialized canary in the C runtime, and can NOT be a valid value. + */ +export declare enum VariableType { + Bool = 1, + Int = 2, + Float = 3, + String = 4, +} + +declare const unknownVariableTypeSymbol: unique symbol; +type UnknownVariableType = typeof unknownVariableTypeSymbol; +interface VariableInfoTypeMap { + [unknownVariableTypeSymbol]: unknown; + [VariableType.Bool]: boolean; + [VariableType.Int]: number; + [VariableType.Float]: number; + [VariableType.String]: string; +} + +/** + * A variable record from the variables table, containing the variable's details + */ +export interface VariableInfo< + T extends VariableType | UnknownVariableType = UnknownVariableType +> { + name: string; + type: T extends UnknownVariableType ? VariableType : T; + init: VariableInfoTypeMap[T]; + comment?: string; +} diff --git a/packages/plugin-api/common.js b/packages/plugin-api/common.js new file mode 100644 index 0000000..9581304 --- /dev/null +++ b/packages/plugin-api/common.js @@ -0,0 +1,12 @@ +module.exports = { + VariableType: { + 1: 'Bool', + 2: 'Int', + 3: 'Float', + 4: 'String', + Bool: 1, + Int: 2, + Float: 3, + String: 4, + }, +}; diff --git a/packages/plugin-api/index.d.ts b/packages/plugin-api/index.d.ts index 1824e6e..dd1e84d 100644 --- a/packages/plugin-api/index.d.ts +++ b/packages/plugin-api/index.d.ts @@ -1,19 +1,53 @@ -import type ReactType from 'react'; -import type * as ReactFlow from 'reactflow'; +import type { Logger } from './common'; + +export * from './common'; /** * Current plugin API version */ export const PLUGIN_API_VERSION = 1; +/** + * Unified API for plugin services + */ +export interface IService { + init(): Promise; +} + +/** + * Either a service constructor, or a provider function + */ +export type ServiceProvider = (new () => IService) | (() => IService); + +/** + * Undefined means unrestricted number of connection with all possible node types + * A number means a maximum of that many connections with all possible node types + * A configuration object can be used to provide the restriction on the node types + */ +export type ConnectionPortInfo = + | undefined + | number + | { + /** + * Maximum number of connections + * Undefined means no restrictions + */ + count?: number; + /** + * Valid nodes to make connection with + * Undefined means no restrictions + */ + types?: string[]; + }; + /** * Connection information for a node in the flow graph */ export interface ConnectionInfo { - /** Number of input connections */ - in: number; - /** Number of output connections */ - out: number; + /** Information about input connections */ + in: ConnectionPortInfo; + /** Information about output connections */ + out: ConnectionPortInfo; } /** @@ -69,89 +103,37 @@ export interface IFlowViewBuilder extends IFileViewBuilder { * Main plugin API builder */ export interface IPluginApi { + /** The fullpath of the xtory project in which this plugin is loading from */ + readonly projectPath: string; + /** * Add a new file view configuration * @param type - The type of file view (currently only 'flow' is supported) * @returns FlowView builder for configuration */ addFileView(type: 'flow'): IFlowViewBuilder; -} - -/** - * Logger interface for plugin logging - */ -export interface Logger { - debug(message: unknown | unknown[], tags: string[]): void; - info(message: unknown | unknown[], tags: string[]): void; - warning(message: unknown | unknown[], tags: string[]): void; - error(message: unknown | unknown[], tags: string[]): void; - fatal(message: unknown | unknown[], tags: string[]): void; - trace(message: unknown | unknown[], tags: string[]): void; -} - -/** - * Options for opening the resource drawer - */ -export interface OpenResourceDrawerOptions { - /** The type of resource to filter (default: 'image') */ - filterType?: string; - /** Callback invoked when a resource is selected */ - onSelect: (uuid: string) => void; -} -/** - * Hook for opening the resource drawer - */ -export interface UseResourceDrawer { - /** Function to open the resource drawer with specified options */ - openResourceDrawer: (options: OpenResourceDrawerOptions) => void; -} - -/** - * Modules exposed from xtory to be accessed by the plugins. - * NOTE: the renderer environment does not allow arbitrary imports - * and everything should be bundled with in a single file. - * Renderer files are not allowed to import anything directly and can only access these explictly - * exposed exports - */ -export interface XtoryRendererExposedModules { - React: typeof ReactType; - ReactFlow: typeof ReactFlow; -} - -/** - * Hooks exposed from xtory renderer - */ -export interface XtoryRendererExposedHooks { - /** Hook to access the global resource drawer */ - useResourceDrawer: () => UseResourceDrawer; -} - -export type NodeComponent = ReactType.ComponentType; - -/** - * Renderer bindings exposed to the plugin through the window instance - */ -export interface XtoryRenderer { - modules: XtoryRendererExposedModules; - hooks: XtoryRendererExposedHooks; - registerNodeRenderer: (id: string, component: NodeComponent) => void; - getNodeRenderer: (id: string) => NodeComponent | null; + /** + * Add a new foreign services + * @param name - The unique name which the service is to be registered under, this name can be used to retrieve the service instance. + * @param service - Either a void constructor or a provider function for constructing new, but uninitialized instance of the service. + * @returns The same plugin API instance for chaining. + */ + addService(name: string, service: ServiceProvider): this; } -declare global { +export interface PluginContext { /** * The plugin API builder used to configure the plugin */ - const api: IPluginApi; + readonly api: IPluginApi; /** * Logger instance for this plugin */ - const logger: Logger; + readonly logger: Logger; +} - // renderer extensions - interface Window { - renderer: XtoryRenderer; - } +declare global { + const XTORY_VERSION: string; } diff --git a/packages/plugin-api/index.js b/packages/plugin-api/index.js index d367835..e6ba99c 100644 --- a/packages/plugin-api/index.js +++ b/packages/plugin-api/index.js @@ -1,3 +1,6 @@ +const { VariableType } = require('./common'); + module.exports = { PLUGIN_API_VERSION: 1, + VariableType, }; diff --git a/packages/plugin-api/package.json b/packages/plugin-api/package.json index 9cc0bbb..ac0dbf6 100644 --- a/packages/plugin-api/package.json +++ b/packages/plugin-api/package.json @@ -2,8 +2,10 @@ "name": "@xtory/plugin-api", "version": "0.2.5", "description": "Type definitions for Xtory plugin API", - "main": "./index.js", - "types": "./index.d.ts", + "exports": { + ".": "./index.js", + "./renderer": "./renderer.js" + }, "author": "Xtory", "license": "MIT", "repository": { @@ -21,7 +23,11 @@ ], "files": [ "index.js", - "index.d.ts" + "index.d.ts", + "renderer.js", + "renderer.d.ts", + "common.js", + "common.d.ts" ], "publishConfig": { "access": "public" diff --git a/packages/plugin-api/renderer.d.ts b/packages/plugin-api/renderer.d.ts new file mode 100644 index 0000000..5c6aa05 --- /dev/null +++ b/packages/plugin-api/renderer.d.ts @@ -0,0 +1,172 @@ +import type React from 'react'; +import type * as Mui from '@mui/material'; +import type * as ReactFlow from 'reactflow'; +import type * as Icons from '@mui/icons-material'; + +import type { + IpcAction, + IpcResult, + ChannelsMain, + ChannelsRenderer, + VariableInfo, + Logger, + VariableType, +} from './common'; + +export * from './common'; + +/** + * Current plugin API version + */ +export const PLUGIN_API_VERSION = 1; + +/** + * Modules exposed from xtory to be accessed by the plugins. + * NOTE: the renderer environment does not allow arbitrary imports + * and everything should be bundled with in a single file. + * Renderer files are not allowed to import anything directly and can only access these explictly + * exposed exports + */ +export interface XtoryRendererExposedModules { + React: typeof React; + ReactFlow: typeof ReactFlow; +} + +export interface PickVariableProps { + selected: VariableInfo['name'] | null; + onChange?: ( + event: React.SyntheticEvent, + newValue: VariableInfo | null + ) => void; + filter?: (variables: VariableInfo[], input: string) => VariableInfo[]; + /** Custom item renderer */ + renderItem?: ( + props: React.HTMLAttributes & { key: any }, + variable: VariableInfo, + state: Mui.AutocompleteRenderOptionState + ) => React.ReactNode; + sx?: Mui.SxProps; + style?: React.CSSProperties; +} +export type NodeRelativeHandle = ReactFlow.HandleProps & + Omit, 'id'> & + React.RefAttributes; + +/** + * UI components and utilities exposed to plugins for consistent theming + */ +export interface XtoryRendererExposedUI { + icons: typeof Icons; + + // Material-UI components + Box: typeof Mui.Box; + Checkbox: typeof Mui.Checkbox; + Typography: typeof Mui.Typography; + TextField: typeof Mui.TextField; + Button: typeof Mui.Button; + IconButton: typeof Mui.IconButton; + Paper: typeof Mui.Paper; + Autocomplete: typeof Mui.Autocomplete; + Chip: typeof Mui.Chip; + Dialog: typeof Mui.Dialog; + DialogTitle: typeof Mui.DialogTitle; + DialogContent: typeof Mui.DialogContent; + DialogActions: typeof Mui.DialogActions; + Select: typeof Mui.Select; + MenuItem: typeof Mui.MenuItem; + FormControl: typeof Mui.FormControl; + FormLabel: typeof Mui.FormLabel; + InputLabel: typeof Mui.InputLabel; + Tooltip: typeof Mui.Tooltip; + InputAdornment: typeof Mui.InputAdornment; + + // MUI utilities + styled: typeof Mui.styled; + useTheme: typeof Mui.useTheme; + + // Shared xtory components + NodeContainer: React.ComponentType<{ + title: string; + selected: boolean; + children: React.ReactNode; + }>; + TextArea: React.ComponentType; + PickVariable: React.ComponentType; + NodeRelativeHandle: React.ComponentType; +} + +/** + * Options for opening the resource drawer + */ +export interface OpenResourceDrawerOptions { + /** The type of resource to filter (default: 'image') */ + filterType?: string; + /** Callback invoked when a resource is selected */ + onSelect: (uuid: string) => void; +} + +/** + * Hook for opening the resource drawer + */ +export interface UseResourceDrawer { + /** Function to open the resource drawer with specified options */ + openResourceDrawer: (options: OpenResourceDrawerOptions) => void; +} + +/** + * Hooks exposed from xtory renderer + */ +export interface XtoryRendererExposedHooks { + /** Hook to access the global resource drawer */ + useResourceDrawer: () => UseResourceDrawer; + useInit(initCallback: (resolve: () => void) => void): void; + /** Focus and center a node in a flow view context */ + useFocusAndCenter( + ref: React.RefObject, + id: string, + selected: boolean + ): (resolve?: (() => void) | undefined) => void; + /** Hook to gain access to the variables */ + useVariables: () => Record; +} + +export type NodeComponent = React.ComponentType; + +/** + * Renderer bindings exposed to the plugin through the window instance + */ +export interface XtoryRenderer { + modules: XtoryRendererExposedModules; + ui: XtoryRendererExposedUI; + hooks: XtoryRendererExposedHooks; + logger: Logger; + registerNodeRenderer: (id: string, component: NodeComponent) => void; + getNodeRenderer: (id: string) => NodeComponent | null; + VariableType: typeof VariableType; + uuidv4: () => string; +} + +interface GenericNodeProps extends ReactFlow.NodeProps { + data: T; +} + +export interface ElectronHandler { + ipcRenderer: { + on(channel: ChannelsRenderer, ipcAction: IpcAction): () => void; + once(channel: ChannelsRenderer, func: (...args: unknown[]) => void): void; + sendMessage(channel: ChannelsMain, ...args: unknown[]): void; + invoke(channel: ChannelsMain, ...args: unknown[]): Promise; + }; +} + +declare global { + namespace React {} + interface React {} + namespace Renderer { + type NodeProps = GenericNodeProps; + } + interface Window { + readonly renderer: XtoryRenderer; + readonly electron: ElectronHandler; + } +} diff --git a/packages/plugin-api/renderer.js b/packages/plugin-api/renderer.js new file mode 100644 index 0000000..23b40f6 --- /dev/null +++ b/packages/plugin-api/renderer.js @@ -0,0 +1,6 @@ +const VariableType = require('./common'); + +module.exports = { + PLUGIN_API_VERSION: 1, + VariableType, +}; diff --git a/packages/plugin-reference-nodes/.eslintrc.json b/packages/plugin-reference-nodes/.eslintrc.json index a104016..7b0dad7 100644 --- a/packages/plugin-reference-nodes/.eslintrc.json +++ b/packages/plugin-reference-nodes/.eslintrc.json @@ -1,7 +1,6 @@ { "globals": { - "api": "readonly", - "logger": "readonly", - "React": "readonly" + "React": "readonly", + "Renderer": "readonly" } } diff --git a/packages/plugin-reference-nodes/package.json b/packages/plugin-reference-nodes/package.json index af584c4..e46ca9f 100644 --- a/packages/plugin-reference-nodes/package.json +++ b/packages/plugin-reference-nodes/package.json @@ -1,7 +1,7 @@ { "name": "@xtory/plugin-reference-nodes", "version": "0.2.5", - "yumeApiVersion": 1, + "xtoryApiVersion": 1, "main": "dist/main.js", "rendererMain": "dist/renderer.js", "description": "Xtory plugin adding reference nodes (Image, Note) to xflow flows", @@ -27,11 +27,12 @@ }, "scripts": { "build": "tsc", + "typecheck": "tsc --noEmit", "watch": "tsc --watch" }, "devDependencies": { "@xtory/plugin-api": "*", "@types/react": "^18.0.0", - "typescript": "^5.0.0" + "typescript": "^4.9.5" } } diff --git a/packages/plugin-reference-nodes/src/main.ts b/packages/plugin-reference-nodes/src/main.ts index 693e06a..55c6ff8 100644 --- a/packages/plugin-reference-nodes/src/main.ts +++ b/packages/plugin-reference-nodes/src/main.ts @@ -1,18 +1,20 @@ -/// +import type { PluginContext } from '@xtory/plugin-api'; -api - .addFileView('flow') - .setFileType('xflow') - .setOptional(true) // Only register if xflow fileType is already registered - .setNodes([ - { - type: 'Image', - connections: { in: 1, out: 1 }, - renderer: 'reference-nodes/ImageNode', - }, - { - type: 'Note', - connections: { in: 1, out: 1 }, - renderer: 'reference-nodes/NoteNode', - }, - ]); +export default function ({ api }: PluginContext) { + api + .addFileView('flow') + .setFileType('xflow') + .setOptional(true) // Only register if xflow fileType is already registered + .setNodes([ + { + type: 'Image', + connections: { in: 0, out: { types: ['Plot'] } }, + renderer: 'reference-nodes/ImageNode', + }, + { + type: 'Note', + connections: { in: 0, out: { types: ['Plot'] } }, + renderer: 'reference-nodes/NoteNode', + }, + ]); +} diff --git a/packages/plugin-reference-nodes/src/renderer.tsx b/packages/plugin-reference-nodes/src/renderer.tsx index 66305ac..4697716 100644 --- a/packages/plugin-reference-nodes/src/renderer.tsx +++ b/packages/plugin-reference-nodes/src/renderer.tsx @@ -1,10 +1,9 @@ -/// +/// /// -// React is available globally via window.React from the main app - const { modules: { ReactFlow }, + ui: { Button, TextArea, NodeContainer }, hooks: { useResourceDrawer }, registerNodeRenderer, } = window.renderer; @@ -16,12 +15,7 @@ interface ImageNodeData { alt?: string; } -interface ImageNodeProps { - data: ImageNodeData; - id: string; -} - -function ImageNode({ data, id }: ImageNodeProps) { +function ImageNode({ data, id }: Renderer.NodeProps) { const { src, alt } = data || {}; const [imageSrc, setImageSrc] = React.useState(src); const [imageAlt, setImageAlt] = React.useState(alt || ''); @@ -64,19 +58,7 @@ function ImageNode({ data, id }: ImageNodeProps) { }, [openResourceDrawer, handleSelectImage]); return ( -
- - + {imageSrc ? ( )} - + {imageAlt && (
@@ -125,7 +99,7 @@ function ImageNode({ data, id }: ImageNodeProps) { )} -
+
); } @@ -142,7 +116,6 @@ interface NoteNodeProps { function NoteNode({ id, data, selected }: NoteNodeProps) { const [text, setText] = React.useState(data.text || ''); const { setNodes } = useReactFlow(); - const textareaRef = React.useRef(null); React.useEffect(() => { if (data.text !== text) { @@ -150,14 +123,8 @@ function NoteNode({ id, data, selected }: NoteNodeProps) { } }, [data.text, text]); - React.useEffect(() => { - if (selected && textareaRef.current) { - textareaRef.current.focus(); - } - }, [selected]); - const handleTextChange = React.useCallback( - (e: React.ChangeEvent) => { + (e: React.ChangeEvent) => { const newText = e.target.value; setText(newText); @@ -173,48 +140,18 @@ function NoteNode({ id, data, selected }: NoteNodeProps) { ); return ( -
- - -
- Note -
- -