diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d5507ed49..466c65778 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,15 +19,15 @@ jobs: with: node-version: '>=24.13.0' cache: yarn - - name: Install dependencies and build website + - name: Install dependencies + run: yarn install + - name: Build Site env: APP_URL: ${{ secrets.APP_URL }} BACKEND_URL: ${{ secrets.BACKEND_URL }} GH_OAUTH_CLIENT_ID: ${{ vars.GH_OAUTH_CLIENT_ID}} SITE_CONFIG_PATH: ${{ vars.SITE_CONFIG_PATH }} - run: | - yarn install - yarn build + run: yarn build working-directory: . - name: Upload Build Artifact uses: actions/upload-pages-artifact@v3 diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 85aa880a9..29c9c051b 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -32,6 +32,7 @@ import { socketIoNoDepWarningsPluginConfig, aliasConfigurationPlugin } from './src/siteConfig/pluginConfigs'; +import pageIndexPlugin from './packages/tdev/page-index/plugin'; import { useTdevContentPath } from './src/siteConfig/helpers'; import path from 'path'; import { @@ -383,7 +384,8 @@ const docusaurusConfig = withSiteConfig().then(async (siteConfig) => { ...(siteConfig.pages || {}) } ], - ...((siteConfig.plugins as Config['plugins']) || []) + ...((siteConfig.plugins as Config['plugins']) || []), + pageIndexPlugin ], themes: [ '@docusaurus/theme-mermaid', @@ -405,4 +407,4 @@ const docusaurusConfig = withSiteConfig().then(async (siteConfig) => { return config; }); -export default docusaurusConfig; +export default docusaurusConfig; \ No newline at end of file diff --git a/package.json b/package.json index 35ed55ab6..0bb7a6d2a 100644 --- a/package.json +++ b/package.json @@ -115,9 +115,6 @@ "vfile": "^6.0.3", "vitest": "^2.0.5" }, - "resolutions": { - "@rspack/core": "1.6.5" - }, "peerDependencies": { "react-hook-form": "*" }, diff --git a/packages/tdev/brython-code/README.mdx b/packages/tdev/brython-code/README.mdx index 790c0e0df..d78517320 100644 --- a/packages/tdev/brython-code/README.mdx +++ b/packages/tdev/brython-code/README.mdx @@ -1,5 +1,5 @@ --- -page_id: e7bde0ab-c0fe-4225-8325-e4ebc22d414b +page_id: 0f9fe018-9c46-4ec0-be50-c2ae69a6a005 tags: - '@tdev/' - python diff --git a/packages/tdev/page-index/README.mdx b/packages/tdev/page-index/README.mdx new file mode 100644 index 000000000..7f6c93007 --- /dev/null +++ b/packages/tdev/page-index/README.mdx @@ -0,0 +1,204 @@ +--- +page_id: cfbd9607-c2d5-4c2a-82e0-9f39c5756747 +tags: + - '@tdev/' +--- + +import { useStore } from '@tdev-hooks/useStore' +import { observer } from 'mobx-react-lite'; +import CodeBlock from '@theme/CodeBlock'; +import JsObjectViewer from '@tdev-components/shared/JsObject/Viewer'; + +# page-index + +Dieses Plugin ermöglicht eine Übersicht über alle speicherbaren Dokumente. So kann bspw. der Bearbeitungsstand in der Seitenleiste angezeigt werden. + +Standardmässig wird in der Seitenleiste der Bearbeitungsstand in zwei Fällen angezeigt: +1. Auf einer Seite sind *Statusdokument* vorhanden, deren Fortschritt bestimmt werden kann (sog. `TaskableDocuments`, bspw. `task_state` oder `progress_state`). +2. In einer Kategorie befinden sich direkt untergeordnete Seiten mit *Statusdokumenten*. + +![--width=800px](./images/taskable-sidebar.png) + +Dieses Verhalten kann über das *Frontmatter* der Seite angepasst werden: + +:::cards{flexBasis="300px"} +```yaml +--- +sidebar_custom_props: + taskable_state: 'show' +--- +``` +Bearbeitungsstand anzeigen, auch wenn keine Statusdokumente in den direkt untergeordneten Seiten vorhanden sind. +::br +```yaml +--- +sidebar_custom_props: + taskable_state: 'hide' +--- +``` +Bearbeitungsstand nicht anzeigen, auch wenn Statusdokumente vorhanden sind. +::: + +## Page index + +Der Seitenindex ist ein Baum aller speicherbaren Dokumente in der aktuellen Seite. + +Im `dev`-Modus wird er automatisch aktualisiert, wenn sich die Seite ändert. + +:::details[Page Index] + +export const Comp = observer(() => { + const pageStore = useStore('pageStore') + + return ( +
+ {JSON.stringify(pageStore._pageIndex, null, 2)} +
+ ); +}); + + +::: + +## Für Plugin-Autoren + +Wenn ein Plugin ein weiteres *Statusdokument* implementiert, das im Seitenindex erfasst werden soll, müssen folgende Schritte durchgeführt werden: +1. In der `siteConfig` die neue Komponente für das `remark`-Plugin registrieren: + ```ts title="siteConfig.ts" + import { PageIndexPluginDefaultOptions } from './src/siteConfig/markdownPluginConfigs'; + const indexPluginOptions = { + ...PageIndexPluginDefaultOptions, + components: [ + ...PageIndexPluginDefaultOptions.components, + { + name: 'MyNewTaskableDocument', + docTypeExtractor: (node: MdxJsxFlowElement) => 'my_new_taskable_document' + } + ] + }; + export const pageIndexPluginConfig = [pageIndexPlugin, indexPluginOptions]; + ``` +2. Im `index.ts` des neuen Plugins den neuen Dokumenttyp importieren: + ```ts title="packages///index.ts" + declare module '@tdev-api/document' { + export interface TaskableDocumentMapping { + ['my_new_taskable_document']: MyNewTaskableData; + } + export interface TypeModelMapping { + ['my_new_taskable_document']: MyNewTaskableDocument; + } + } + ``` + :::warning[iTaskableDocument] + Das neue `MyNewTaskableDocument`-Modell muss das Interface `iTaskableDocument<'my_new_taskable_document'>` implementieren, damit es im Seitenindex als *Statusdokument* erkannt wird. + ::: +3. Im `apiDocumentProviders` den neuen Dokumenttyp registrieren: + ```ts title="siteConfig.ts" + const getSiteConfig = () => { + apiDocumentProviders: { + ..., + require.resolve('@scope/new-plugin/register') + } + } + ``` + und den neuen Dokumenttyp im `ComponentStore` registrieren: + ```ts title="packages///register.ts" + const register = () => { + rootStore.componentStore.registerTaskableDocumentType('my_new_taskable_document'); + }; + ``` + +## Installation + +:::info[`docusaurus.config.ts`] +```ts +import pageIndexPlugin from './packages/tdev/page-index/plugin'; + +export default { + // ... + plugins: [ + // ... + pageIndexPlugin + ] +}; + +``` +::: + +:::info[swizzle `theme/DocSidebarItem/index.tsx`] +See the swizzled component of this page. This should be synced with the `updateTdev.config.yaml` by default. +::: + + +:::details[remark config] +```ts +import pageProgressStatePlugin from '@tdev/page-index/remark-plugin'; + +export const PageIndexPluginDefaultOptions: PageIndexPluginOptions = { + components: [ + { + name: 'Answer', + docTypeExtractor: (node) => { + return ( + getAnswerDocumentType( + node.attributes.find((a) => a.type === 'mdxJsxAttribute' && a.name === 'type') + ?.value as string + ) || 'unknown' + ); + } + }, + { + name: 'ProgressState', + docTypeExtractor: () => 'progress_state' + }, + { + name: 'TaskState', + docTypeExtractor: () => 'task_state' + }, + { + name: 'QuillV2', + docTypeExtractor: () => 'quill_v2' + }, + { + name: 'String', + docTypeExtractor: () => 'string' + }, + { + name: 'CmsText', + docTypeExtractor: () => 'cms_text' + }, + { + name: 'CmsCode', + docTypeExtractor: () => 'cms_text' + }, + { + name: 'Restricted', + docTypeExtractor: () => 'restricted' + }, + { + name: 'DynamicDocumentRoots', + docTypeExtractor: () => 'dynamic_document_roots' + } + ], + persistedCodeType: (node: Code) => { + if (node.lang === 'html') { + return 'script'; + } + const liveLangMatch = /(live_[a-zA-Z0-9-_]+)/.exec(node.meta || ''); + const liveCode = liveLangMatch ? liveLangMatch[1] : null; + + switch (liveCode) { + case 'live_py': + case 'live_bry': + // legacy name, TODO. should be 'brython_code'? + return 'script'; + case 'live_pyo': + return 'pyodide_code'; + default: + return 'code'; + } + } +}; +export const pageIndexPluginConfig = [pageIndexPlugin, PageIndexPluginDefaultOptions]; +``` +::: \ No newline at end of file diff --git a/packages/tdev/page-index/components/TaskableState/index.tsx b/packages/tdev/page-index/components/TaskableState/index.tsx new file mode 100644 index 000000000..3133b4d04 --- /dev/null +++ b/packages/tdev/page-index/components/TaskableState/index.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.scss'; +import { observer } from 'mobx-react-lite'; +import Page from '@tdev-models/Page'; +import Icon from '@mdi/react'; +import useIsBrowser from '@docusaurus/useIsBrowser'; + +interface Props { + page?: Page; + className?: string; + forcedAction?: 'show' | 'hide'; +} + +const TaskableState = observer((props: Props) => { + const { page } = props; + const isBrowser = useIsBrowser(); + const forceHide = props.forcedAction === 'hide'; + if (forceHide) { + return null; + } + + if (!isBrowser || !page) { + return null; + } + const forceShow = props.forcedAction === 'show'; + + if (!forceShow && page.stepsOnPage === 0 && page.stepsOnDirectSubPages === 0) { + return null; + } + + return ( +
{ + const thisElement = e.currentTarget; + thisElement.parentElement?.querySelector('a')?.click(); + }} + > + +
+ ); +}); + +export default TaskableState; diff --git a/packages/tdev/page-index/components/TaskableState/styles.module.scss b/packages/tdev/page-index/components/TaskableState/styles.module.scss new file mode 100644 index 000000000..8bd004f2f --- /dev/null +++ b/packages/tdev/page-index/components/TaskableState/styles.module.scss @@ -0,0 +1,12 @@ +.taskableState { + display: flex; + align-items: center; + justify-content: center; + height: 2em; + width: 2em; + cursor: pointer; + border-radius: 1em; + &:hover { + background-color: var(--ifm-hover-overlay); + } +} diff --git a/packages/tdev/page-index/images/taskable-sidebar.png b/packages/tdev/page-index/images/taskable-sidebar.png new file mode 100644 index 000000000..c04c2bd0f Binary files /dev/null and b/packages/tdev/page-index/images/taskable-sidebar.png differ diff --git a/packages/tdev/page-index/images/taskable-sidebar.png.excalidraw b/packages/tdev/page-index/images/taskable-sidebar.png.excalidraw new file mode 100644 index 000000000..6b3d53eb2 --- /dev/null +++ b/packages/tdev/page-index/images/taskable-sidebar.png.excalidraw @@ -0,0 +1,611 @@ +{ + "type": "excalidraw", + "version": 2, + "elements": [ + { + "id": "TDEV-BACKGROUND-IMAGE", + "type": "image", + "x": 0, + "y": 0, + "width": 445, + "height": 559, + "roughness": 0, + "opacity": 100, + "isDeleted": false, + "fileId": "TDEV-BACKGROUND--FILE", + "scale": [ + 1, + 1 + ], + "locked": true, + "customData": { + "exportFormatMimeType": "image/png", + "exportPadding": 4 + }, + "version": 2, + "versionNonce": 573287145, + "index": "a0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "seed": 1, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1770247548661, + "link": null, + "status": "pending", + "crop": null + }, + { + "id": "TDEV-IMAGE--RECTANGLE", + "type": "rectangle", + "x": 0, + "y": 0, + "width": 445, + "height": 559, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "locked": true, + "version": 2, + "versionNonce": 573287144, + "index": "a1", + "isDeleted": false, + "angle": 0, + "seed": 1, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1770247548661, + "link": null + }, + { + "id": "8-8yrCtx4PU0QPmyP2kGs", + "type": "text", + "x": 623.0766065968326, + "y": 357.47268348297536, + "width": 496.22381591796875, + "height": 48.6, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": null, + "seed": 814616999, + "version": 154, + "versionNonce": 714376617, + "isDeleted": false, + "boundElements": [], + "updated": 1770247741661, + "link": null, + "locked": false, + "text": "Enthalten TaskableDocuments", + "fontSize": 36, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Enthalten TaskableDocuments", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "FgnNFsNzNRYBXy_J8pJXS", + "type": "line", + "x": 608.32582, + "y": 357.47268302254025, + "width": 0, + "height": 55.16401372086386, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": { + "type": 2 + }, + "seed": 1020752199, + "version": 92, + "versionNonce": 2059866985, + "isDeleted": false, + "boundElements": [], + "updated": 1770247593910, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 55.16401372086386 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "GGdpT5dFNrLKK0yKAY-Rc", + "type": "arrow", + "x": 608.3258196765732, + "y": 356.04437637292256, + "width": 163.28548039029647, + "height": 130.18707220307417, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": { + "type": 2 + }, + "seed": 1268936137, + "version": 77, + "versionNonce": 741454343, + "isDeleted": false, + "boundElements": [], + "updated": 1770247604539, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -163.28548039029647, + -130.18707220307417 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false + }, + { + "id": "DVSREq4Ef0ofOh63yTXLL", + "type": "arrow", + "x": 608.3258196765732, + "y": 413.4149505641078, + "width": 163.28548039029647, + "height": 105.17936357087831, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": { + "type": 2 + }, + "seed": 727439655, + "version": 39, + "versionNonce": 707815273, + "isDeleted": false, + "boundElements": [], + "updated": 1770247612246, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -163.28548039029647, + 105.17936357087831 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false + }, + { + "id": "p1ooWVetebSkJ2n7rnlaf", + "type": "arrow", + "x": 606.8548690978753, + "y": 395.7624661975892, + "width": 161.8145298115985, + "height": 26.478726549777775, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": { + "type": 2 + }, + "seed": 1818333769, + "version": 40, + "versionNonce": 1865184201, + "isDeleted": false, + "boundElements": [], + "updated": 1770247615149, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -161.8145298115985, + 26.478726549777775 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false + }, + { + "id": "0PzJFjvP0z7ovn-ZlJn_6", + "type": "arrow", + "x": 607.5903443872244, + "y": 374.43233602879013, + "width": 163.28548039029647, + "height": 93.41101821357131, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": { + "type": 2 + }, + "seed": 1658655401, + "version": 47, + "versionNonce": 1527276615, + "isDeleted": false, + "boundElements": [], + "updated": 1770247619837, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -163.28548039029647, + -93.41101821357131 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false + }, + { + "id": "Uq3G12utv_3iauKXWmGEQ", + "type": "arrow", + "x": 607.5903440978752, + "y": 168.48672863056774, + "width": 162.55000481159846, + "height": 0, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": { + "type": 2 + }, + "seed": 597904009, + "version": 98, + "versionNonce": 1875424937, + "isDeleted": false, + "boundElements": [], + "updated": 1770247754982, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -162.55000481159846, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "8NlUihPEosJeJVHpTNSNb", + "focus": -0.12298231980817184, + "gap": 15.486262678253752 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false + }, + { + "id": "nXpLQrCOAwx4mauafchMY", + "type": "line", + "x": 608.3258198598327, + "y": 105.23193257222115, + "width": 0, + "height": 114.74118205181236, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": { + "type": 2 + }, + "seed": 1710221159, + "version": 103, + "versionNonce": 1439527625, + "isDeleted": false, + "boundElements": [], + "updated": 1770247723177, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 114.74118205181236 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "8NlUihPEosJeJVHpTNSNb", + "type": "text", + "x": 623.076606776129, + "y": 86.62131751655198, + "width": 602.02783203125, + "height": 145.8, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aA", + "roundness": null, + "seed": 1935552041, + "version": 186, + "versionNonce": 1353578889, + "isDeleted": false, + "boundElements": [ + { + "id": "Uq3G12utv_3iauKXWmGEQ", + "type": "arrow" + } + ], + "updated": 1770247754982, + "link": null, + "locked": false, + "text": "Kategorie mit direkt untergeordneten\nSeiten, die TaskableDocuments \nenthalten", + "fontSize": 36, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kategorie mit direkt untergeordneten\nSeiten, die TaskableDocuments \nenthalten", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "FxcdmPEaKJ4_IWQDA4lKc", + "type": "arrow", + "x": 608.3258196765732, + "y": 16.969560995299833, + "width": 163.28548095057124, + "height": 0, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aB", + "roundness": { + "type": 2 + }, + "seed": 1963716457, + "version": 73, + "versionNonce": 878699401, + "isDeleted": false, + "boundElements": [], + "updated": 1770247765552, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -163.28548095057124, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false + }, + { + "id": "oYKPgOpkt7MKfcGRduSD2", + "type": "line", + "x": 608.3258198414095, + "y": -19.806459043829165, + "width": 0, + "height": 69.87439483784124, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aC", + "roundness": { + "type": 2 + }, + "seed": 1234400935, + "version": 59, + "versionNonce": 1490561863, + "isDeleted": false, + "boundElements": [], + "updated": 1770247805410, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 69.87439483784124 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "U5nrzQGZ2JNHrhPZK_EfS", + "type": "text", + "x": 623.0766072283326, + "y": -31.63043921391389, + "width": 642.52783203125, + "height": 97.2, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 522207175, + "version": 91, + "versionNonce": 609424231, + "isDeleted": false, + "boundElements": [], + "updated": 1770247826306, + "link": null, + "locked": false, + "text": "Übergeordnete Kategorie ohne Anzeige\ndes Bearbeitungsstandes", + "fontSize": 36, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Übergeordnete Kategorie ohne Anzeige\ndes Bearbeitungsstandes", + "autoResize": true, + "lineHeight": 1.35 + } + ], + "files": { + "TDEV-BACKGROUND--FILE": { + "id": "TDEV-BACKGROUND--FILE", + "mimeType": "image/png", + "dataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAAIvCAYAAADgaAWRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAKffSURBVHhe7N13fFPV/8fxV5M03S20dFBomaXsvWTJEETli4OfeyBfHIgKoqLiAhTEAfIVFSciiIoDFQVFEJCyZO+yobQUunebJk3S3x9p0uQmLS2UQs3n+Xjk8YBzzk1vbm7v+55zz731KC0tLUUIIYT4Fzt+KpGY5tGolBVCCCHEv5WEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSdEFby7IpeeU87x684iZZUQog6ptdC7+e1Uek45x5HkEmUV2B1UBk8/T2a+WVkthNu4Y24a17x0jt/3SMCKq9/OnTtJT09XFldbRkYGO3bsUBbXuFoLvcr8urOIpZsL8ff2YN6YEEICrorVEpU4mGTgiQWZzPs9T1klhHATW7ZsYcWKFSxcuJC0tDRldZWlpaXxxRdfsHLlSrZs2aKsrlFXPF0OJhqY9XMOahXMGxNC+2itsom4Cq3ep2P7CT1Gs/yRjpr2/aQwts6M5MYuvsoqIa4acXFxrF69GoCioiIWLlxISkqKstkFpaWlsXDhQoqKLCMbq1evJi4uTtmsxlzR0MvMNzNhYSYmM0y5tZ4EnhBC1BEajcbh/zqdrtrBl5KSwsKFC9HpdA7lyveuSVcs9EpMpTzyaQYFxaVMvDGQkd3lrFYIIeqKPn36MGzYMIcyvV7PwoULSU5Odih3JTk52WXgDRs2jD59+jiU1SSP2vojsje/ncr5bBOLnwilRYSGxz/PZG+Cgbv6+vH0iCBlcwe/7Spi8YYCzmYaMZlBrYLGIRoeuNaf/3RzDst3V+SydHMhL4+qR4doLa8szeZkagkmM3RsomXGXfWJqKdGZyhl8ldZ7E0wYDCW4uflweiBATw40F/5lvScco6G9dUsfy6cDfHFfLAqjzPpRgBCA9WMvtafO/r4KRezqe5nePKLTLYd17P4iVBUKnjthxzbZwgNVDN2sD+39XL981JyTMxYlmP7XFqNB52banl5VD0i6qkd2tpvq54tvRyW8/Py4I4+fjw2LNCpvSvK71JnKGXmTznExRdTXFKKWgUtwj159fZ6tGro6bDskeQSHvggnV4xXrw7OpjP1+bz/ZZCCvXl6z/9jvour/eWmEr5fG0+y7YVkVdkmQTVJFTDzLvrs2KX5Xqxct1KTKWs2qtj8YYCzmebMBgrXz/77eTqBO37LYUs2lBAep4JLrBP2O9LH63O4+uNhRiMpbx+V32u7+Tj8N23buS4HtXZpkLUhi1bttiGOa20Wi33338/UVFRDuVWycnJLFq0CIPB4FB+OQPP+kdk1dOmTZumrLwclm4upKC4lFt7+jFjWQ67ThnoFePF63fWVza1KTGVMubDDH7aVkRBsZkW4Z60jdKi1XhwJt3I34eKiU8uYXhnH4flth7TczCphPB6amYsyyHYX02bxlrSck0kZ5n4bVcRI7r5MWpOGueyTPSM8cLb04OUHBM7TurRGUrpFePl8J6frc0nwEdFeq6ZOb/lUs9PRccmWrw9PTiXbWTzUT37Ew1O12Eu9jP8sUdHcpaJ2EhPJn+VhbenBx2beGE2l5KSY2LTET0BPiqnIeE1+3WM+zSDs5kmGodo6NhES4mxlMPJJSzbVkSfWG8aBJYHn3VbdYjW8up32eQWmenSrHx77E0wkJ5non8bbwCyC8yYSqG0FPJ0ZqJCNHRqqqVJqIaeLbyIKTvwHkw0cP/76RxOLqG+v5puzb3Qajw4dr6E5TuKiAxW29oCZOSb+Xl7EY1DNPy5T8fqfcW0j9YSGawhNddEYoaRNft13H6NH2qVh225ElMpd/0vnQ3xxZSWQtvGWmIjPTmZUsKP/xTi5aniXLaJ9tFarmll+QwA7/2ex/w/89EZSomN9CQ20hOjqZTT6UaW7yiiX2vX22lAW29iI8vX2/r9/rqrCLMZOjfzIjJYQ2KGkY1Hijl2voRhnRy/W+u+VKArZcG6Akxlk5X7xlre2/rd39rTz2EdqrtNhagNUVFRaLVaTp48aSszmUwcPHiQZs2aERTk2KlJSkpi8eLFtRp4AFnZuYTUD6r9nl6vGC+2Hdfbzug91eUHMKUpX2ez9qCO1pGefPJoA3y05W1TckyM/SiD9DwTDw8J4OHrAmx11rNytcpyrdB6Zm49QCZlGPH39qC+v5qlT4Xa1uHXnUXMWJaDj9aDDdMb2t6PsrNzH60HWo0Hb98XTJdm5WFzOs3I2I/SKSguZebd9Rnasfwgd7GfwXq2r1bB5JFBDr26RX8X8OGfedTzU7H65QhbeWKGkTvnWmZQzX+ogcM6/rStkDd/yaVlhCffTAy1ldtvq9t6+TF5ZPkOuvloMZO+zALgr1ciCPQt72VZl1P2oCjbztfPSKGguJQXbnFc9z2nDYz/PAMfrQd/vhxh2/bWnp5aBZHBGpY8GWrbVjpDKbfNTiUz38zEGwO5t395T9y6fTs31fLhQyEO+9M7v+byw1ZLr1S5nvP/zKNBgNqpJ2bdtkPa+zDr3vITsop6etafr9yfdYZS7nvfsq+9dV8wg9qVB27PKecID1JTqDczbmig0zq46uldzDYVoja56vF5enpy77330rRpUwASEhL4+uuvKSlxvHXtcgcedj0957Giy2znST0AzcI0lf5ynss2sfagDh+tBwvGO4YFQEQ9Na/fZTko/bTd9XBbh2itwwHKU+3B6GstB8yC4lJm3lXfYR1GdvclPMgy7Hkixfl+Qp2hlCdvCHQIE8o+yyPXWYYArQdZaugz3NDF12kYc/RAf+r5qcgpNDus50d/5mMywxPDndfxtl5+NAvTcCKlhHPZliE4e20bax0Cj7KeR4eynuSmo8UOdZX5cn0BBcWljOjmvO5dmmnp19qbguJSNh2x7AtKnz7iuK18tB7cVxZ0O0+Vnx3ab19l4IHlZMG6/krjr3cOG4Bbe1r2l/hkx7NQV6w/PyRA5XQC56P1YNxQy0nM6r2O1ywAUnNN3N3X9fCnK5e6TYW43Fxd4yspKWHJkiUkJCSQkJDAkiVLrkjg2av10Js8Mgi1yjLcWdnTLdYftBwohnTwcTqYWXVtpqVhfTWZ+Y4Hf6tr25afXVtZr3uEB6mdrpcARDWwzBoyOucCapUlGF0Z1dtSnlB2nY8a+gzWYUWllhGWdU/KLF/RXactPcOKDqTtoiwBYD3xsNdbMZxrZd1GyXY/50L+OW55/zuucb0enZta1mPPaef1aBbm6fK6XacmlmVSc8rX459jliCubPu2i3L+jq1KTKWsO1jMuytyGf95JtfPSOHGWanKZhWyfr9DO7r++b1aWrZpRQF6ZwXfkyuXsk2FqC19+vRh8ODBDmVGo5ElS5awZMkSjMby4yPA4MGDazXwuBKh17axlim31gNg1s85HEx0fUBIzbUc3FqEVz51NbospFw9xSXAp+KPp6qgSl1BOUBYkOMkEHvWg15OYfl61MRnaKiYeGJlXc98XfkyOYVmTGbo+/J5ek455/Rasavik4zwC/2cYud1q0hGvuVzP/BButM69JxyjvcquaHdVeABaMq2b6G+fD2sJxgX2r6urNmvY9C0FF74Ooulmws5fNZAoK/K6VpuZazf79LNhU6fseeUc1z3esVTt8OD1A7DxRdyKdtUiNo0YMAApx6f0Wh0Crxhw4YxYMAAh7LaUPXfuho0srsvd/X1w2SGCQszKww+yoaJqsLPq2rtLjdXoVmbn8FH60H/Nt6VvhoFuw64mqb8ucpXa7sJIZeispMbV44kl/Dqd9loNfDK/9Vj84yGrJ/WkB+eDmPOA8HK5hcUG+np9NnsX9e4CNKKTrouRPneyldNbVMhLoWroU57tT2kae8if/Uu3dMjgugV40VBcSkTFmY69XICvC2rdjDJecjPXmKG5ewhOODyH8h1horn/FifKRoZXN7rqO3P4KP1wGAsZc4DwZW+ujV3PgjXJD8vy+d+bFiA08+2f93Y1fVQcVVpymZxHj1X8fa1zoy0t3qfDpMZ7u5ruV3EfmjS1fXOili/3x4tvJw+m/3rhbKRjUtRW9tUiJpSUfBdycDjSoYewLujg4lqoKGg2HKjeompPFSuL5vCv/aAzqHc3pHkEs5nm2gWpiGy/qUFRlXkFJrZVnZtRen7sgks3ewmkNT2Z4iN9MRktgzdXUnty66jXe716FB2nW9d2bU1Jcs1O+e642XXTl0N6Vqv01VFtxaWk4fN1Zjkc7Fqa5sKUZOUwXelA48rHXqeag8+faQB/t4eJGUYeXpRli0cohto6NvaG52hlLHzM5x6WSk5Jp5ZbJlOP9rFzeSXy2s/5pBiN5mCstsBVuwqQq2CR4eW38hd25/h7n6W95j1cw7Hzjv3fjbEFzPthxxl8UWxTqRx9Vcz7hvgj1oFizcUsCHeORCOnS/hiQWZyuJqG9TO2zYJaMrX2Q4nFiWmUp5elOVwjdUqpmzdVylmVe45beCj1fkOZZXp2kxLywhPTqcZee3HHKcTG+vDD1xto+qqrW0qRE3r06cPAwcOZODAgVc88LjSoUfZxIVvJobh7+3BtuN6nl5kCQGAt++rT9MwDUfOlTB4+nnum5fOM4uzuP3dNEa+lUp6non7+vs73RB+uTSsr6Z5uIZb30m1rctNs1J585dc2z2ByokYtfkZBrXz5q6+fhQUl3LfvHRumpXKM4uzGP95JoOmnWfyV1nklj2x5FINbOuNWgV7Ewzc9k4q4z/PZP6flskU0Q00TLm1HiYzTP4qi0HTzvPM4iyeWZzFda+ncN+8dM4rThwu1sy76qPVeLD2oI4h01MY/3kmYz/KYNC0FI4klzjcM2l1b39//L092HlSb1u3299N49FPM7itV/W+h/f/G4K/twcrdhUxaFoKYz/KsL3f4Onn2RBfjMa5Q1lttblNhahp1tC7Glzx0KPsfrV5Y0JQq2DbcT3vrsiFsp7g1xNCefz6QEID1Rw7X8LGw8Wk5pjoEK1lyYRQJtxY3rOqDe+ODub2a/wsT9w4XExukZlWDT1Z9ESoy9sZavszPD0iiHfuD6ZJqIasAhMbDxez57Tl6S2PXx/I2/dV/ASc6gj0VTH7gWCC/VWczTKx/4zBYULJyO6+LJkQSquGnpSYYOPhYjYeLkbtYblRfMmT5TfIX4r20Vp+fCaMni29MJdabsc4fr6Ege28+fX5cOr5Oe/iIQEqFjxmWbfiklI2Hi6mSG+56Vt5o/2FhASoWDklgmGdfPBUw4FEAxsPF5ORZ6Jbcy+WTAi19YovVW1tUyH+zWrtiSx1XU+75yWKusP6JJX7+vvX6MmFEKJuuWJPZBGiNh0qmzlrnfQihHBvEnriXysxw8iBRANqFfRrfXlv0xBC1A0SeqJOm/ZDDmtd3GaQlGnksc8ssxlv6+Xn8jFhQgj3I9f0qkiu6V2drH+RwNvTg5iGntTzU3H8fIntthJXf31BCOF+rNf0JPSEEEL868lEFiGEEG5HQk8IIYTbkNATQgjhNiT0hBBCuA0JPSGEEG5DQk8IIYTbkNATQgjhNiT0hBBCuA0JPSGEEG5DQk8IIYTbkNATQgjhNiT0hBBCuA0JPSGEEG5DQk8IIYTbkNATQgjhNiT0hBBCuA0JPSGEEG5DQk8IIYTbkNATQgjhNiT0hBBCuA0JPSGEEG5DQk8IIYTbkNATQgjhNiT0hBBCuA0JPSGEEG5DQk8IIYTbkNATQghRo+Li4tiyZYuy+KogoSeEEKLGbNmyhXXr1rF69eqrMvgk9IQQQtSIHTt2sHr1atv/r8bgk9ATQghRI5o1a4avr69D2dUWfBJ6QgghakSDBg148MEH8fHxcSi/moKvzofesuUrGTNuEuMmPo/RaFJWX/XmfbSAMeMm8eMvK5VVV1zc5n8YM24Sc+Z9rKwCIDcvn/GTpjBm3CS++f5nZbUQwg2FhYUxZsyYqzb46nzobdy8DQC93sCWbTuU1eIyMRpNzJr9PjpdMd27duKeO25VNhFXoZ+W/87E515VFgtRo8LCwhg9ejReXl4O5atXryYuLs6hrLbV6dA7euwkuXn5NG0SBcCmrXUv9CY8NpaFH8/l/265SVl1VXtv/mekpqXTvm0sjz/yoLJaXKV++2MNeXn5ymIhalxERAQPPPAAWq3WoXzdunVXtMdXp0Nv9boNANwwdBD+/n4cP3GKlNR0ZTNRw775/mcOxh8lPCyUieMfVlYLIQQAjRo1YvTo0U7BdyWHOuts6BmNJvbuP4SXl5ae3bvQrXNHADb/s13ZVNSguM3/sGZdHOFhoUx59kk0GrWyiRBC2DRq1Ij7778fT09Ph/IrFXwepaWlpcrCumDNuji++f5n+l3Tk7Gj7yYhMYnpb7xLUGAA/3v7NWVzKOuhrFkXx5j776Rdm1i++Gopx46fwmg04uPtzZBB/Rh1s+Mw45hxkxz+78rE8Q/RuWM72//1egMLl3zHnn0HMRgMqFQqGjdqyNgH7iY6qpHDsvbrNKBvb4c6o9HE8pWrWB+3hcLCIgAiwsN47KEH2LR1O2vWxTF08ACX19P27DvI9z/9RkpqGoDt89180/AqB1Xc5n9Y+NV3tG8byzMTxrH/YDzvzV+Al5eWWdNfJCgwQLmITWZWNj/8vIL9B+LRFRdD2Tp07NCW228dQUhwfeUijBk3iQYhwbwz8xWWLV/J2vWb0BUXo9Vquf3WEVw3qD8AW7ft5PufVpCTm2vbthMeG+v0nvbbtlf3rg7fiUajoVVMc/57/11Oy1lV9zNY98H2bWOZOP5hlq9cZfsM1p/3yJj7Ktxuf63fyMpVa8nJzQWgXlAQNw0fYvvc9uy3lf1y1u3x6H/vI7JhhEP7iiz8eK7D/6uz78yZ9zEH448y9cWnUXmoWLD4W84mn8dsNlMvKIiRNw1j0IA+DssI95SQkMCSJUswGo0O5cOGDaNPn8u/jxw/lUhM82jU06ZNm6asrAsWLfmevPx87rnjVhqEBFMvKIgdu/aRkZlFTItmhIU2UC7CgUNHOHX6DC2bN+OTL76isLCI2JgWaLVaMrOyOXbiFDk5eQ4BdibxLBHhYU4vo9FEkU5Hpw5tueU/w23tT54+w9SZs0k4k0SAvz+tY1vi6elJYlIycZv/IbRBCFGNI23trevUpVN7mkQ3tpUbjSZefu0t9uw7SGlpKc2bRhMd1Yjkcyms3bAJracnGZlZtGjWhA7t2tiWA/jw0y/5+bc/KNbrbculpWdy+Ohxdu3ex5CB/RzaV+RM0ln27j9EWGgDwsNCmf2eZRbn808/TsOIMGVzm+079/DmnA84m3wOT42G9m1jiQgPIzMzm4TEJNZt2Ey7NrEE16/nsNzyFX/i6+vDgUOH2b5rH21iW6LVasnKzuHAocMAHIw/ytIflxMW1oBmTaPJzMohKzuHjVu2MbB/H7Ta8rNJ++97/meLSD6XQotmTWjcqCHZ2bmcT0nlr/Ubad+2tdO6XMxnyMnNY8PGrYSFNmDbjt38s2MPLZo1IbRBCFnZOaSmpbNt5x6GDOyPSlU+yGI0mnjtzbls3LINc2kprVo2J7RBCCmpaew7cIjEpGR69ehqa4/dtsrIzOLX31fTKDKC6KhGtu0Rt3kb1/a7Bu+yiQTW/dg6/N+5Yzvbvtzb7r2ru+9s3baTtPRMmkQ15v2Pv0Cr1dKyRVPM5lIys7LZdyAeP19fWjRr4rCccD/16tUjOjqagwcPYjabbeUnT54EoGnTpnata15Wdi4h9YPqZk8vJTWdKVPfcOrV/bJiFctX/EnXzh14ctx/HZbB7sxfpVIxaEAf7rtrlK1u/8F45n7wGQAfzJmJn5/jDZb2Tp4+wxvvzCPA34/Zb0y1nf0ajSYmTH4Zna6YB+653eEM9+jxk7w9dz5eXlrmvTPDtkxFPb0PP/2Snbv3EdOyOc89Nd7hDHvJ0mWs/XsTgFNPz7oNwsNCmf7Ss3h5WcbSjUYT783/jIPxR7l5xPXcMqI8qCti7ek1bRJFalo6er2B5yaNJzamhbKpTUpqOi9NfxOAh0bfzTW9ujvUL1u+khV//IWPj7fDdqCsN6JSqQhtEMKMV5+31VnXw8tLS0mJkdH33m7bVtaTg9S0dKfPZd22Pj7etGsTy6P/vd/h5y1Y9C2btm4nsmEEM6c+byu/2M9g7elZP4P99tfrDTz/ygxy8/K5c9RIhg8dZHs/63dt7SFa30+vNzB15mxS09J54tExdOtiGcLHblt5eWl5/ZXnbL1Oo9HEW+9+wIlTCbZREHvWHp+yd8dF7jvWnp5KpeK+u0Y57PMrV63lx19W4O/vx/uzZ9jKhfuqqLc3cOBABg4c6FBW06w9vTp5TW/VmvUA9OzexaF86KABqFQq9u4/ZBsOdKV502iHwAPo2L4tLZtbzjT2HYx3qLNnNJr4bOHXADz52FiHg+iKVWvQ6Yrpd01PpyGd2JgWdO7YDp2umH0HDjnUKaVnZLJz9z68vLROgQdw312jbOuqtGrNelQqFVOefdJ20ALQaNTce6flM+/ec8BuiQtLTEpGpyvGy0tLRHjFPTzKAsFsNnPj9YOdwgJg1M03EdOyOTpdMevjNiurMZvNjLnvTofPPKBvbxqEBKPXG2jbOsbh5ECjUXP9dZZfloQzSbZye36+vjz+yINO23Hs6LsJCgzg3PkUjh6znG1SA58BcNr+Xl5aW9AdOXbCVm79roMCAxwCz7rMbSNvAOCfHbtt5VZms5nHH3nQYZhVo1HbRh6Onzxt1/rCLmXf6dOru9M+f9PwIfj7+1FQUEhS8jmHOuF+Kgq8YcOGXfbAs1cnQ2/v/oMADL7WcajFz8+XFs2bYjab2bJtp0OdvXZtY5VFALbhxbT0DGWVzSdffEVqWjrDhlzrNGRzKP4oAEMGuR4+jGnRDMp6fZU5WPY+Pbp2djpQWzVrGq0s4tDho7ZgcHXdKCI8FH9/v2ofgNq2jqF921h0umJmzX6/0ocAWA/ow68r78ko9bumB5Str5K/vx+xrZx7khHhoQB0LZuwZM96ndRkcr1e3bt2UhbZWOtOn0m0lV3qZ2jUMMLl9o9p2RyArKwcW9muPfuh7ATO1Xfdro1lX3UV6F5eWlu9vdiYlgC2a4NVcan7jv0lAXtRjSxD+WlpFf9OiX+/pKQkvv76a5eBVxvX8+zVudDbvnMPuWX3GU2Z+gZjxk1yeB0/cQqAvzduVSxZTnn9xsp6naWoSKesgrJhtp2799EmNoY7R41UVpOTmwfA9DfedVqvMeMm8d2yX5WLuHQ+JRWARpHlExGqIjMrG8pCU/mzra+CgkLlYlUycfzDhIeFkpqWznvzLcPArhQUFOLv71fp8LA1pFz1xq3XoCqiVjvvsq7K7FV2/dH6nWdllwfRpX6GoCDn0MBuPa2TYrD7uWvWxTl9V2PGTeKJZ16ytVUK8PdXFkFZz4yy4dGqutR9JyTE9WQg62cuLHLeTsI9JCUlsXjxYkpKShzKr0TgURdDb9vOPVDWqwsI8Hf5UqlUnDufUqP37OXm5fPN9z/j4+PNo2PvV1Y76NyxXaUv+wkrlfH1dXyMT1WFhTZw+pnKV3VpNGqmPPskPj7eHIw/yoeffqlsYqNVTE2uiHIK85WkVjv2smr7MzSJauT0Hdm/2rdtrVzksrgc+45wX8nJyXz11VdXTeBR10KvsLCIvfsPoVKpeOu1l5j3zusuX9ZfTOu1v5owa/b76PUG7rtrlMvhH8qmdgPcdvONTBz/UIWvvr0tQ2MVsR6AE5OSlVU29rOfrPzKnm7eMCLM6WcqXxcjKDCAZyaMQ6VSsXP3PpfP2/Tyssy2dNUDsrJ+rsp6UjWpop47dr1q+xm1tfkZrCc2bVq3cvqO7F+j771duWiNutz7jnA/KSkpLF68GIPBccRh8ODBVyzwqGuht2Z9HGazmRbNm1Z6sBl8bV8Adu21XC+5VN98/zOpaekMGdiPPi4mNlg1L7vGt72sN3qxrJNUdu7ep6yCssk0rupat2qJSqXiyLETlV53uxQtmjWxHYDXrIsjbvM/DvXWa0yr/qr4hGPHrr0A9KjkWltNsl43U8rNyyf+yHFUKhWd2re1ldfmZ2jTKgaA/Qctt2RcKbWx7wj3kZKSwsKFC9Hr9Q7lw4YNY8CAAQ5lta1Ohd6OXZYDvXUSQUXatYklKDCAgoLCSw6gQ4eP2p5Actf/3aKsdjB86CBUKhW//7mOPfssk23sJSYl8857HymLnXTr0pEGIcHk5uXz4adfOhyErNPH811cX/Hz86Vr5w7o9Qbe/t98p2s6RqOJb77/udJJPlUxoG9vhg627LiLvv7BYWLOf24catsGW138nGXLV9oeYaacfXu5nDiVwLLljn/FQq83MGv2+5jNZvr06u5wElWbnyG2VQuiGkVy7nwKCxZ96xQ4er2BeR8tICHReSLLxWgQEgxlz621V1v7jvj3S0tLY9GiRS4D70r28KzqzM3pR4+d5I816/Dy0vLofx+wTUCoSFZ2DqdOnyE3L5/+fXpBJTeCW1nrrTd85+blM2vO+xiNRhpGhLHvwCG27djt9KoXFEiDkGD8/f2oXy+IPfsOsm3nHlb/tYETpxLYtmM3S5YuY/XaDahUKocnbFS0Ti2aN2XLtp2cTT7Pn3/9zeEjx/l74xa+/u4nCgqK6Nq5A2eTzzvdnN61Uwe279xDYlIyv69ex+69B9h/MJ4/Vq9j6Y/LOXHyNN26dHQYzquI/c3pyh5uh3ZtKCgo5NTpM2zZttN2g3e9oCDq1wti34F4du7Zb9sGcZv+YfG3P3L46HH8/fyY+uLTTpNWrDdcDxtyrUM5djdBK7cTipvC7dfTum2HDOzHmnVx/Lnmb06cSmDt+o1888Mv5OcXEBkRzlNPPOKwP13sZ6hoPZT1ys/YtUtHNmzayqnTZ/hj9ToOHDzMnn0HWb7iT77/6TfOp6QyZGA/h2H1yrYVZfWA0/2Y586ncibxLP/s2M2Royf49ffVthOYi9l3rN/LwP7XUC8oyO4nOda7+t7Ev096ejpffvklOp3jJYWrIfCsN6dXnhxXka3bd0FZL87V1G4l6+0MJ08lVHptpjLf/vALOp1lpt2Jkwns3X/I5cv+FocBfXsz/aVniY5qRInRaGujUqkYOngA01961u4nVKxFsya8+dqLtG3TCrPZzOGjx0k8e45uXToy+41X8ff3Uy4CZRNOZrz6PCNuuA4fH28Sk5LZu/8QKanpRDYM57lJj7s8IF+M++4aRfu2sZjNZubM+9g2q3ZA395MnfI0bdu0wmQ2s3f/IQ4fPU6Avx8jbriOuW9Nr/C66OUQHdWIqVOeJigokL37D3HiVAJeXlpG3HAd01+e7HJ/qs3PEBQYwNw3p9OrR1c8NRpOnLLsa7m5ebSObcn0l561Tf2/VPfdNYoundrb9imDoXyCQW3uO+Lf6cyZMxQpZupeDYFnr04+kUWUP21k+NBBLm+fEBU/7UYIcfls2bKF1atXw1UWeHX6iSwCTidYbqau6MksQghxJfTp04fBgwdfVYFnT0KvDkpJTefEqQTLrMMOct+UEOLqMmDAgKsy8JDQu3p9/uU3Lm9LSEvP4O25HwIwaEAfl9ejhBBCuCbX9K5S1qfXa7VaohtHWp57ePac7XFRrv76gnAk1/SEEFbWa3oSekIIIf71ZCKLEEIItyOhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEKIGhUXF8eWLVuUxVcFCT0hhBA1ZsuWLaxbt47Vq1dflcEnoSeEEKJG7Nixg9WrV9v+fzUGn4SeEEKIGtGsWTN8fX0dyq624JPQu0zGjJvE5JdeVxZftMkvvc6YcZNISExSVgkhxFWhQYMGPPjgg/j4+DiUX03BV+dCz3rwHzv+GQoLi5TVFVqzLo4x4yYxZtwk4jb/o6wWQghRA8LCwhgzZsxVG3x1LvSszGYzq/5aryyu0N8btyqLhBBCXAZhYWGMHj0aLy8vh/LVq1cTFxfnUFbb6mzo+fv7sXHzNmWxS4cOH+Xc+RS8vLTKKiGEEJdBREQEDzzwAFqt43F33bp1V7THV2dDr2l0Y3Lz8qs0VLl8pWU2Ubs2scoqIYQQl0mjRo0YPXq0U/BdyaHOOht6Hdu3BeDPvzYoqxykpKZz/MQpYlo2x2AwKKuFEEJcRo0aNeL+++/H09PTofxKBV+dDb2Yls2IbBjBufMpHD12Ullts3LVXwBcN7CfssrBwfgjTJ05m0cnPG+b8DJl6iz27DuobEpCYhJjxk1izryPMRpNfLzgK8aOf4ax458hKfmcsrmDb77/mTHjJjF+0hRy8/Id6jKzsnnnvY9s6/DwE5N5572PnNq5smnLdqZMncXY8c/YJvpMmTqLTVu2O7Q7euwkY8ZN4tXX33Eot3r19XcYM24Su/bsV1axYNG3jBk3ie0794DdZ4nb/I9t3R9+YrLl8z01hWXLVyrfQgjhhqKiorj33nvRaDQO5Vci+Ops6AEM7H8NAKvXue7tFRYWsWXbToICA+jZvYuy2iZu8z/MmfcJZ5PPExEeSueO7YiOakRKahrzPlrAlm07lYvYfPLFV2zbsRuz2YzZbMZkMimb2Kxas5416+Lw8fHm9VeeIygwwFZ38vQZXnj1DeIPH0OtUtG5YzuaRjfm2PFTTJ/1Lmaz2eG9rIxGE9PemMOCxd+Slp5B40YN6dyxHY0bNSQtPYMFi7/lfx9+Zmsf26oF/v5+JCWfc5r9WlhYZAvtvfsPOdQBHDl2ApVKRdfOHR3K8/MLeeX1tzmbfJ72bWOJjmqErriYFX/8xZdLvndoK4RwT02bNuW+++5zGXx///23Q9nlVKdDb9CAvgQFBrB3/yGnAzjAqr/WYzabGTigj7LKgUajYejgAXwy722mv/QsE8c/xPSXnmXSEw8DsGq161miWdm5HDp8lAmPjWXhx3NZ+PFcmkZHKZtBWbB+t+xXfHy8efm5iYQE17fVGY2msl6jkTtHjWT+/2YxcfxDvPTcRD6YM5PAAH+ysnMc3s/qky++4kziWZpEN2b+3FkO6//2jJepXy+IfQfi+WXFKtsyrVu1BGDXXsfenDXcNRoNR46dcKhLz8gkIzOL5k2j0WjUDnU//fo7fXp15723X3Padhs2bXX53QghxJVQp0NPo1HTv28vzGYzP/y8wqHOaDSx9u9NeHlpGTF8qEOdUp9e3bnnjludDuYd27e19YpcOXc+hbEP3E2XTu2VVQ72H4xn0dc/4OPjzTMTxhHZMMKhfsWqNeh0xXTt3IHhQwc51Hl5aZn0xCOoVM5fVXpGJjt378PLS8vLzz3lNDs1JLg+j/73fgD+jisfQujdoysABw4dsZVRtp5BgQF07tiOjMws0jMybXXW4c5uXRx7eQDNm0Zz312jHMo6tm9Ly+ZNAdh3MN6hTgjhfhISEliyZAlGo9GhfNiwYQwcONCh7HJyPpLWMcOvG4RKpeKfHbswGsuHFtfHbUanK6Z3j25OYVaRg/FH+Gn577w3/3MmTH6FRyc8T0FBobKZjb+/n8sQsHfy9Bnem78AlUrFMxPG0aJZE2UTjh0/BcDga/sqqwAICgwguH49ZbEtiHp07VzhZ4xt1YIGIcHk5uXbwrtTh3aoVCqH3pzRaCL+yHE6tGtDj66dwO79KbvtgwpCr11b17Nim0Q3BiAtPUNZJYRwI0lJSXz99dcuA69Pn8pH4mpanQ89Pz9funbugF5vYH3cZlu59WZ0Zc/JlZOnz/DkMy8zZ94n/PbHGuKPHEfr6Unb1jFOvSd7UY0ilUUO8gsKmDPvY8xmMy8884TLwKOsxwZUODRaEeuQZ6NIx56jUkR4KAB5ZRNiNBo1bVvHUFBQaHus2e69+zGbzfTu2ZWunTuiUqlsQQdw/ORpIhtGENogxFZm5SqQAVvvtKhIp6wSQriJpKQkFi9eTElJiUP5lQg8/g2hBzDq5pvALuh27dnPufMptG8bazvgV6SwsIg58z6mSKfj/24ZwcfvvcUn895i9huvMnH8QwT4+ysXsVGrK998fr6+BAZYJqusWuP6uqA95dMLqqqqy3l7e9v+bb1n0TphZUfZMGm7NrFoNGqaN43m+MnTUNbL0+sNtGvTyra8EEJcSHJyMl999dVVE3j8W0IvIjyUmJbNbbcv/LnWMpvzQtfyKLveZL2edtPwIU49u/yCAof/V4dKpWLKs09Sv14QO3fvY8Gib5VNAFCrLUOTZ5LOKqtsXM3e9PW1PNvu1OkzyioHKanpAAQGlAd4/z69ADgUb+nNHTl2gg7t2tjq27WNRa83cOjwUVv4dVPM2hRCiIqkpKSwePFip/ujBw8efMUCj39L6GF3H97ylX9y8lQCkQ0jiG3VQtnMScIZy/Be/XpByipbD+dSBAUGMPXFZ/Dx8WbT1u0sWbpM2YSYFs1AMdnE3qHDR13O3uzdoxsAO3bvdbieaS8hMYmMzCynoUk/P1+iGkVyKiGR/QfjKSgotF3LA+jcsR0A+w7Ecyj+KP7+flXankIIkZKSwsKFC9Hr9Q7lw4YNY8CAAQ5lte1fE3o9u3chsmEEh48et9ymUHYP34U0bWK5jrZn30GH4MjMyubDT790OWuyuoICA3j5uYn4+Hiz9u9NfPP9zw71QwZZAnvLtp1sVdwTWNl6RISH0qlDW/R6AzPe/p9TQGdmZTNv/gIAbho+xKEOoFPHtpjNZn769Q+n+++aRkfRICSY0wmJnEpItN3mIIQQlUlLS2PRokUuA+9K9vCsnI+kdZg16IICAxg0wPVMSKWe3boQHhZKRmYWjz/9Im/Pnc/UmbN57uUZtGjWpMJJGtUV2TCCZyaMQ6VSsWZdnEPwNY2OYvjQQZjNZj5d+DWTnp/Ge/M/t61Hq5bNK1yPJx79L5ER4ZxJPMv4SVOYOnM2783/nClTZ/Hsi6+RnZPL8KGD6NOru3JR20zMM4lnads6xmkGaOtWLTlxKgGz2ezQCxRCCFfS09P58ssv0ekcJ69dLYHHvy30Bg3oi5eXlv59ezkdwCui0aiZ8uyTtG3TCrPZzOGjx0lPz+TG6wfzzIRxyuaXpEWzJjw3abwt+L5b9qut7s5RI5nw2FgiwsPIyc1l7/5D5OUVcPftt/DU45YbvV3RaNRMf3ky/3fLCOrXCyIxKZm9+w+RlZ1Dy+ZNmf7Ss9w5aqRyMSgLW+tTYazPMrVnHeJU9gKFEMKVM2fOUFTk+DCKqynwADxKS0tLlYVCCCHExdiyZQurV1v+ss3VFHjHTyUS0zxaQk8IIUTNiouLQ6PRXDWBh4SeEEIId2INvX/VNT0hhBCiMhJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJteJSWlpYqC4UQQtSeAmMByUXJ5JfkU2gqpLS0lDDvMGICY/D08FQ2Fxfh+KlEYppHS+gJIcSVYC41syd7D/uy95FUlKSsBkDjoSE2MJY+oX2I9IlUVotqkNATQogr5FDuIVafX01eSZ6yyqUmfk24q8ldeKu9bWXGUiMaD41DO1ExCb2r1JNfZLLtuJ7FT4TSutGVG9Y4klzCAx+k0yvGi/f/G6KsFhfh3RW5LN1cyMuj6jGyu6+yWriJdSnr2Ji+0fb/EK8Q2ga1pZlfM4K9gvHX+JNtyCa1OJXDuYdpHdSa9kHtbe2TipLYlbWLWxrfYisTF1anQy9fZ2beH3nExReTXWgGQK2CxiEa7u7rx229/JSL1IrJX2WxIb6YBwf6M/76QGV1lUjoXV6/7ixixrIcZTEAgb4qmjTQcEtPX4Z39sFT7aFsckkk9MRfKX+xOX0zlA1dDgofxDWh1+DBhfe1vJI8Vp9fzaHcQ4xpPoZov2hlkyti586dNGnShNDQUGVVtWRkZHD69Gl69OihrKoR1tCrc7M3Nx8t5oY3Ulm+o4g8nZn6firq+6lQqzw4k25k0YYC5SJCONFqPGz7jvWVV2TmQKKB13/M4cY3Utl8tFi5mLjMth7Tc9+8dH7dWaSsqvP25+y3BV64dziPtXqMPqF9Lhh4xlIjG9I2MO/oPA7lHqJdULurJvC2bNnCihUrWLhwIWlpacrqKktLS+OLL75g5cqVbNmyRVldo+pU6OUVmXnxm2xM5lKe/U8QW2dG8ufLEfz5cgSbXm/IwvENiAq5cmPc79wfzPZZkRfdyxO1p0szrW3fsb62z4rks3ENaBflSW6RmUlfZv0rD75Xs282FXDsfImyuM7TmXSsTF4JQIAmgPub3U+wNljZzMmBnAPMOzKPv1P/xlRqQu2hZljDYQBkG7KVzWtVXFwcq1evBqCoqIiFCxeSkpKibHZBaWlpLFy4kKIiy+/a6tWriYuLUzarMXUq9H7bVYTOUMoNXXy5o4/zEGa7KC0fjP33DMWJ2tepiZaF40O5q69l/5rzWy55RZYhdCEu1sa0jRjMBgBui74NP43z8cteSnEKX5z8gp+SfiLfmG8r7xfaj0BPy0n1T0k/cabwjN1StUujcexg6HS6agdfSkoKCxcuRKfTOZQr37sm1anQS801AeDvXflwgBCX6ukRQXRv4YXOUMrn68oPOkJUVyml7MneA0DboLY09WuqbGJTZCrit7O/8cnxT5xuY/DX+NMvrB8AB3MOcrboLDszdzq0qU19+vRh2DBLr9NKr9ezcOFCkpOTHcpdSU5Odhl4w4YNo0+fPg5lNalOTWSxTkKIaqBh6VOhVZpooJyQ8f2WQhZtKCA9zxKgTUI1PDE8kGvblk8FtpeSY2LGshz2JhgwGEvRajzo3FTLy6PqEVFP7dD2QhMVdp3SM3dFHgnpRgzGUtvkm2f/E0SvGC9QTGTx8vTglaXZnEwtwWQGPy8PHhsW6LKXC6AzlDLzpxzi4ospLrG8f4twT169vR6tGjpOirFf154tvRj/WQZns0w0DdPw/aSwS9pu+Tozn63N58+9OttEI29PDwa09eal2+rho3X83npOOUfD+mqWPxfOR6vz+HpjIQZjKa/fVZ/rO/nY2m2IL+aDVXmcSTcClu1xRx8/HhoSUKV9Abt9qCoTdLYd1/PkF5lENdCw7JkwZbXT9wkQUU/NqF5+3NPfz2mdKto/MvPN3P5uKgXFpdzV14+nRwQBcPPbqZzPNlU4qamieuX2/H5LIYX6Urw9PXhiePn+88ceHR+syiM9z2TbV2Y/EOy0X1tV53fBfj9WqeC1H3Js+3FooJqxg/0dJpxZ27ui3F7V2c+vBmcKz/DlqS8BuKfpPcQExCibALA9czvrUtahN7veDrdF3UaHeh0AWJ+6nri0OFSoeLH9i6g9XH9ntWHLli22YU4rrVbL/fffT1RUlEO5VXJyMosWLcJgsPR+rS5n4NXJiSw3dPEhJEBFUoaRsfMzSMmxHICratKiLOauzKW+n4r+bbxpEqrhTLqRyV9l8e6KXGVz1uzXces7qWw/oadhfTX923gTFqhi+wk9/zcnjSPJVb/2MOXrbB77LJNj50ts79U4xPLzXU2YiD9r4J730ijSm+kT603jYDWF+lJm/5bLvN+d7+05mGjgplkprN6nI8DH8vlahHty7HwJoz9I5/c9rq9NGU2l3PNeGmezLNtSX+J8DlTd7Xbf++ks3WwJrv5tvOnfxhKMq/fpuO/9dGVzm8/+ymfh+gJbgNivy5Svs5n8VRbns010iNbSv403JjMsXF/AvfMqfs9L0SvGC7UKkjIsIWvP1ffZIVpLVoGZD//M49556ZSYnLelUma+mUc+zaCguJTbrykPvJrw5BeZfLupkK7NvWjV0JPiEsv+89lf+cz/M4+p32fbvlNPtQfHzpdwz3tpLodzL/Z3If6sgdEfpDvsx+l5Jt78xXICYNWlqeU7DQmwHJJiIz1t+06j4PID+sXu51fSed15AFSoaObfTFkNwN+pf/PHuT8qDLzGvo1tgQfQ3L85AGbMZOgz7FrWPlc9PoPBwOLFi0lKcr7pPikpqdYDz16d6ulRdpB44IN0W4/j2rbePPOfIKczTStrj8Xf2wMfrYoFjzVwaLv5aDHPLs7CZIYfnwkjuoFlLDkxw8idcy2zkeY/1IAuzbS2ZX7aVsibv+TSMsKTbyaWT9Ot6Ex+3u95LNlYQGig2unnHztfwrbjeu4f4A92Z7xqFUweGeRwNvz9lkJm/5aLj9aDDdMb2spLTKVcPyOFguJSXrjFcZk9pw2M/zwDH60Hf74cYet9WNe1WZgGL40Hb9/veIZ/sdsN4IkFmUy4MdDhrLvEVMq4TzM5kGjgrfuCGdSuvIfYc8o5woPUFOrNjBvq3JP97K98PlubT1QDDUueDLX1FEtMpTy9KIttx/U8PCSAh68LcFjOler09LDrTf3yXDiR9S2f37o+rr5PnaGURz/J4Mi5Eoa092HWvfVtdcr9o8RUyl3/Sycpw8iIbr68+n/1bG2ppCd3ofqeU86hVkFksOOIiPWz+2g9MBhLmXJr+X5qvy7KbXkxvwuV7ceL/i7gwz/zqOenYvXLEbZy++WUv0Nc5H5+NViXuo6NaRsJ8gziqdZPKasxlZp469BblJS6PnEAeKTlIzT0Kf+dzzfm8+7hdwG4s8mdtA5sbdf6ynDV4/P09OTee++laVPLkG5CQgJff/01JSWOn7U2Aq9O9vQAQgJU/PJcGGMG+aPVeLAhvpiRb6Uy+assdIaK87uguJQ5LoZu+sZ6859ull+uJXHltzt89Gc+JjM8MTzQ4Zcc4LZefjQL03AipYRz2ZX3NvOKzHy7uQC1ChY/Eer081s19LQFnr1+rb2d7je8o48f9fxU6AylDmfWX64voKC4lBHdfJ2W6dJMS7/W3hQUl7LpiPNZZHqeiQXjHQ/c9qq73QA+GBviNMzkqfZgcHtL0O057bweqbkm7u7r7xR4AEs2Wrbfp480cBga9VR7MHmkpWe0/pBzb7km2fd+lmy0fN6PHg5x2i4+Wg8+GBuCWgV/x+tc9pooO4A//nkmSRlGhrT3cQq8S2Uyw0u31XM4+I/s7kvD+mp0hlK6t/ByCBVPtQf39rNs+3hFr+1Sfhdu6OK8T44e6E89PxU5hWZOpFR8oFe6lP38StKbLOtj/zQVe9mG7EoDr3P9zg6BB+CrLv/urO9/pbnq8ZWUlLBkyRISEhJISEhgyZIlVyTw7NW50KPsF/SxYYGseSWCu/r6OYRfZr7rg0xUA43Ls2XKDgYAJ1PLh7F2nbacpbo6CFM2UxRg58nKd7i/44sxmS0hZh26qYobuzpfEwRoGWH5DEa7obN/yq6F3HGN63Xt3NSyrq7CZmC7ym/Cru52s8rXmfnxn0JeXprNffPSuX5GCu+5GJa1d6eLbb3tuN52kHa1/aIbaKjnp6rWwbM6zGW7U4sIS0/Wuj4dorUOvVt7gb4qurfwwmSGTS6GrgGeXpTF3gQDfVt7O/QGa0o9PxVdFQFF2fYCHHraVtYTFft9i0v8XbAObStZ9+OkTOegrMil7OdXkjXsioyuh16DtcEV3qvn6eHJ0IZDlcUUmcrfy0dTft37SuvTpw+DBw92KDMajSxZsoQlS5ZgNDoeKwYPHlyrgUddDT0rH60HT48IYs0rEXRuqiW3yHJ9xNW1FOvQlCuasoN+Rn75L2BOoRmTGfq+fJ6eU845vVbscr0DK1kPxtZfyKpqWEHPS132jZ1KK995rOv9wAfpTuvZc8q5SsOmfZTrQLOq7nYDeHlpNkNeS+Ht5bms3qcjPc9E4xANsZEV/6zwIDWBvs67o3XG7rbjeqfPZX3llE2WqWl5RWZSc03U81PZTgys69Mk1HXgWTULs9RnFziv2ydr8tl2XE/3Fl7MHX3he7UuhnKykJL1u7tQGZf4u3Ch/Thf57x9KnIp+/mVFKCxDBUXGgsxlTqHvMpDRZ9Q1wf+oQ2HOvTqrHIM5U8Vsr7/1WLAgAFOPT6j0egUeMOGDWPAgAEOZbXB+ShTB/loPfj00Qa0jPAkKcPIH3scp8BWlfKX3kfrYbuYXtHL/iJ7ZS50EKoJynVTvlq7CB3lZ74Y9u8x7/c8Vu/T0TrSk4XjG7B9luUBAgsea8DtFZyhA6gusCdGhWicPo/yVdN+L9uPujWzzKy1V9Xv01W75uGWQDySbOBgouPF/KtVTf4uXCrlz1W+XO3nV1JDX8vQpBkzpwpOKasBuC7iOoZHDsdHbem1eXp40j+0Pz1CXD+S63jecSh7lFmYt/PM4ivN1VCnvdoe0rR3gUNN3dK9haU35Wqoq0jv3Puzsj4Bwn64ynqxf84DwZW+ujV3PiDaC/C2bOKDSc7rVFP8vCw/47FhAU7rZ/+qaMi0MtXdbhsOW4bz3rwv2DbsZZVazdm2AAE+ls8WHapx+jzKV00qMZWyaIPl/rzb7Yb1rOtT0WxFq9NlPfH6/s5BMLSjDw8PCaCguJQJCzNtba9WNfW7cKku535+OTXyaYS/xnLdfnfWbmW1Ta+QXkxuO5lxMeN4of0LDI5wHCa0MpWa2JezD4BWga2u6O0Klako+K5k4PFvC72CYssBOjzIeSeIP2uo8Hrf8h2W4ZleLct/aWMjPTGZLVO1L0X/sh7I2gM6l8OuNcE6RHmp6+pKdbebdXq/q2FR6zWZ6ujWTItaBbtP6S/b9lMqMZUydn4GmflmhrT3cbg21q+1Fz5aDw4kGkh0cSsDZcOi+88Y8NF60K+16yB4+LoA7urrR0FxKWM/Snd5+02jYMvJhKvHciVmGDnvYuLI5VBTvwuX6nLu55db5/qdATiSd4SEwgRltY0HHoR7h6Oq5NAclxZn+5NE1ve9WimD70oHHnUt9Ob/mceivwtcXgfYEF/MH3uKUKuwzSq0ZzLDpC8znWZ4vvNrLgcSDYQEqBjVu3y5u/tZzsxm/Zzj8qCzIb6YaT+4flq/vdaNPOnb2hudwXIgVf78Y+dLWLj+0h6Sfd8Af8vs0A0FbIh3njhx7HwJTyzIVBZXSXW3W1RZr++nbeX3YFHWPv5s9YfyAn1VDGzrg85gme2oXI8SUynvrsitkfuzdIZSfttVxI1vpHLkXAmtIz157S7HWZWeag9Glc0cfOyzTKew0hlKeWKBZT1H9XK+Qd3e0yOCGNHNl4Jiy72SypOLLmXXgResy3f43DpDKZMWZdm1vLxq6nehKqzXQl0N+17O/fxy6xfWDy+V5QTol6RfKDE7b8eqyNBnsCltE5Tdu1fRje5Xkz59+jBw4EAGDhx4xQOPunafnvU+J8qe8GG9XqIzlNqezGB/7xF295t1b+FFaq6J1BwTsZGe1PNTsfuUnkK95ckSHz8cQvtox+E4+58XGqimdSNPdIZSDp81UKgvpW9rb4eJCMr7sKxKTKXcOy+dhDQj6rKnsEQ30HA6tYSzWSaHp3Bc6E8LVXQfk/2fzPHz8qBr2VDTvjMG8orMTk8VqWhdrS52u9mvR5NQy+fcfUpPcUkpt/Xy44ethQ6fF8UTRFyxv4dMXfb0jfB6alJzTLanoUy7ox43dnH+HErW9dNqPPDzKg8kU6njbQm39PBl8s1BFYbWpEVZbD5iOfBaP2dqjsn21BHlvkEl29z6nfp7e/DD0+G2War296VpNR50bGLZzvvPGGjTyJO0PFOF9+lVtD0r2n9w8fQie9X9XbjY/Xj3aQPjPrXcbN2qoSdenh6M6u1r+26ru59fTQ7mHmRZ4jIAeoT04MbIG5VNLuizE59xTncOTw9PHol5hAZeDZRNRAXq5H16wzr50CFaS30/FcUlpWQXmskuNOOj9WBYJx9+nhzu9ItspVbBkidDuaaVF0fPlbDxsOVWgp4tvfjxmTCnwKPsTPyd+4NpEqohq8DExsPF7DmtJ8BHxePXB/L2fVWbau6p9uDrCaE8fn0goYFqzqQb2XjY8rcAh3Xy4Z6yM+lLMbK7L0smhNKqoSclJth4uJiNh4tRe8Bdff1Y8uTF/a2r6m63kd19eeGWINvn3HK0mEbBGr6ZGFbp7M3KeKo9WPpUKGMG+ePnreLYect6JGYYaRqq4aOHQ6oUePYMxvL9J7vQTLGhlIh6au7q68faVyN4UXGPm9Lc0cG88n/1aBKq4Wym5ftMSDfSItyTd+4Pdgq8yrw7OpheMV6Wx5D9r7zH56m2hGDPsuHjnSf1HEw0cEMXH+Y/fOEb62tSTf0uXEjXZlpeuCUIb0/LE2KOny+xXRfnMu7ntaF9UHsGhFlmK57IP6GsvqBCY6Ht6S7/1+T/JPAuUp3q6V2Mys5ehRCitsXnxtPYt7HtryVUx3ndeUpKS4j2vTr+nl5dUid7ekIIUde1DWp7UYEH0NCnoQTeJZLQE0II4TYk9IQQQrgNCT0hhBBu418/kUUIIYSQiSxCCCHcjoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIIt1En/7SQwWDAaDRiMpmUVUIIIQRqtRqNRoNWq4W6+qeFzGYzRUVF6PV6CTwhhBAVMplM6PV6ioqKMJvNtvI6FXrFxcUSdkIIIarMZDJRXFxs+3+dCT2DwSCBJ4QQotpMJhMlJSVQl0LPaDQqi4QQQogqsWZInQk96eUJIYS4WNbrenUm9IQQQohLJaEnhBDCbUjoCSGEcBsSekIIIdyGhJ4QQgi3IaEnhBDCbUjoCSGEcBt15oHT+fn5yiIhhPhXKDQVkqJPocBYQJG5CIAQzxCa+zVHg0bZXFyEkwln6dyhjYSeEEJcCeZSMwcLDhJfEM85/TllNQAaDw0tfFvQPag74dpwZbWoBmvoyfCmEELUsqOFR1mQvIC/Mv+qMPAAjKVGjhYeZUPWBvRmvVOdqD7p6QkhRC3anL2ZbbnbbP+v71mfVn6tiPKKor62Pr4qX3KNuaQb0jlRdIKWfi2J9Y21tT+nP8f+/P0MbzDcViYuTIY3Fb7YoOfrzQZ8tB78PMkPT7WHsokQQlySjdkb2ZG7A8qGLvvU60O3oG54cOHjTb4xn7jsOI4WHuXOiDtp5N1I2eSK2LNnD1FRUTRo0EBZVS2ZmZmcOXOGrl27KqtqhAxvKvyxz/JnJ3SGUv46eHmGDQ6fM/Hctzo+Wes4TFFX1PX1F+JKOlx42BZ4odpQHmj0AN2Dul8w8IylRv7J/Ycvkr/gaOFRYv1ir5rA27ZtG6tWrWLJkiWkp6crq6ssPT2dr776ij///JNt28p7wZeDhB6wL9FEVkEprRpaNsef+y0BWNPWHSph12kjRnOd6Fw7qevrL8SVUmwu5q+MvwDwV/szKnwU9TT1lM2cHCk8whdnv2BL9hZMpSbUHmoG1B8AQK4xV9m8Vm3evJl169YBoNPpWLJkCampqcpmF5Sens6SJUvQ6XQArFu3js2bNyub1RgJPWDZdgMAd/TSEuTrwYEkE2ezyv+8vBBCXIptOdsoKbWcTN8QegO+al9lEwdphjSWnl/K7+m/U2AqsJX3DOpJgCYAgN/Tf+ds8Vm7pWqXRuN4K0VxcXG1gy81NZUlS5Y4/GVzXLx3TXL70CsxlfLPCSM+Wg8GtfWkXyvLxl594PL09oQQ7qWUUg4WHASwTFjxjlI2sdGZdazJWMOSc0ucZnX6qf3oEdQDymZ/ntefZ3/+foc2talXr14MHjzYocxgMLBkyRLOnat4RqrVuXPnXAbe4MGD6dWrl0NZTXL7iSw/7SjhwzXFXN/Rk+dGeHM8xcy4LwoJ9vfghwn+yuYAfLimmJ92lPDsTd50a6Zh9spiDiSZMBhL8dXCrT20/PdaL6f2rtzWw5N+sZ48vaSI5mFqPnvI+Qzw4c+LOJVmYtooH/rHOp4Bvb2imD/3l/DyLd4MautpK997xshHfxlIzDRjMFq+4rBAD0Z21fJ/vTydJuooP9MzSwo5l1NKdAMV3ZupK13/x4d62/5fXAKzV+rYetxEcUkpahU0C1UzeYQXLcPVDstat3X35hpm3O7NV5sM/LzDQJEBtBoPOkSpeeE/3gT7V37NQ4ir2dnis3yf8j0At4bfSjOfZsomAOzN38umrE0YSi0jT0o3ht5Ia7/WAGzJ2cI/Of+gQsWTTZ5E7eH4u1Wbtm3bZhvmtPL09OSuu+6icePGDuVW586d45tvvqGkxPG4cjkDTyaylLFOYLm+oyUwYiJUNGmgIquglF2nK/9r7TmFpTz0WQGn0kx0a6amZbiaIgN8vdnAu7+Xn720ilBzTYyGRvUtm7tRfRXXxGi4JkZDqwg1naLVBPl6cCrNRL7O8RwkX1fKqTTLemw97jzBZu8ZI2oV9LMLw9d+KuaZr3WcSDURHuTBNTEa2jZSk1MEn/+t55EFRZSYXJ/rGE2Wz3Qux1KvLym94PpbHU42cce8fNbHG/H3tvzcZqFqTqSaGL+wiDUHXQcnwMs/FPPDthJiIzV0aWr5LLtOGxn/ZcXrKkRdkGZIA0CFqsJe3tacrazLXFdh4DX0amgLPIBo72gAzJjJKsmya1n7XPX4SkpK+Pbbbzl71nn49ezZs7UeePbcOvTOZpk5lWYi2N+DTtHlB++BbSwBuHyX6x3QamGcnqEdtPw40Z8Zt/vwyVhf3rjTB4CVe0tsATa0gyczbvehV0vLz+jVUs2M232YcbsPQztYflbnaMuBftMxx2BbUzaTVKvxYO8Zx7qU3FJSc0uJbai29dwWbzSw4UgJDQJUfPuEP18+6seM2314f7QvP0/yp1WEmsQMM7OWu56B+fPOEhrVV/PtE/6sfTGAbx73r9L6l5hKeX5pEYV6eGq4F989afm5n4z1Ze59lt7r+38WuwywPQlGzueY+XmSP7Pv8WH2PT78PMmfYH8P0vPM/LKz4rAU4mqnM1smaPip/dB4OF+rMpWa2Jm7U1nsYEjIEIf/1/MsnwRzpSe0UEHwGY1Gvv32WxITE21liYmJfPvtt1cs8HD30Pv+H0uoDWzjuCPe2t0TtQr+OWF06nnZi22o5slh5cOYAL1aWHpVAP+cdO6ZVWRQO8s67Djp2LvcdtJIsL8H17TUkJpbSkpu+fpsPGLZcQa0Ll//77dZPtOce30IC3QcFvT2hLfv9kGtgk3HykPZXka+mXmjnZe9kG+3lFCot/SY/9NV61DXMVpN75YaCvXwzwnXvef/3eeLd/noLN6elolFAHvOuF5GiLrAYLb8Tnqryy8D2Ms15tomubjSzr8dYdowhzIfleXkGrv3v9IqCr6lS5eSmJhIYmIiS5cuxWh0PC7WZuDh7qG39YRl49/czfEgHeDjQdtGakzm8p6WKz2aO5+1AbRqaAm989nOoVKR3i3VqFWwN7H855WYStmTYKRHcw39W1ve0xp0ADvLhl/7t7akxa7TJnSGUto2UtM42PVXG+DjQZemGkxm16HcL9b5el9V7Dhlea9buztuS6sOUZb132/3+ayaNFC7vG7XvrFlmfS8qm9HIa42XirLibHOZOnxKdXT1KvwXj1PD08GBFtuUbBn7T1SSZheCb169WLAAMf1NZlMLF26lKVLl2IyOZ7ADhgwoFYDD3cOvfXxJWQVWA6moz8uZMgb+Q6vA0mWL2fFnorPokIr6A2pPCzvm19c9dsePNWWMMotKuV4imW5TUeNmMwwpJ0n/WI1qFXlQQdw6KyJJg1URARZ1iMtz7JcVEjlX2t0iKV9TqFzmLSJrHzZimQWWH72uC+ct+WQN/L5uJIb2l0FHoCmLHwL9VXfjkJcbfxUfgAUmYowlTqPWqg8VHQP6q4sBqB//f4OvTqrPGOe7d/+atcT7q6Uvn37OvX4TCaTU+ANHjyYvn37OpTVhos7wv0LrI+39DgCfDyo5+v6pVbBmQxzrd2z172ZpWdjnbCy8YgJH60H3ZpZrtnFNlRz6Kxlx7H26rqVLWPPR+s6RJTshxOtrEFzsawTXCp62U98EcIdhHtb/jqCGTOJxeXXt+z1r9+fQSGD8FZZem2eHp70CupF58DOyqYAnC46DWWPMgvxDFFWX3Guhjrt1faQpj23DL18neXePLUKvhrnx7Kn/F2+ere0DF9ar/1dbsPLZpBahwr3JhrpaTeE2qO5Bp3BMqvUGn79YsuTy9/bEljHzjufTdpLzLT08Or51dzX7+dlea//Xqu1TXJx9bJOfBHCXURoI/BTW3p7B/IPKKttugR04bHox7g/8n4eb/I4feu77gWZSk3EF8YD0Ny3+RW9XaEyFQXflQw83DX0ft5ZgskMbRupCfCpuGdjvdannFF5uQT4eNA8TM3R8ya2nTSSW1Rqu5ZHWS8K4J8TJew4ZSTI13HWae+Wany0HsQnV/xEmXxdKYfOWnqQvctmY9YE67Do34drZ1sJUZe0828HwImiEyQVJymrbTzwIFQbiqqSQ/O23G3kGy33LVvf92qlDL4rHXi4a+j9fdjx3ryKdGtmmWCRW1TK+viKZ1dVVfMwS8hYr9m5ck2MZQLNlxsMTvffxUSoCA/y4Mg5M0fPm2y3OVh5qj34TxfLZ3rmax1pigkgxSXw3Lc6dIZS/tOl+hNWKlv/O3prUatg6VYDm12cJJxItTysWgh31LNeT7QelpPoVemrLvpv4WWVZLE9ZzuU3btX0Y3uV5NevXrRr18/+vXrd8UDD3cMvX2JJs5kmPHRenBde9ezL+1Zb2dYvuvSQ69fK8tklANJJu6fX8Cz3+hY8LfjBI/+ZcOVx1JMdGmqcQqmzk00xCebMJlx6AVaPTrEi14tNWTkm7n7gwIe/KSQl3/Q8eiCIkbOyedYioleLTU8OsTxVouqqGz9GwermHSDNyYzvPqjjv/MzuflH3S8/IOOW+YW8OiCIlJyncNSCHeg9dAyNHQoAPkmy58Iuhh/pP+BGTOeHp5c3+B6ZfVVq3///vTv319ZfEW4XeitLXsqSNem5Td0V8Y6xBmf7Py0lOoK8PHg9dt9qO/nwbkcyzCj9TqcVUyEyjabsVcL51C2DnEqe4H23rjDh8kjvIkKUXEu28zW40YSM800C1Xz2v/58MYdzrPBquJC639DJ08+GetLy3A1RrMHW48b2XrciNrD8riyT8darmsI4Y5ifWPpXa832E1EqY4iU5Ht6S43hd1EsGewsomoArd/9qYQQtSmY4XHaOjV0PbXEqojzZBGSWkJjbyujr+nV5fIszeFEOIKaOXX6qICDyBMGyaBd4kk9IQQQrgNCT0hhBBuQ0JPCCGE25DQE0II4TYk9IQQQrgNCT0hhBBuQ0JPCCGE26gzoadWOz9ySwghhKgKlcoSd3Um9DQa14/cEkIIIS7EmiF1JvS0Wq309oQQQlSbWq3G09PyMP86E3oA3t7eEnxCCCGqTK1W4+1t+Yv01LXQU6lU+Pr64uXlJeEnhBCiQmq1Gi8vL3x9fW3X86hLf2VBCCGEuFjHTyUS0zy6bvX0hBBCiEshoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchfzldCCFErTqvO8+OzB0kFyWTbcgm3CecKN8o+ob2xU/jp2xeI6x/OV1CTwghxGVnLDXy5ckvWXRqEZvTN1OKc/R4qby4IfIGxrYcy4hGI5TVl0RCTwghRK34MfFHntr5FMm6ZFuZ2kNNtG804T7hJBYmck53zmGZbsHdWHjNQjrU6+BQfrEk9IQQQlx2L+97mZkHZ9r+/0jLR7i9ye0MCBuAVqW1leeX5LPq/Co+PvYx61LXAeCj9uHHAT9yY+SNtnYXS0JPCCHEZWUfeK0DW7O4z2J6hPRQNnOy+NRiJuycQG5JLipUrB6ymiERQ5TNqkVCr4ZMful1MjKzlMX4+fnSp1d3Rt18E15e5Wcz4vJJS89g6Q/LOXbyFIWFRQBoNBoiG4Yz6uYb6di+rXIRIcRl8t2Z77hr010A3NfsPhb0XuDQs7uQlOIUhq0dxoGcAwRoAth30z6a+TdTNqsya+jJLQs1xM/Pl4AAfwIC/PHz86WwsIg16+KY9MJUcvPylc1FDVu1Zj1Tps5iz/6D6PUG23dhNptJTEpmzbo4h/YHDh1h6szZxG3+x6H8YhUWFvHN9z/zyutvK6uEcDt5JXk8tv0xAHo36M0Xvb+oVuABRHhHsGLgCoI8g8g35vPkjieVTS6KhF4NeXbiOOa98zrz3nmdD+bM5IN3ZxLTsjk6XTFz3vtY2VzUoITEJL5b9iteXlomPDaWzz54x/ZdLJg/h8cfeZCgwECHZVav/ZvEpPKL6pcqPTOTNeviKC7WK6uEcDuvHXiNbEM2Xiovvun7DZ4qT2WTSj2+43G+OPkF0X7RzO02F4CV51YSl+Z48noxJPQuEz9fX557ajz+/n4kJZ8jKdlxZpKoOWvXbwJg5I3D6NKpvbKa7l078dCD9yiLhRCXganUxJcnvwTgydgnqz0k+eSOJ5l/bD4P/fMQK5NX8mCLB2kT2AaAhScXKptXm4TeZaTRqGnRrAkApxMSldWihuTk5gLg6+ujrBJC1LLN6ZvJNGQCcGvUrcrqSo3fPp4Pjn0AQJf6XegX1g8PPBjZeCQAK5JXuLy/rzpkIsslsk5kmfri0zSNjlJWs2TpMtb+vYkx99/JgL69Afjm+59Zsy6OMfffSbs2sbw9dz5p6RlERoQzc9oLtmUzs7L54ecV7D8Qj664GAAfb286dmjL7beOICS4vq2tvcysbL74aiknTiZgMBjQaDR0aNeaR/97Py+/9pbL9R0zbhINQoJ5Z+YrLFu+klVr/sZoNPLo2Pvp3aOrrd1f6zeyctVaW9DUCwripuFDuG5Qf1sbK73ewMIl3zmsv5+fLyNvHMawIddWu11FrNuzfdtYnpkwTlntYM68jzkYf1RZDODwHRUWFbF8xZ/8s2M3+fkFAGi1Wrp0as+Y++60TU5KSExi+hvvOryPlXV72qvO9hOiLnrvyHs8tespfNQ+FN5ViAceyiYuTdo1if8d+R8Anet35u+hfxPkGQTA6vOruX7d9QAcH3mclgEtHZatCpnIUkvOJJ4FcBlQJpOZV15/m7T0DAAMJSW2uu079/DcyzPYtmM3AJ07tqNzx3YAbNuxmxdefYOTp8/Y2ludPH2G516eQfzhY6hVKjp3bEfT6Ma2iRtms1m5iINfVqxixR9/YTQaATAYDAAYjSamvTGHr7/7iSKdjjaxMbSJjaGgsJCvv/uJeR8tcHif3Lx8Jr0wlW07dhMQ4E/nju2IjmqEXm/gwKHD1W5XmZuGX4dKpeJg/FH+9+Fn6PWWdXalVcvmdO7YjqDAAACaRDWybduw0Aa2dtNmzmHNujiMJUanbT915mxbOz9fXzp3bEdsqxYAeHlpbe3bt21ta1fd7SdEXZVWnAZlE1EuJvA61OvA2uvW2gIPcAi50wWnbf++GNLTu0SV9fROnj7DjLf+R1BgAP97+zVbubVnEtkwAk9PDU+O+69DKKakpvPS9DcBeGj03VzTq7utDmDZ8pWs+OMvfHy8mffODDQaNZQdWCdMfhmdrpg7R41k+NBBtmX0egNTZ84mNS0dwGl9x4ybRHD9euiKi7lt5I1OPY8PP/2Snbv30b5tLBPHP2z7mfbv+8SjY+jWpSMACxZ9y6at27lh2GDuuO0/tvcxGk3EHzlqu32gqu0u5OTpM8yZ9zE6XTEqlYr+fXpx9+23VHi7iLXHZ9+7s/fOex9x520jiY5qZCszGk289e4HnDiV4PBZsevxuerdcRHbT4i66skdT/LBsQ/oVK8Te2/aC0CJuYTRW0YzIHwA42IcR2Om7J3Cm4csx7v2Qe3ZMGwDwdpghzZ6sx7vb70BWNxnMfc3u9+hviqkp3cZFRYVsXLVWt6cYxmbvu1m108TyM7J4eXnnnLqBS5bvhKz2cyN1w92CjyAUTffZJsZuj5us618xao16HTFdO3cwSHwKOuBTHn2SVSqir/yrOwchg251inw0jMy2bl7H0GBAQ4HbMre97aRNwDwT1mvFLvrbNZrmlYajdohyKra7kJaNGvC3Den06tsKHbDpq2MnzSFb77/GaPRpGx+QZMnPuYQeJStkzWUjh4/6VBXmYvZfkLUVfW1luNZht4yggXw0r6X+PbMtzy2/TFbjw7gxb0v2gKvTWAb1g1d5xR4AFn68nuhXdVXR8VHQFEt0994lzHjJjFm3CSeePolfvxlBWazmTtHjXTZkwDo1rmjwwHQ6sixEwAMv84xuOz1u8byVINDh8uvTx07fgqAwdf2tZXZCwoMILh+PWWxg6GDBiiL2LVnPwA9u3dxub7t2sQCkHAmyVbWonlTAL7+7idOVTKJp6rtqsLLS8u4sfczb/brtlmca9bFMXXGOxcVfIVFRazbsJmPP1/M1JmzmTD5Fb5b9quy2QVdzPYToq5q6NMQgNTiVPRmyy08r3Z4lZ4hPaFsKPPNQ28ydf9UZh2aBWVPa9kwbAOhXqF271QuoTDB9u9I30iHuuqS0Ksh9jenR0c1YujgAcyb/bpTj8tec0XvxqqgoBB/fz/8/HyVVTbWXoj1ySOU9SgAp2HWqgquX8/lz8zKzoGyALEGu/3riWdeUi7CiOFDaR3bkuycXF5/cy4Tn3uVlavWOoVPVdtVh5+vLxMeG8vbM14mPCyUcympvDf/M2WzSn284CueePolvvr2R7bt3EN2Ti7hoQ1oouj9VcXFbD8h6qpuId2g7K8qrD63GgB/jT+rh6ymYz3LSMmUvVN47YDlkk9L/5asH7q+wsAD+O3sb1D2LM52QZbr6xdLQq+G2N+cPv2lZ7nnjlvx83UOEHtqdcWbX+tZtZs5PV20cxVcVVHZ0CeKSR+uXvYTNzQaNc9PepzpLz1L2zatKCgo5MdfVjBh8ssOE3Cq2u5ihATXZ8arz+Pj483B+KMkJFatJ/Xdsl/ZtmM3TaIb88oLk1j48VzmvfM6Lz03kcED+ymbV1l1tp8QdVXPkJ409Lb09haeKr+vLsgziL+u+4vWgeX7eUv/lsQNiyPCO8JWpqQ36/nq9FcA3NTopmo/2UWp8qOcuCK8vLRkZec49OKUrE8TsQ84tdoydFZZWFxo9qYr1vvf2rRuxcTxD1X4Gn3v7cpFiY5qxOSJjzF/7iz6XdPT8oSaec5PqKlqu+qyv1eyqk9g2bPvIACPP/IgzZtGO9RZe23VcSnbT4i6aHSL0QD8nPQz61IsfzEBINQrlPVD19PMrxnN/Jqxfuh623BoRWYcmMHZIsss+P+2+K+yutok9K5C1ms8q/5ar6yy2bHLMiuqR9dOtrKoxpax7o2bt9nK7B06fPSiDtptWsUAsP9g1W4hcMXLS8vY0XdbZojqiivsdVW1XXVYHw2mnDBUEesM19AGIcoqDlVwj19lamL7CVGXvNDuBUK0lt+f+7fcb7uNgbJbGdYPXc+GYRto7NvYbiln61LW2f5Kw6DwQdwQaZn0dSkk9K5C/7lxKCqVit//XMfWbTuV1SxbvpKD8UcJDwulZ/cutvKbhlv+9MbGLduclsvMyubDT7+84BCmK7GtWhDVKJJz51NYsOhbp+tter2BeR8tcAio9XFbnO6XMxpNGEpKUKlUhIZYfiGq2q4yn3/5DZu2bHd6H4CVq9Zy4lQCQYEBtpMJgIYR4QCcOu08eSY8zHJtYX3cFofyJUuXVTjZxnod1VUP/WK2nxB1WZBnEPN7zgfgnO4cN62/iSxD+QzMJn5NiPKtfO7Bjswd/N/G/6OUUnzVvnzc89JHfpD79C5dZffpVcT+iSwVzeyM2/wPi77+AbPZjI+3N7GtWqDXGzh5+gwGgwF/Pz9mTH3edpO11XfLfmXVGksPsV5QEE2bNCYlNZ2U1DQ6dWhL8rkUl+tr/0QWV3Lz8pky9Q10umI0Gg1Noxvj7+9HSmo6aekZmM1mXntlMlGNLL3NyS+9TlZ2DmGhDYgID6WgoJCExLMYjUaGDh7APXdYHk9U1XaVsX/Kio+3NxpPDQA6XTFGoxGNRsMLzzzhcFvE0WMnefNdyy0l0VGN0Hp6MujavvTp1Z24zf+w8KvvAIgIDyMiPJSjx06iNxgYNKAPa//e5HLd3pj9PsdPnEKr1dK2teXG85cmT4SL2H5C/BvY34MXExDD/J7zuS7iOmUzBwazgc9OfMYzu55Bb9bjgQerBq9iWMNhyqbVYr1PTz1t2rRpykpRdWvWxVGk0zGw/zXUCyp/gkBlDhw6wqnTZ+jSqT1Nol1375tEN6ZLx/akZWSQmZVtC6t6QYEMGdiPieMfxtfHcrOmvfZtY2kS1ZgzSclkZGaRkpqORqNh1C03cc8dt1a4vstX/Imvr0+Fj/3y9vLiukEDSM/MIiMjk7T0DFJS0zGZTMS0bMYTj44hunH5zEaz2cz5lFQys7I5n5JGXn4BkQ3DGX3vHQ4/o6rtKqPRaEhLz8BoMlGk02EwGDAajfj6+nBtv948O2Gc01Blg5BgggIDOXz0BFnZORQUFtGnV3ciwsNoEt2YoMBAziRatmFaeiYNI8KY/NRjmMxm9u4/RItmTejQzvIQXKuO7dty4tRp0jMySUlNJzQ0hH7XWKZpV3f7CfFvcF3EdRhLjWxM20iWIYuvTn/Fr2d/xVPlSZugNmhUlhNUynqE78S/w31b7uOHxB8wlZrwUfvw87U/18iwZlZ2LiH1g6Sn526sPVPpVQghasu3Cd/y9K6nSSlOUVZVqFtwN7645gvbbQ6XSp7I4oYKC4vIyMzCy0srgSeEqDV3N72bxFsT+bDHh/Ru4PqSDoC3ypvbom7jj0F/sPOGnTUWePakp+dGrM/srMpfIxBCiMslqSiJXZm7OK87T7Yhm3CfcKJ9o+kb1hdf9cXdZ3wh1p6ehN6/zOtvzuXRsfc7/MUAymZ0frnke8xmMy8//5TTsy6FEOLfTELvX2rMuElQdtN6TItm6PUGEs4k2f5OnfKvLwghhDuQ0BNCCOE2ZCKLEEIItyOhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoSeEEIItyGhJ4QQwm1I6AkhhHAbEnpCCCHchoTev9A33//MmHGTiNv8j0P5nHkfM2bcJBISkxzKhRDCXXiUlpaWKgvFxTmVkMiK39dw7OQpCguLANBoNDQICeam64fQr09P5SKXZMu2nSxY9C0RYaHMnPaCrfyb739mzbo4xtx/JwP69raVz5n3MQfjjzL1xadpGh1lK3dl5tvvceJUAjePuJ5bRgxXVjt5Y/b7HD9xijtHjWT40EEAGI0mlq9cxfq4Lbbt4efny6ABfbj5puFoNGrFu1RNQmIS0994V1lcIeV2uJqMGTdJWQSAVqsluH49OrRrzc0jrsfP11fZRAhRDcdPJRLTPFp6ejXBaDTx1twPef3NuezZfxCdrpiAAH8CAvxRqVSkpKaxYPG3PP3CNDKzspWLX5V6du8CwI5d+5RVTgoLizh+4hQqlYr+fXrZyp57+XVW/PEXJSVG2sTG0LJ5U/R6Ayv++IupM97BaDQp36pK1Gq1bftaXz7e3lAWFso6rVarfIsaVVhYxDff/8wrr7+trKoy5TqbzWZSUtNYsy6OCc++wjff/6xcRFxGNfGdiquT9PQukdFo4uXX3iI1LR0fH2/uuf1Wevfs5tCLOZWQyOJvfuBM4ll8fLyZNf1FggIDHN6nJtVET6+wsIgJk1/BbDYza/qLRISHKpvY/LJiFctX/En7trE8M2EclPXGXn/zf9w28kZuGj7E1jY3L59Zs98nNS29yr3Iqojb/A8Lv/qOoYMHcM8dtyqrLytrz7NBSDDvzHxFWV0pa09v4cdzlVXk5eXz069/sHHLNsxms8P2FZfXpXyn4uokPb0asujr722BN2v6i/Tr09Np2K5502imvfgM7dvGotMVM+e9jx3qr0Z+fr60bR0DwOZ/tiurHVh7g9ZeHmW9secmjXcIPICgwABuG3kDAIfijzrUCUeBgQE8eN8dvDh5AiqVioPxR52u0wohqkdC7xKkZ2SyZdtOAB5/5MEL9t4mjn8YHx9vkpLPsX3nHmX1VccaYv9s362ssklJTefc+RS8vLS2IVGAqEaRxMa0cGhrFRbWAICc3DxllXChRbMm3HfXKAB++32NsloIUQ3qadOmTVMWiqpZsy6OI0dPENOyOaNuvlFZ7USlUpGbl8+p02coKSmhd89uUDY0N+2NOZw8lUCfXt2Vi1VYn5CYxKTnpzmVHzh0hFOnz9ClU3uaRDe2lW/dtpO09EwG9r+GekFBtvKKhIeFsXrt3+TnF9C5YzuXy/y59m+OnTjFNT270bVzB2W1Szm5eWzYuJWQ4PoMurYvlA0Tv/La2yz9cTk9u3XB399PuVilziSdZe/+Q7Ro1oQO7dooqwHYs+8g8z5awNff/cTyFX+y+q8NFOv1tGrZApXKcv5nNJp4/pWZfPvDLwTXr+ew/QBWrVnPzHfmcez4KRo1imDS89PYsHErAEU6HctX/MnyFX+yeesOhg251mFZV5av+BPggsO8zZpEsfbvTeTk5tGtS0enE6zMrGwWf/MjXyxeyo+/rLR9vqTk8zRrGo2vj49Deyu93sD3P/3KJ18s4YefVzgs171rJygbLn/3/U8pKtK53LYV1VvLg+vXw9NTw+x5H7Nk6TJ++W0Vhw4fpV2bWHx9fNDrDcz98FO+XPI9P//6B6v/2gBAq5bN7X5KOb3ewOeLvuGzL7/hp+W/89vva9i99wAtmjUhKCjQoa3970jPbl34+bc/+ODjhfz4y0pWrlrL0eMnad+2Nd5eXg7tq/Kd/rV+I/M/W8S3P/zC8hV/8sfq9Rw5doK+vXvY2oirR1Z2LiH1g6SndymOHT8FQNdO7ZVVFerUoS0ASWfPKauuOhqN2nYQ+zvOchBQsvYC+11T9Zmpu/bsB6B5sya2srPnznEuJRWj0cimrZUPp16MDz/9knkfLSAjM4uWzZvSuWM7TGazbVKNlUaj5sH77gDgp+W/O0y2KSws4tffV+PlpeXRsffj5+tL547tiG1l6dF6eWnp3LEdnTu2o33b1rblakqLsu11OiHRoXz7zj089/IMtu2wfBfWdQDYtmM3L7z6BidPn3FYBuDk6TNMemEqa9bF2SYbtYmNwWQ2296rJiQmJfPK65Zt3LF9G7RaLSdOJvDK62+Tm5fPsy++xomTCbRvG0t0VCN0xcX8+MtKvlv2q/KtbOu8bcdufH186NyxHY0bNSQxKZnps961jby48t78z1i15m+aNomiTaxl6D7+8DGmz3rX9j1X9TudM+9jvv7uJ/ILCuncsR1tYmNQq1TEHz5mayOuThJ6lyA9IxOAqMaRyqoKBZadoWdl5yirrkoD+18DwN79B5VVHD12kozMLBqEBNsOEheSm5fPmnVxqFQq260NAE2jo4iMCMfHx7taAVoVv6xYxc7d+wgPC+WDOTN56bmJTBz/EB+++wbt28ZyLiWVX1assrVv1yaW7l07kZuXz4pV5cOJS39cjk5XzJ2jbiYoMIDQBiFMHP8Qd/3fzQAE+PszcfxDTBz/EKPvvd22XE0JC7UMC9vvOymp6XzyxRIAHhlzL/P/N8u2DvP/N4sRN1yH0WhkzryPnQJ8zryP0emKGXHDdXwy7y2emzSe5yaN58N33+DafpbvvSasj9vC6HtvZ/pLz9q2e3hYKDpdMVOmvoGfny8fvvsGE8c/xPSXnmXM/XeWLbfZ4X2MRpNtnR+453bmvjXNtswLzzwBwJKly1zOCo4/cpz0jCw+mDPT9jk/mDOToMAAsrNz+Gt9HECVvtNDh49yMP4okQ0jbOv93KTxzP/fLCY8Ntbh54qrj4ReDfDzq/o9VFGNqh6QV4N2bWIJCgwgNy+fo8dOOtRt3b4LgN49uzqUVyQ3L5/pb8xBrzcw+t7bnWaEzpz2AvPnznIqv1Sr1qxHpVIx5dkn8fIqv31Bo1Fz752Wa2W79xywWwIe/e/9+Ph4s2rNegoLi0hITGLT1u20iY1h0IA+Dm1rW1GRzvbvZctXYjabufH6wVzjYmh81M03EdOyOTpdsUOI/PDzCnS6Yvpd05NRN9/ksIx9b7cmtGje1GEWsUaj5sbrBwOg0xUz7qH7HSZ/Dejbm+D69dDrDSQll4+IrFi1xrbOyu8gNqYFnTu2Q6crZt+BQw51Vsrv38tLazvxOnLshF3LyllvO4psGO40aa1LNUZ9xJUhoVcDrDdeV4X1l9h6DakusE5QsYac1a69lmHKqtz4vf9gPFOmvkFuXj53jhpZpWVqwqHDR9HrDbRtHeN0HQwgIjwUf38/h4MrZQfm++4ahV5v4Muvv+frpT/ZhjWvFLPZDEDDiHBbmfVgPfy68l6zUr9rLNeYDh0uny1r/fdNw6+zlV0urob/o6MaARBcv57L22fCwywnPiZTea/NOtt3yKB+tjJ7MS2aAXD0uOPJGUCjhhEuv/+YsuuGWVlVH3mxXgPevfcAf63f6LJnKa5edefIexWqV3bRvDrX5/Ly8qFsGKWuGHyt5SBjDTnKDpoFBYW0bN70gp9l2fKVzP3gM9Qqy20M9sOal5v1rPxg/FHGjJvk8lVQUKhcDIA+vbrTvm0sO3fv48SpBNuw5pVyJvEsAGGh5du7oKAQf3+/SkcbrAFjf3KWkZmFv79fjfeqXfH1dT2JhkpO/tRq53LrbN/pb7zr9B2OGTfJ5TVAq6Ag19+b9efoiouVVRWKCA/l9ltHAPD1dz/x2FMv8PGCr+rMgyfcnfOeJaqsWdNoAHbvc77eVZF9B+KhmtcBr7SI8FAiG0ZQUFBo6yH8XTa7zf42BSXrk2pW/PEXrWNbMvet6RXexnC5hYU2sE1IqOjlirXHQdlw2JVSWFjEqYREvLy0tGsT61Cn9fR0+H9FPBXtqrrc1Ub5vSlfyhm3l8PwoYOYP3cWQwcPQKVSsW3Hbp598TWHa8Pi6iShdwmsPaDjJ05V6SHORqPJNjPxuoH9ldVXtR7dLNPX/964FaPRxIFDh1GpVAwaYLnlwJX35n/GkaMnuHnE9Tw/6XGn6x+1wfrMyoYRYbYJCRW9lA4dPsravzfRvm0sXl5alixdVq2h7Jq09MflmM1mevew3OZi5eWlJSs7p9L1SkxKBsW156osd7WxPmrutptvdPru7F+1dcuAl5eWe+64lU/mvcXjjzyISqVi+Yo/2bvf9TVFcXWQ0LsEEeGhtlsQPv78K3LLhi4r8t78z9DpimkTG+Mw27FRZEMom4nnirV3eCUNHTQAgAOHDrN77370egOdO7arMMi279zDwfij9Lum5wXvQbucWrdqiUql4sixE9W69mI0mvjw0y/x8tLy0IP3csuI4eh0xXz25dfKppfdLytWsWnrdnx8vG03qVtZe32r/lrvUG5vx669APQou+8Ou+tflS1nZb2GeD4lVVkFwKFamqZvvcXlanywQ/eunWyTa+KP1M72EBdHQu8SPfHofwkPCyU1LZ2Xp7/Fzt3OD2g+lZDIsy++xsH4o/j4eDtNhmjRrAleXloyMrP4a/1Gh7r1cVvYvddxZuGV4OfnS0zL5uj1BpavXA1l17wqsnHLNgAGVmOm40vT3mT8pCkVhv/F8PPzpWvnDuj1Bt7+33z0eoNDvdFo4pvvf3a6v+uDT75ApyvmlhHDCQoMYPjQQUQ1imTfgXinttaJGDXdczp+8jSvvzmX5Sv+xMfHm2cmjHM6yfjPjUNRqVT8/uc6trq4R23Z8pUcjD9KeFiow1D0qFtuqnA5o9HEgkXf2v7fvq0lWA/GH3WaJLJk6TLOnU9xKLtchg8dZFvnPS4uKSQmJfPOex8piy9KZd/prj37SUvPcCjDblbtha5xiytLHjhdA/R6A7PmvG+baKDRaPDxsQzF6PUGDAbLgdbXx4fXXplMSHB9h+Wxe2gzZdefIhuGc+58KhmZWVzTqxubt+5weuCw9aG4yvKaeOC0K2vWxdme9u/v78f7s2com9hMful1MjKz8PPzrXCyAsDgAX255T/DHf5c0E3Dr+P/bnGcRn8hlT1w2v6h4CqVisaNGhJcvx5Z2TmcO2+5If7hMffaQtz6XlGNInntlcm29zl5+gwz3vofPj7evDPjFYfhQuufVtJqtbRtHUNBYSEvTZ5oq6+I9YHTAQH+DuWFhUW22ZqREeE8PeFRl/sNZeu76OsfMJvN+Hh7E9uqBXq9gZOnz2AwGPD382PG1OedJuEol2vaxLJPHD95GqPR6PAQ7A8//dJ2Qhcd1Yjg+vU4lZBISUkJbWJj2L33gNO2r2g/pAoPdK5oX7V+N5QNd1pHTI6fPE1hYRHhYaG8+dqLtvYV/Y4o612tR0XfqfVz+fn5ls8YPXYSXXEx4WGhzHj1eaeTE3HlyQOna5CXl5ZpLz7Dc5Mep2XzpqhUKvLzC8jPLwAgIjwMyh5pNGv2+y5ned0yYjgP3HM79YKCSEvPYO/+Q6hUKp6bNL7CxzHVtkED+toCrFvnjspqlwoLi2zbwtWrSGc5O24cGUlkRDgajabGb07XaNTMePV5RtxwHT4+3iQmJbN3/yFSUtOJbBjOc5MetwVebl4+S39cjkql4r+j73J4nxbNmtDvmp4uhzkff+RBWrZoisFgYO/+Q6jV1TvoKbeLn58vXTq255UXJjFz2gsVBh5lt4xMnfI0bdu0wmQ2s3f/IQ4fPU6Avx8jbriOuW9Ndwo8V8sdPnqco8dP0iAkmLEP3O3Q9vFHHrRsP2/L9tt/8DD1ggJ5/ZXnKl23mjagb2+mv/Qs0VGNKDEa2bv/kO13ZejgAUx/6VnlIhetou+0d4+ulp9fUv7zfX19GHHDdRJ4dYD09GrJ0eMneW/+5+h0xahUKu67a5TTDbZCCCEuD2tPT0KvFimHQVvHtuSp8Q9f0anwQgjhDiT0hBBCuA25pieEEMLtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLchoSeEEMJtSOgJIYRwGxJ6Qggh3IaEnhBCCLfhUVpaWqosFNVTWFTE9z/9xp59B8nPLwBApVIRFtqAYUOuZdCAPspFLtq8jxawZ99Bbhp+Hf93y03K6quO0WjiiWdeRK83MOKG6xh189W/zkKIf5/jpxKJaR4tPb1Ltf9gPE89N5W4Tf9QWFhEQIA/AQH+qFQqUlLT+P3PtQ7tT50+wzvvfcR3y351KP+3Wh+3Gb3eAMA/23crq4UQolZJT+8SFBYW8cyL0ykpMXL37bdw3aD+DvWnEhJZtnwlkyc+Ziv75vufWbMujqGDB3DPHbc6tP83emP2+xw/cYqmTaJIOJPEC08/QWyrFspmQghxWUlPrwZs3LINvd5An17dnQIPoHnTaIfAczcpqekcP3GKyIYR9OreBYDV6zYomwkhRK2R0LsEWdk5APj4eCurBLBuwyYAenTrRP8+vVCpVBw6fBSj0aRsKoQQtUKGNy9B3OZ/WPjVd4SHhTLj1efRaNTKJjbWYU1X7Ic6x4ybRIOQYN6Z+QrLlq9k1Zq/MRqNPDr2fnr36Gp7nzH338mAvr1t7zFn3sccjD/K1BefRuWhYsHibzmbfB6z2Uy9oCBG3jSswgk1iUnJLFj8LefOp2I0GtFqtVzbrzd33DaSh594FoCFH89VLnZBTz33Krl5+XwwZyZ+fr62dbznjlsZOniAsjkoPv9f6zeyctVacnJzUalUNG7UkEf/ex+RDSOUi7Fn30G+/+k30tIzMJvNaDQaIhuG89xT4/Hz87UNsz7x6Bi6denosOyuPfv54JOFRDWK5LVXJjvUFRYW8cQzLxHZMIKZU593qLNfP4B6QUHcNHyIU68/ITGJ6W+8S/u2sUwc/zCfL/qGHbv2AjDtpWeIahSJXm9g4ZLv2H8gHl1xMQB+fr6MvHEYw4Zc6/B+Qojqk+HNGtCnVw+CAgNITUtnxtv/IzMrW9nEpkl0Yzp3bEdYaAMAwkIb0LljOzp3bEeT6MbK5vyyYhUr/vgLo9EIgMFgmQxyIacTkpg+612Ki/V0bN+GsNAG5OTmsvibH1yGbtzmf5g6czaJScn4+/nRuWM7IsJDWfv3Jt6b/5myeZXt2rOf3Lx8Ylo2x8/PF4D+fXoBsH3nHkVrZ998/zPf/vALDULq07ljOzQaDYlJyUydOYfcvHyntvM+WkBGZhaxMS3o3LEdXl5aEpOSSc/MBKBrp/YA7N1/yGFZ+7Kk5HMUFhY51O3aux+Adm1a2cqMRhPT3pjD19/9RJFOR5vYGNrExlBQWMjX3/3EvI8W2L2Do0+++IptO3ZjNpsxm82YTCZy8/KZ9MJUtu3YTUCAP507tiM6qhF6vYEDhw4r30IIcQmkp3eJcvPymf7GHLJzLGf7XTq15947byMkuL6yKVRhIsuYcZMIrl8PXXExt4280anXcKGenkql4r67Rjn06lauWsuPv6zA39+P92fPsJWnpKbz0vQ3AZg4fiwd27e11WVmZfPK62+j01l6HdXt6b3/8Rfs3nvAqVc3buLz6PUGZk1/kYjwUIdlKPv8KpUKLy8tr7/ynG07Go0m3nr3A06cSqDfNT0ZO/pusOuJeXlpee/t1/Hy0treKzEpGR8fb0IbhJCekclzL8+w9SLtPfXcqxQW6TAajU7b9cNPv2Tn7n08O3Ec7drEOpRZe27WHr5eb2DqzNmkpqU79CitPb3IhhFk5+Tw8IP30qUshAEWLPqWTVu3c8Owwdxx239s5UajifgjRx2+FyHExZGeXg0JCgzg7RmvMOKG69BoNOzZd5BnX3yNeR8tsE3Vr66s7ByGDbnWKfCqok+v7k7DmDcNH4K/vx8FBYUkJZ+zlS9bvhKz2cyN1w92OrCGBNfn8UcedCirqsLCIvbuP4RKpWLQgL4Odb17dANg1Zr1DuX2zGYzjz/yoMOJg0aj5pb/DAfg+MnTtnJrTy6sQQOHwAOIjmpEaIMQAEIbhBDVKJKMzCzSMyzLUBZIuXn5tm194NARWx3AkWMn8Pf3swVeekYmO3fvIygwwCHwALy8tNw28gYA/tnhfHvGufMpjH3gbofAA2zDoy2aNXEo12jUTt+LEOLSSOjVAI1Gzaibb+KDOTMZOniAQ/gph+Kqaugg19e8LqRzx3bKIgCiGkUCkJaWYSs7dfoMAMOvG2Qrs2c90FfXlm07MZvNZcOSjtc5r+lpCb29+w86lNvz8tK6/NmxMS3BLiQAGkdG4uPjTVLyOb75/udKTzRax1qW37XHMmQJsOWfnQCMGH4dkQ0jOHLshK0uITGJgoJCWreyLIfdsj27d3H6bNhts4QzScoq/P39nK4nArRo3hSAr7/7iVMJicpqIUQNktCrQV5eWu6541Y+mDOTmJbNKSgsZNbs96s9WzG4fj3bdbDqCglxPayqVlu+6sKi8mtWWdk5+Pv7XfTPqsjfG7cCsHvvAcaMm+TwevPdD6BsWLiia3sB/v7KIig7uaBsGNG+bNzY+9FoNKxZF8f4SVN4572PSExKtlvSok/v7gAcOnzUVnbo8DFaNm+Kn58v7dq0oqCgkIRES2BZr/X16NrJ1t46Y3fNujinzzZm3CSeeOYlW1sl64mH0ojhQ2kd25LsnFxef3MuE597lZWr1lZ7vxFCXJiE3mXg5aXlxWefJKpRJKlp6WzZtkPZpFIqVe19Ld5eXsqiS5KSms658yloNBrb02mULx9vyy0e2yoIverq2L4tH/3vTf7vlhH4+/sRf/gYU2fO5sNPv3Ro1zQ6Cn9/P9vwaHpGJufOp9CuraV31qmDZSjRGnaHyq6Rdu3s3DtrEtXINhHJ1at929bKRWwnHkoajZrnJz3O9JeepW1Z8P74ywomTH6Zk2W9cSFEzXD9WyhqhHU47WzyeWXVVUGlUpGRmVVhj6Ki8spYr9X17d2Dee+87vL16pSnoSxclLMlL5ZGo+am4UN47+3XeOWFSfj4eLNz9z5W/PGXQ7vOHdqh1xs4dPiobaiyb+8eUDY06eWl5VC8pSeYlHyOFs2bOgxj+vr6ANCmdSsmjn+owtfoe2+3LVNV0VGNmDzxMebPnUW/a3qi0xUzZ97HymZCiEsgoXcZWWc+Btevp6y6KjQqu99tfdxmZRUAf613vsXhQv7ZsQvsrt25EhEeSsvmTTGbzWzcsk1ZfcmaN43m9lstsyCPHi+/RofdNc99B+LZtWc/kQ0jbJNdAGJaNONUQiL7D8aj1xtstzpYtWkVA8D+g5fvVgIvLy1jR99tmcWrK7YNtwohLp2E3iX48ZeVrFy11uE6mdWefQfZsm0nKpXKdn8aQONGDQFISDxr1/rKuG6wZcbiz7/9wdHjJx3qjh4/ybLlvzuUXcj2nXvQ6w00CAm+4PM1e5Y9lmzjlu3Kqmo5cuyEy8kfRUU6AEKCgx3KO3Ww3MN35KhlOfv77wB6dOuM2WxmxSrLg8KVE09iW7UgqlEk586nsGDRt069Yb3ewLyPFlQrqNbHbXGagGM0mjCUlKBSqQgNKQ9lIcSlkdC7BAaDgR9/WcETT7/EoxOeZ8LkV5gw+RUenfC87Qbl0ffe7jBRpFvnjqhUKo6fOMXzr8zk7bnz+fGXlXbvWnsG9O1Npw5t0emKeXPOB0yZOov35n/OpOen8eacD6p9y8Rff1seO9a7Z1dllZNBA/qiUqk4dz6Fo8ccA7c60tIzeP3NuYx/agpvz51vW/8ff1mBj483t5bdQmCl0aiJadGMpORzmM1m2+QWq25l1++szwy17wVaPTNxHD4+3mzaup3HnnqBmW+/x3vzP2fK1FmMnzSFPfsOolY7z+ysyO9/rmX8pCm27T/z7fd47KkXKCgoZMjAfjU+0UgIdyahdwl69+hKy+ZNCQjwx2AwkJ9fQH5+AV5eWnr16MrbM152uNGZskdLTRw/lsDAANLSMzh+8rTtOtGV8NTjD3PvnbdRLyiIlNQ09u4/hLe3FxMeG8udo0Yqm1eosLCIk6cSAOjbu6ey2olGo7YNNW7dbhkSvRixMS1oW9ZbO3z0OHv3H6LEWMKAfr2Z++Z0ggIDlIvY7n0LCgygaXSUQ52fn69tlqWyF2gVFBjA3Den06tHVzw1Gk6cSmDv/kPk5ubROrYl0196tsKZmq4MGdiP+vWCSEvPYO/+QyQkniWyYTgTHhvr8gEGQoiLJ09kEZWyPiFlwfw5yiohhKgz5Iks4oKs97NZJ7wIIURdJ6EnKrRug2VWp/XWCyGEqOsk9NxYQmIS8z5a4DT71Gg0sWz5SnbvPYCXl5abhl/nUC+EEHWVXNNzY9an/1P2gOmoxpEUFBSSePYcBoMBlUrl9NcXhBCiLrJe05PQE0II8a8nE1mEEEK4HQk9IYQQbkNCTwghhNuQ0BNCCOE2JPSEEEK4DQk9IYQQbkNCTwghhNuQ0BNCCOE2JPSEEEK4DQk9IYQQbkNCTwghhNuQ0BNCCOE2JPSEEEK4DQk9IYQQbkNCTwghhNuQ0BNCCOE2JPSEEEK4DQk9IYQQbkNCTwghhNuQ0BNCCOE2JPSEEEK4DY/S0tJSZaEQQghxuRQYC0guSia/JJ9CUyGlpaWEeYcRExiDp4ensnmNOH4qkZjm0RJ6QgghLj9zqZk92XvYl72PpKIkZTUAGg8NsYGx9AntQ6RPpLL6kkjoCSGEqBWHcg+x+vxq8krylFUuNfFrwl1N7sJb7W0rM5Ya0XhoHNpVh4Tev8SceR9zMP4oU198mqbRUcpqIYS4otalrGNj+kbb/0O8Qmgb1JZmfs0I9grGX+NPtiGb1OJUDucepnVQa9oHtbe1TypKYlfWLm5pfIut7GJI6F2ib77/mTXr4pTFFVr48VxlUY2o6dBLS89g6Q/LOXbyFIWFRQBoNBoiG4Yz6uYb6di+rXIRIYRw6a+Uv9icvhnKhi4HhQ/imtBr8MBD2dRJXkkeq8+v5lDuIcY0H0O0X7SySbVYQ09mb14kXx8fAgL8HV4ajaXr7efn61RXF6xas54pU2exZ/9B9HqDbd3NZjOJSclOIX/g0BGmzpxN3OZ/HMov1qnTZ3jnvY/4btmvyiohRB2zP2e/LfDCvcN5rNVj9Antc8HAM5Ya2ZC2gXlH53Eo9xDtgtpdcuDZk55eDarpXldV1NTPTEhMYvob7+Lj483DD95Ll07lwwsAO3fvY+/+Qzz04D22MuvPHnP/nQzo29uh/cWw9p6HDh7APXfcqqwWQtQROpOO/x35HwazgQBNAI/GPIqfxk/ZzMmBnAOsOb+GfGM+AGoPNRNiJxDoGUi2IZv62vrKRapMenrCwdr1mwAYeeMwp8AD6N61k0PgCSFERTambcRgNgBwW/RtFwy8lOIUvjj5BT8l/WQLPIB+of0I9AwE4KeknzhTeMZuqYsjoScAyMnNBcDX10dZJYQQVVZKKXuy9wDQNqgtTf2aKpvYFJmK+O3sb3xy/BOn2xj8Nf70C+sHwMGcg5wtOsvOzJ0ObS6GDG/WoMqGGguLili+4k/+2bGb/PwCALRaLV06tWfMfXfi5aV1aK/XG1i45Dv2H4hHV1wMZdcKR944jGFDrrW1q+hnnjx9hjfemYfZbK7S8KN1aLF921iemTBOWe3A+jNdsf9ZaekZ/PTrHxyMP2KbFOPj7c2QQf24+abhaDRquMCkIFdDnX+t38jKVWttQV0vKIibhg/hukH9HdoJIWrfmcIzfHnqSwDuaXoPMQExyiYAbM/czrqUdejNemUVALdF3UaHeh0AWJ+6nri0OFSoeLH9i6g9LMeO6pDhzVo2beYc1qyLw1hipHPHdnTu2A6AbTt2M3XmbIe2uXn5THphKtt27CYgwJ/OHdsRHdUIvd7AgUOHHdq6cu58CnPmfYzZbOaBe26/YOAB3DT8OlQqFQfjj/K/Dz9Dr7cMTbjSqmVzOndsR1BgAABNohrZPlNYaANbu+dfmcm2Hbvx1HjSuWM72sTGUGI0suKPv/jgky9s7ZpEN3ZYNiy0ge39mkQ3trUzGk1Me2MOX3/3E0U6HW1iY2gTG0NBYSFff/cT8z5aYGsrhLgyzuvOA6BCRTP/ZspqAP5O/Zs/zv1RYeA19m1sCzyA5v7NATBjJkOfYdey+tTTpk2bpiwUF2frtp2kpWcysP811AsKcqjbdzCeJx4dwz133krvHl3p3aMrNwwdzOEjx0g6e46oRpFENgwH4OulP3Hq9BluGDaYpx5/iN49ujJoQB9uHDaEwAB/wsNCbe+r/Jm5eflMnTkbna6YO0eNZOjgAXZrUTFvLy/at23Njt17OZt8nt9XryM7O5c2sTG2HplVbEwLevfoyqHDR0lLz+S2m2/kzlEj6d2jKw1Cgm3tDhw8zEvPTeTWkTfQu0dX+l7Tg+uHDGTjlm2cSUqmb+8e+Pn6Et24Eb17dCU9I5NTp8/Qp3d3Hn7wXnr36Ep040a29/vo88UcPnKc9m1jee3l5+jft5ftPXfs3seJUwkO21EIUfuO5R8jsTCRQM9A+oT2UVZjKjWxNGEpZszKKpu7mtxFgKflpBpArVKzNWMrAC0CWtDAq/zkuqqysnMJqR8kPb3aMnniY0RHlR/AATQaNd26dATg6PGTtnLrsF2LZk1sZZS1r+w+udy8fGbNfh+drpibR1zP8KGDlE0q1aJZE+a+OZ1ePboCsGHTVsZPmsI33/+M0WhSNr+gV16YREiw42wrLy8tHdq1AeDw0eMOdZVJz8hk5+59BAUGMHH8ww5B7OWl5baRNwDwz47ddksJIWqb3mTpvdk/TcVetiGbktISZbFN5/qdaejT0KHMV+1r+7f1/S+WhF4tKiwqYt2GzXz8+WKmzpzNhMmvuLwnrUVzy4Xfr7/7iVMJicpql0wmM7Nmv09qWjrDhw7ilhHDlU2qxMtLy7ix9zNv9uu2WZxr1sUxdcY7FxV8aekZrNuwmffmf86UqbN44pmX2LR1u7LZBe3asx+Ant27OPU8Adq1iQUg4YzrZ/oJIWqHNeyKjJbr+ErB2uAK79Xz9PBkaMOhymKKTOXv5aO5tMl2Enq15OMFX/HE0y/x1bc/sm3nHrJzcgkPbUATRe8PYMTwobSObUl2Ti6vvzmXic+9yspVaysNnQ8/WUhqWjpDBvbjzlEjldXV5ufry4THxvL2jJcJDwvlXEoq783/TNmsQkajidffnMvzr8zkq29/ZP/BwxQWFRHduJHDdb+qysrOgbIAHjNuktPriWdeUi4ihLgCAjSWYclCYyGmUudjlspD5XLYE2Bow6EOvTqrHIPl9x+7979YEnq14Ltlv7Jtx26aRDfmlRcmsfDjucx753Veem4igwdapuTa02jUPD/pcaa/9Cxt27SioKCQH39ZwYTJL3PytOv7VBpFRgCwe+8BcvPK73O5VCHB9Znx6vP4+HhzMP4oCYlV60l98MkXnEpIpFOHtrz1+kssmD+Hee+8znOTxtOpQ8VDtBdiP2nG1at929bKRYQQtaihr2Vo0oyZUwWnlNUAXBdxHcMjh+OjtvTaPD086R/anx4hPZRNATieZ7kUovHQEOYdpqyuFgm9WrBn30EAHn/kQZo3dXycjrUH40p0VCMmT3yM+XNn0e+anuh0xcyZ97GyGQCjbrmJ7l07kZ2Ty6zZ79do8Gk0atv1xcSkZGW1SwcOHcHLS8tTjz/s1LPLzrFcs6wO6/2DbVq3YuL4hyp8jb73duWi4v/bu/Pwpqr8j+Nv0tB9L6WlG5WtQKFUBFlF2ZRRRlFccRkZXPgxDgyjICMiIAIK4sKggzqOjKOIOJUBAStF0A47ZSnQltK9ZesKpU3ThDT9/ZEmNjdpaSs64v2+nifPA2e5SS6aT86955wI8TMK9wjHW2vZevFwRdP32AcFDWJW71lM7T6VOX3mMCp0lLIJNEx8Sb2YCkAP3x5tWq7QmITez6C4pBSA4A5ByirSmljv1pibmytTfvcQgQH+6PW1TY62/vDU4/TpHUNxSSlLX/9rs8sOWqu21nLzWDkxxZn8wiLMZjM+3o57jppMdWRlO//215xePSxrfY6duPKSDSHE/1Z8QDwAJy+dJF+Xr6y2aUc7QtxD0DQTRcklybafJLIe98do+pnEVWNdYrAzeY9d+SfrEpxOVNmZvMchsEymOoyXL6PRaAgOcgxPqxnTnqR7ty4Ul5Qyf/Hrzd4HbOzva9aya88Bh+cF2JL4Ldm5+fj5+tgmjAB0CrUsDcjNs38P0VGRaDQaysor7C7Hmkx1vP3uB1RV6+zaW0WEWy6L5BeeVlYR06MrkeFhnD13ng//+ZnD+zIYjKz824dNfiEQQvx8hnccjpvGDYD/FP2Hy+amZ2s2p8xQxq4SyxaJEZ4RTS50bw3ZkeUqamp3lOTd+/joX58DEBrSkdCQYDJP5WAwGhk5YijffrfLbueRWXMXUXHhIh2DOxAaEkx1tY78wtOYTCaHHUqcPafJVMeLL79GcUkpIR2DeeWl553OeGys8S4rHu7uaNtbfjFCr6/FZDKh1WqZ8+wzdssoMk/l8Oobq6DhUqxr+/aMvHkYQwcNsO2yotFoiAjvhJenJzl5Bbi4aIjvG8veA4ccdorR6WqYPmseZrOZjsEdCAoMoMt1nbl3wh3QsCTjL/OXoNfXotVqiY6KwNvbi/PFpZSUlmE2m3l53iwiw6/uLy4LIVrvROUJEgoTABgYNJDbw25XNrmiD7I/4Kz+LO3bteep7k+1aX2elezI8jMaMWwwj026D38/P84Xl3DsRAbBwUEsmjfLYe0ewOhbhhPg70dJaRlHj6WRX3iasE4hTP+/KQ5bcjmj1bqwcO5zhHQMtoz4WrDc4KZhg4mKDMfLyxN9bS1VVdXodDV4eLgzdtQIVq1Y7LBuMKZHVx6bdB+urq4UFp2h8PRZPD0s994m3X83438zBreGuqycPLp1jWbpwhfw9na++ayXlyczpk3B19eHktIysnLy7PYC9fP1sa0jbK/Vkp2bz9FjaVRWXqJnTDcWzn1OAk+IX4g+fn0Y0dGyOUZ2Vbay+op0Jp1td5d7O9/7owKvMRnpCSGE+MmkV6YT4Rlh+7WE1jinP8fl+stEef7439OTX04XQgihGnJ5UwghhOpI6AkhhFANCT0hhBCqIaEnhBBCNST0hBBCqIaEnhBCCNWQ0BNCCKEaEnpCCCFUQ0JPCCGEakjoCSGEUA0JPSGEEKohoSeEEEI1JPSEEEKohoSeEEII1ZDQE0IIoRoSekIIIVRDQk8IIYRqSOgJIYRQDQk9IYQQqiGhJ4QQQjUk9IQQQqiGhJ4QQgjVkNATQgihGhJ6QgghVENCTwghhGpI6AkhhFANCT0hhBCqIaEnhBBCNST0fkFmzV3E5KkzyS8sUlb9z02eOpNZcxcpi38W/8vnFkL8urSrr6+vVxaqjcFgZEvidg4eTqWsvAKTyQSAl5cnPbp2YcJvxxEVGa7sdtXNmruIsvIK5r/wZ6KjIpXVV8Xa9RtI2pGsLMbV1ZVuXaP5/aMPEhQYoKxm8tSZdAgKZPniecqqn9z/8rmFEL8OWbmFdO8SJSO9ncl7eObZuXz1dRLni0twc3PFx8cbHx9vdLoajhw7wRcbvlJ2u+a5uv7wPn18vDEajaRnnGLeomW/yJGmEEJcDaoOvbXrN/Dx2i8wm82M/80YVr/9GqtWLGbl8kWsXL6ID1a9zpTHHsLP11fZ9Zp38/DBtve5cvkiVr/9Gt27dUGvryXhP1uUzYUQ4ldBtaGXvHsfSTuS8fBwZ9G8WUy86w7c3Fzt2mi1LgwfeiNPPD7JrvzXyM3NlScb3uf54lJltRBC/CqoMvRMpjrW/XsjAM9On0pYp1BlE1Xy9PAAwMXFRVklhBC/CqqcyJK0I5m16zfQP74vf5z6e2V1i5RXXOCLDZs5djwdfW0tAB7u7sT17c19d493OhmEhn7/+Nc6snPyMRqNaLVaenTvwlOTH+GV195qciKLwWDko08+50jqCYxGIxqNhojwTkx57KFWTbKxTmQZO2oEk+6/264uMWknnydsclrX3GSStp4Lg8FIwsYt7Nmfgk5XA436TZ3yqK1dU89tfS8eHu4sXfgCfr4+4OQcAwQFBvDQfRO44fo4u2MIIdRB1RNZ0jIyAejXt7eyqkUOpBxh9ouvsP/gYQDi42KJj4sFYP/Bw8x5aQk5eQWKXpCTV8Ccl5aQnnEKF42G+LhYoqMiOJWVy8Klb2A2m5VdoKHfzDnz2X/wMJ4eHsTHxRIR3onCojMsXPoGe/anKLu0iq6mhu07/8sXGzYTFhrC/ffcqWzSpB9zLmbOmU/SjmQuXzbRK6Y7vWK6U2c2247VnMSknY0uT8+2BV5OXgGzX3yF9IxThIYEEx8XS2hIRy5crCQzK0d5GCGEyqhypGddGvDyvFlEhocpq5t1vriUuQtfBeCJ3z3EkEED7OoTNm5h89fb8fBwZ+XyV9BqLZcKTaY6ps96Eb2+lgcm3sm4sSNtfQwGI0tX/JWCwtMAdiO9xv0em3QfI0cMtfXLzMph2Zvv4ubmavdczWlqyQLAsCEDefzhB5wex9loq63nQqerYdaLi9Draxn/mzFMvOsOWx+TqY5P1iXw+CP328qUz528ex8f/etzPDzceXH2DLvL04uXvU12bj5PTX7Y7vUYDEayc/OI7RVjKxNCqIeqR3pWrQ08Gj7IzWYzt982yuFDHmDiXXfYZkHuTN5tK9+cmIReX0v/+L52gUfDJJKZzzyFRuP4z2HtN3zIjXaBBxDTvSvxcbHo9bWkHk+zq7sS5ZIFjUbD7r0Hmfn8/BaPiNp6Lr7YsNn2nhoHHg2ThxoHntKxE+n889Mv8PBwd3o/9mLlJQC6db3OrtzNzVUCTwih7tCz3kdqjZOnsgEYN8Y+uBobPmQgNLqMCnAqKxeAUTcPs5U15ufrQ2CAv7KYtHTLMUaPHK6sAqB7w4d7S4PKSrlk4cN3V/DwA/dQo9ez7M13qbxUpezioK3nwvrnO8aNsZW1RE5eAW+/+yEajYZnp0+l63WdlU2I7mwZIb/z/hpKSsuU1UIIlVNl6Pn7WdbdtWURdnW1Dm9vL7y8PJVVNtaJJY1DtbSsHMBhgsqVWEcuC5e8weSpMx0enydsUnZpszEjb+KmoYMwm81sSdyurHbQ1nNRVl6Bt7cXoSHBjVo2r6q6mhUrV2M2m5nz7DNOAw/gkQcnEhYaQkHhaZ6ft5jn5y1m154DymZCCJVSZeiFh3UC4OChVGVVi7i2b68scqq9k3Zubm7KohaxThBp6tE5KkLZpU0G3tAPgHPni5VVTrX1XLS0n5WXpye+PpbJKolJO5XVNn6+PixeMIfZM/9AVGQ4JaVlfPjxZ/x5zoIWjV6FEL9uqgy9ITfeAMC+g4da/UHo5uZKxYWLzV4aLSw6Aw17d1pZ174VFFkmqzjjbPamh7s7APfcdTszpj3R5GPYYMtlxB+rttagLGpSW89FS/opaTQa/vLcHwnw9yPlcCof/vMzZRM7vWK6sXDuc6x6YzHdu3XhwsVK3lz1vrKZEEJlVBl6MT260q9vb8usydf/islUp2zSJOtkiMTtTY82Dh46CsDA/pZRE43uvX2XvMdW1lhaRiYVFy4qi+nScBnvQMoRZdVP4ugxy4SYiBZM8vmx56K5fs74+fow/4Vn8fBwZ9feA3yyLkHZxIGXpyez/zQNwDY7VgihXqoMPYDJjz6It5cXxSWlzHx+PimHHS91GgxGdu05wN/XrLWV/fb2sWg0GrZ+s4O9TtbHJWzcwon0TEI6BnPjgOtt5daJKHv2pzj0K6+4wDvvr3E6e3Pc2JG25zuSekJZTWHRGZa//TdlcZtsSfyWXXsPoNFoHGaYOtPWczFxwh1N9jOZ6podxfn5+vDi7Bl4eLjz7Xe7WLt+g1399p3/dfgSo6uxjCita/mEEOqlynV6VpWXqnhz1fu2EYBGo7FdhjObzbbLb316x/Ds9Km2fsm79/HPTy0bVXu4uxPToysGg5GcvAKMRiPeXl68Mv95hw/ZzxM22e5H+fv5Ed05gooLFzl95hx9Y3ty5ux5pzuyWNel0XC5M6ZHVwCycvLQ6WoI6RjMqy+/YGvfHOs6PVdXV7u9RvX6WkwmExqNhqd//4hdSOFkrZxVW8+Fsp911mVWTh4mk4mPVr9pa+vsuXPyCliyfCVms9luB5nJU2ei1WoJ6xRCYIC/7fyazWYmP/oAI4YNth1DCKEe1nV6LgsWLFigrFQLdzc3brlpKN26RFNaWk5NjR5dTQ1Go5H6+no6Bndg3NiRPHjvBLsF252jIrg+rg8lZWWUV1ywhZW/ny+jbxnOjGlP4ulhuRfXWJ/eMXSOjKCg6Axl5RWcLy6lXTsN99x1O5Puv5ukHcnU6PXcctMQ/P38bP06R0XQv19fcvMLqLxUxdlzxZwvLsXd3Y2bhw9m2pOPO11Q7szxtJPk5hVQV1eH0Wi0PbRaLTE9ujJ75jTb5cfGNm7+Bk9PD24dfbNdeVvPhbJfcUkpFRcuEtwhiAcm3mm3tZqz5w4M8Kdnj27s2Z9CTm4+BoORPr1jqKnRU1xSSmlpOeeLS9HXGoiOimDGtCeI69O2HXiEENe+iguVBAX4qXukJ4QQQh1kRxYhhBCqI6EnhBBCNST0hBBCqIaEnhBCCNWQ0BNCCKEaEnpCCCFUQ0JPCCGEakjoCSGEUA0JPSGEEKohoSeEEEI1JPSEEEKohoSeEEII1ZDQE0IIoRoSekIIIVRDQk8IIYRqSOgJIYRQDQk9IYQQqiGhJ4QQQjUk9IQQQqiGhJ4QQgjVkNATQgihGhJ6QgghVENCTwghhGpI6AkhhFANCT0hhBCqIaEnhBBCNdrV19fXKwuFEEKIn4q+tpbsnAKqdTW002jw9vTAx8eLsNAQ2rfXKptfFVm5hXTvEiWhJ4QQ4ueRmZVLalomp8+cV1YB4KLREN05gr69e9AlOlJZ/aNI6AkhhPjJmEx1aLUutr+XlV9g49ZvqbxUZdeuKaEhwdw6chgdggKUVW0ioXeNWrt+A0k7kpn86AOMGDZYWd1qs+Yuoqy8gvkv/JnoqKv7zUoIoV56fS07/ruPYYNuwN/PB4A6s5mDh4+j09XQJTqSwAA/vL08uVSl48LFSvIKTpOZnUdtrQGA9u21jL9tJNd1jlAcvfVUH3rWD/umdAgKZPniecri/7mmQm/uglc5X1LKlN89xNBBA+z6NEdCTwjxUzmcmsb3uw8yIL4PgwfGt+h+Xa3ByPe7DpB2MstWdu9dtxEVEWbXrrWsoaf62ZteXp74+Hg7fQghhGi7+L698PXx5uCR43z4ry84kfFDkDXF3c2V20YPZ+Kdt+Lm6grAV1/vbPFl0StR/UjvWhvhNDXSa6tr9TwIIX65DEYj9fWWAMsrOM2GzUm2uo7BQYweMYROocF2fZwpKDpLwqZvAOgSHcmEO8Yom7SYjPSEEEL8JE6kn2LvgSMAXNc5gs6R4ba6ktJyPkvYzNdJyehq9I16OeocGcbA6/sCkJtfxOmzzmd9toaEnhBCiKvqyLEMjhxLp6ziAgCjRgyiXbt2dm0yTuXw4cdfsD8llbq6Oru6xgYPjMfD3R2AtBZcHr0SlwULFixQFqpB0o5kavR6brlpCP5+fspqG5OpjufnLeazL/5DYIA/naPsZxElJu1k8fKVnMrKZdiQgXZ1GZnZrHrvH6xdv4ENm77mq61J7DtwmE6hHekY3AEajr9nXwp/+/vHfJ6wydbu8NHjdL2uM35+vnbHPJ52kty8Aq7v18futaxYuZoPPvqU+LhYh/dTXnGBd95fw8dr/82XG7eyJfFbMrNy6NO7J8m79zk9D42PV1xSxqLX3mJ9wiYKi84waGB/AE6kn+Sd99ew7t8b+XLjVjZu/ob9B48QFBhAp9COtmMtef2v/OPjdUSGhxHWKcRWDnDoyDHmLnyVw0eOM/LmYXZ1Ol0NT0+fzcFDqYy+ZbhdnRDil+ns+RIOHU0DIDoqnMAAPzzc3TEYjJwrLrVra66vp+jMOTIycwgM8Mdf8XkH4OKiofJSFcWl5VRV6xjY3zLya62KC5UEBfjJSO9KtFoXHn/kfgC+3LgVk+mHbyQ6XQ2btm7Dzc2Vp6c82qgXvPP+Gpa9+Q6FRWfoEBRIfFwsHYM7cL64hNTj6bZ267/cxIcff0ZZeQXRURHEx8XSISiQwqIzLFz6BvmFRXbHba2cvALmvLSE9IxTuGg0xMfFEh0VwamsXBYufQOz2azsYqekpIxlb77LpYabyJcvXwYgefc+Vqx8j9NnzhEaEkx8XCxRkeGcLy5h5d8+ZM/+FNsx+vfrA8DRY5b/ERqzlhWdOYtOV2NXd+joMQBie/WwKxdC/HKVlJYD0K5dO7sZl0MGxuPmZpmYonSpqpovv9pGfuEZZRU0XOYEqK01cLHykrK6VVQfeguXvMHkqTMdHsm799naxPaKYUD/flReqmJz4g83ZNf9eyN6fS0PTLwLP1/LOhSAzxM2kXI4lQB/P15f8hJLF/6FGdOeYOnCv7Bw7nP4+/8wonJ1deXhB+7hg1XLmTt7BjOmPcFri+Zy74TxmM1mtiR+a2vbWiZTHStWrsZkMvHAxDt5962lzJj2BHNnz2DVisX4+nhTceGispudjVu20Te2J6vffo2PVr/Js9OnAqDVahk7agTvrVzGwrnPMWPaEyyc+xwzn3kSgMRtO23HuOH6OABOnsq2lVkdT8tAq7VMY7aG3A91JwHo17e3XbkQ4pfr0qVqALw8PeyWKLi5uTJ88A2NWjo6eNj+M8CqQ1Cg7c/W47eV6kOvqSULrg1TZa2e/v2jeHi4k5i0E52uhvzCInbtPUCvmO6MHDHU1k6nq2Hbt9+j0WiY/8KzBAXa7yYQFRnO7beOsv393gl3MGbkTXZtAG65aQgA+QVtH+ltTkxCr6+lf3xfxo0daVfn5ubKzGeeQqNp/j8BF42GP/3hSYdvaEMHDWDS/Xfb7bgAENenN97eXhSdOWsrC+4QRGR4GGXlFZSWWb4FAuQXFlF5qcr2/q0hZ3XyVDbe3l7E9oqxKxdC/HJdNpkAcHd3U1YRFxtDB8VnYmPFJT98PjTm6+Nl+3P1FSa/XEnzn3gq8NyMqaxcvsjhMbjhvpWVVuvCIw9OxGAwsubT9Xy67kunlzUPHT2G2WwmPi7WbvTXHJOpjpQjqaxdv4Flb77L9Fnz+NPz85XNWu1UVi4AoxT3yqz8fH0IDPBXFtsZOrj5he4n0k/y5catvP3u35k+ax5PT3+e6mqdshk9Y7pBwz08qz37LJdAx48bQ1inULuRYH5hEdXVOnr2sPQTQlwbPBrCTq+vVVbRrl07Rt3c9FIrf3/He3oA+oYdWmhYx/djqD70WmPooAH06R1DyuFUsnPzHS5rApw+cw6A7l2vsytvyoGUI/zfn+bwzntrSNqRTH5BEV6envTp/eNHN9ZR1Y9Zf9e9WxdlETTcK/zjsy+yYuV7fPV1Eukns3Bt357ePbs7jAppFJ5pGZm2srSMU3TrEo2XlyexvXpQXa2z3cO03usb2L+frb0Q4pfPy8sTgBp9LXVO5gxEhIXSu6fzL7NDBsYri6Dhnp+Vd8Px20pCr5VCOv6woNLZh7uVm5vj0F4pv7CI9/7xCe3ba5ny2EN8sOp13n1rqe0e4NXSktfSFBcXx/9EdLoaVqxcTY1ez70TxrP67dd4b+VrvL7kJWZMewIfb8fdbKKjIvH29iIrJw8aAvnsufPENoS79b6dNezS0jPRaDT0j7fcDxRCXBtCgoMAqK+vp6CJiSljbh5K1+uibH8P8Pfl3jtvsytrLDff8mVY6+JCUGDzV6euxPETTTQpLSOTb7/bRZ/eMbi5ufLJugSHGYeenh4A5OYV2JU7s//gEcxmM7eOvpnhQ2+0uz/W+N5XW7m4WI5XUHRaWWVzpdmbzqSeSLfdK7xj3GiH8K+qdn6jOb5vLAaDkbSMTNtlzmGDLcs8YntZzmlaumUkWHTmLF27RDvcMxRC/LKFhgTj1fA52NS2Y1qtC3fdPprpTz/Kow9OYPLDE4lqmKGpVFdXR/pJy62P66IjbZ9rbSWh10ImUx3vvL8GNzdXnnj8YSaMH4deX8sHaz61axcfFwvAwcNH7ZY3OHO6YbKHs/tqje99tZX1Eut3yXuUVdAQ4leavemMdXJNQKNZqFZpGZkYDEZlMTQ6N6nH0zl05BhhnUIJ7mD5VkjD683NL+TYiXQMBqNtqYMQ4tpivXyZnVtAUcMtH2e0Wi3BV/jpoP0pqVQ3DC5im7gs2hoSei206r1/oNfXMmH8OPx8fRg3diSR4WGkHk+3W5MWHRVJv769MRiMvLLsLYcAKCw6w+avtwMQEW75ZrPvwGG7NplZOSRs3GpX1hajR1oWdO/Zn8LeRq+RRgvWrzR705nozpZ7hEdST9gF+5WO2a9vLG5urpzMzCY3v9Bh/d3AG+Ixm81sblimYV3qIIS4tgy6oR+u7dsDkPjtf7l82TKjs7UqLlxk/yHLAKBTSPBV+WFZ1e/IknI4lcTt3/F10k6HR5/Ynvj5+pC8ex+JSd8RGR7Gk5Mfth0jKiqC5N37yMjM4pabhuLqavlHHtA/nkOHUzl95hxbt+1g34HDpGVksmHT12xJ3E5EeCf6xvYiMiKM73ft5dz5ErZt/57s3Hw2bv6GxKSdjL5lOLl5BXh6enDr6Jttz9nUjix796dQUlput7OKv58fBoORrJw8Dh09zvf/3UdmVjZfb9tBwsat9O7ZHZPJ5HRHFmfHs+oUGsKBlCOUlpXzzfbvyDiZxbYd35OwcSsx3btQV2emRq9nwvhxdv00Gg2ZWTlk5+ZTX1/Pow9NtDt2h6BAtm7bQUXFBcI6hfLb28fa9RdCXBtcXFzw8/UmK6cAo/EyRuPlNv0mXsJX29DpatBqXbjnt2Px8LBsR9YWsiNLA52uhqqqaqePuro6Ki9Vse7fG9FoNPz+dw/a9e16XWeGD7nR4TKnVuvCwhdnce+E8QT4+3G+uISjx9Koqqpm0MD+3DbmFmhYMvDi7BlERYZjMBo5eiyN2loDj026j0n3393omdrugYl3Mv3/phAa0pGLlZUcPZbGpUvVPHTfBP70B8tC8tbSal34y3N/pHevHpjNZjIysygtLef220bZFq83Ja6PZcKKn6+Pw6xSLy9PIhtGv8pRoBDi2hLTvQuDB1hmXxcUOZ/Q0pxqXY1td5fxt410ehuoLVT700JCCCF+epnZeYSFdsTH+4cF5i1VXFqOyWQiXLFnb1uo/pfThRBCqIf8np4QQgjVkdATQgihGhJ6QgghVENCTwghhGpI6AkhhFANCT0hhBCqIaEnhBBCNST0hBBCqIaEnhBCCNWQ0BNCCKEaEnpCCCFUQ0JPCCGEakjoCSGEUA0JPSGEEKohoSeEEEI1JPSEEEKohoSeEEII1ZDQE0IIoRoSekIIIVRDQk8IIYRqSOgJIYRQDQk9IYQQqiGhJ4QQQjUk9IQQQqiGhJ4QQgjVkNATQgihGhJ6QgghVENCTwghhGq0q6+vr1cWqsGsuYsoK69g/gt/JjoqUlltk19YxMIlb9AhKJDli+cBsHb9BpJ2JCubNumj1W/a/jx56kwA/Hx9eGvZy41aNW/NJ+v5ftdeAIfXbH09Y0eNYNL9dzfq1TrWc9KUxuegJZp6XXMXvMr5klKm/O4hhg4aYNdHCCF+Clm5hXTvEiUjvbbw9PDAx8fb7qHVagHw8vJ0qHOm8lIVB1KOKIudMpnq2HfwkLL4J+PsPTT3Xq4Wna6Gtes3MG/RMmWVEEJcFf8PLCsmMDkxUlAAAAAASUVORK5CYII=" + } + } +} \ No newline at end of file diff --git a/packages/tdev/page-index/index.ts b/packages/tdev/page-index/index.ts new file mode 100644 index 000000000..143bd11a8 --- /dev/null +++ b/packages/tdev/page-index/index.ts @@ -0,0 +1,21 @@ +import { DocumentType } from '@tdev-api/document'; + +export interface PageIndex { + /** + * the document root id + */ + id: string; + type: DocumentType; + /** + * the page_id in the frontmatter of each md/mdx file + */ + page_id: string; + /** + * The resolved path to the file - should be the same + * as docusaurus `path` field in the sidebar index. + */ + path: string; + position: number; +} + +export const PluginName = 'page-progress-state'; diff --git a/packages/tdev/page-index/package.json b/packages/tdev/page-index/package.json new file mode 100644 index 000000000..7f66b6b3c --- /dev/null +++ b/packages/tdev/page-index/package.json @@ -0,0 +1,16 @@ +{ + "name": "@tdev/page-index", + "version": "1.0.0", + "main": "index.ts", + "types": "index.ts", + "dependencies": {}, + "devDependencies": { + "@docusaurus/core": "*", + "@docusaurus/module-type-aliases": "*", + "@types/better-sqlite3": "^7.6.13", + "better-sqlite3": "^12.6.2" + }, + "peerDependencies": { + "@tdev/core": "1.0.0" + } +} diff --git a/packages/tdev/page-index/plugin.ts b/packages/tdev/page-index/plugin.ts new file mode 100644 index 000000000..6715a7a26 --- /dev/null +++ b/packages/tdev/page-index/plugin.ts @@ -0,0 +1,35 @@ +import { LoadContext, Plugin, PluginModule } from '@docusaurus/types'; +import { exportDB } from './utils/exportDb'; +import path from 'path'; +import { promises as fs } from 'fs'; +import { PluginName } from '.'; +import { pageIndexPath } from './utils/options'; + +const isDev = process.env.NODE_ENV !== 'production'; + +const pageIndexPlugin: PluginModule = (context: LoadContext) => { + const config: Plugin<{}> = { + name: PluginName, + async allContentLoaded() { + if (isDev) { + try { + await fs.access(path.dirname(pageIndexPath)); + } catch { + await fs.mkdir(path.dirname(pageIndexPath), { recursive: true }); + } + } + }, + async postBuild() { + try { + await fs.access(path.dirname(pageIndexPath)); + } catch { + await fs.mkdir(path.dirname(pageIndexPath), { recursive: true }); + } + + await exportDB(); + } + }; + return config as Plugin; +}; + +export default pageIndexPlugin; diff --git a/packages/tdev/page-index/remark-plugin/index.ts b/packages/tdev/page-index/remark-plugin/index.ts new file mode 100644 index 000000000..8dea02649 --- /dev/null +++ b/packages/tdev/page-index/remark-plugin/index.ts @@ -0,0 +1,147 @@ +import type { Plugin, Transformer } from 'unified'; +import type { Code, Root } from 'mdast'; +import type { MdxJsxFlowElement, MdxJsxTextElement } from 'mdast-util-mdx'; +import path from 'path'; +import db from '../utils/db'; +import { exportDB } from '../utils/exportDb'; +import { debounce } from 'es-toolkit/function'; +import { tdevRoot } from '../utils/options'; +import { TypeModelMapping } from '@tdev-api/document'; + +const TdevRoot = `${tdevRoot === '' ? '' : '/'}${tdevRoot}`; +const TdevRootRegex = new RegExp(`^${TdevRoot}`); +const projectRoot = process.cwd(); +const isDev = process.env.NODE_ENV !== 'production'; + +const insertDocRoot = db.prepare( + `INSERT INTO document_roots ( + id, + type, + page_id, + path, + position + ) VALUES ( + @id, + @type, + @page_id, + @path, + @position + ) ON CONFLICT(id, path) DO NOTHING` +); + +const cleanupPage = db.prepare( + `DELETE FROM document_roots + WHERE path = ? AND page_id = ?;` +); + +interface JsxConfig { + /** + * Component Name + */ + name: string; + /** + * @default id + */ + attributeName?: string; + docTypeExtractor: (node: MdxJsxFlowElement | MdxJsxTextElement) => keyof TypeModelMapping | string; +} + +export interface PluginOptions { + components: JsxConfig[]; + persistedCodeType?: (code: Code) => string; +} + +const slugCountMap = new Map(); + +const scheduleExportDb = debounce( + async () => { + await exportDB(); + }, + 250, + { edges: ['trailing'] } +); + +/** + * This plugin transforms inline code and code blocks in MDX files to use + * custom MDX components by converting the code content into attributes. + */ +const remarkPlugin: Plugin = function plugin( + options = { components: [], persistedCodeType: () => 'code' } +): Transformer { + const { components } = options; + const mdxJsxComponents = new Map(components.map((c) => [c.name, c])); + return async (root, file) => { + const { page_id } = (file.data?.frontMatter || {}) as { page_id?: string }; + if (components.length < 1 || !page_id) { + return; + } + const { visit, CONTINUE } = await import('unist-util-visit'); + const filePath = `/${path.relative(projectRoot, file.path)}` + .replace(/\/(index|README)\.mdx?$/i, '/') + .replace(/\.mdx?$/i, '/') + .replace(TdevRootRegex, '') + .replace(/^\/versioned_docs\/version-/, '/'); + slugCountMap.set(filePath, 1); + + insertDocRoot.run({ + id: page_id, + type: '', + page_id: page_id, + path: filePath, + position: 0 + }); + cleanupPage.run(filePath, page_id); + visit(root, (node, index, parent) => { + if (node.type === 'code') { + const idMatch = /id=([a-zA-Z0-9-_]+)/.exec(node.meta || ''); + if (!idMatch) { + return CONTINUE; + } + const docId = idMatch[1]; + const docType = options.persistedCodeType?.(node) ?? 'code'; + const res = insertDocRoot.run({ + id: docId, + type: docType, + page_id: page_id, + path: filePath, + position: slugCountMap.get(filePath)! + }); + if (res.changes > 0) { + slugCountMap.set(filePath, slugCountMap.get(filePath)! + 1); + } + return CONTINUE; + } + if ( + (node.type !== 'mdxJsxFlowElement' && node.type !== 'mdxJsxTextElement') || + !mdxJsxComponents.has(node.name as string) + ) { + return CONTINUE; + } + const config = mdxJsxComponents.get(node.name!)!; + const attr = node.attributes.find( + (a) => a.type === 'mdxJsxAttribute' && a.name === (config.attributeName || 'id') + ); + if (!attr || attr.type !== 'mdxJsxAttribute' || typeof attr.value !== 'string') { + return CONTINUE; + } + const docId = attr.value; + const docType = config.docTypeExtractor(node); + const res = insertDocRoot.run({ + id: docId, + type: docType, + page_id: page_id, + path: filePath, + position: slugCountMap.get(filePath)! + }); + if (res.changes > 0) { + slugCountMap.set(filePath, slugCountMap.get(filePath)! + 1); + } + return CONTINUE; + }); + if (isDev) { + scheduleExportDb(); + } + }; +}; + +export default remarkPlugin; diff --git a/packages/tdev/page-index/tsconfig.json b/packages/tdev/page-index/tsconfig.json new file mode 100644 index 000000000..ea56794f8 --- /dev/null +++ b/packages/tdev/page-index/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.json" +} diff --git a/packages/tdev/page-index/utils/db.ts b/packages/tdev/page-index/utils/db.ts new file mode 100644 index 000000000..e5c7d6da8 --- /dev/null +++ b/packages/tdev/page-index/utils/db.ts @@ -0,0 +1,27 @@ +import path from 'path'; +import Database from 'better-sqlite3'; +import { accessSync, mkdirSync } from 'fs'; +import { dbPath } from './options'; + +try { + accessSync(path.dirname(dbPath)); +} catch { + mkdirSync(path.dirname(dbPath), { recursive: true }); +} + +const db = new Database(dbPath, { fileMustExist: false }); +db.pragma('journal_mode = WAL'); + +const createDocRoots = db.prepare( + `CREATE TABLE IF NOT EXISTS document_roots ( + id TEXT NOT NULL, + type TEXT NOT NULL, + page_id TEXT NOT NULL, + path TEXT NOT NULL, + position INTEGER NOT NULL, + UNIQUE(id, path) + )` +); +createDocRoots.run(); + +export default db; diff --git a/packages/tdev/page-index/utils/exportDb.ts b/packages/tdev/page-index/utils/exportDb.ts new file mode 100644 index 000000000..985c41aec --- /dev/null +++ b/packages/tdev/page-index/utils/exportDb.ts @@ -0,0 +1,15 @@ +import db from './db'; +import { promises as fs } from 'fs'; +import { pageIndexPath } from './options'; +import { PageIndex } from '..'; + +const getDocumentRoots = db.prepare('SELECT * FROM document_roots ORDER BY path ASC, position ASC'); + +export const getContent = () => { + const documentRoots = getDocumentRoots.all() as PageIndex[]; + return { documentRoots }; +}; + +export const exportDB = async () => { + await fs.writeFile(pageIndexPath, JSON.stringify(getContent(), null, 2)); +}; diff --git a/packages/tdev/page-index/utils/options.ts b/packages/tdev/page-index/utils/options.ts new file mode 100644 index 000000000..61acd8b13 --- /dev/null +++ b/packages/tdev/page-index/utils/options.ts @@ -0,0 +1,25 @@ +require('dotenv').config(); +import path from 'path'; +import { PluginName } from '..'; +const cwd = process.cwd(); +export const tdevRoot = path + .relative(cwd, process.env.SITE_CONFIG_PATH ?? './siteConfig') + .split(path.sep) + .slice(0, -1) + .join(path.sep); + +// current file's directory: +export const pluginRootDir = path.dirname(new URL(import.meta.url).pathname); +export const assetDir = path.join(pluginRootDir, 'assets'); + +const projectRoot = process.cwd(); +const isDev = process.env.NODE_ENV !== 'production'; + +export const generatedDbDir = path.join(projectRoot, '.docusaurus', PluginName, 'default'); + +export const generatedDataDir = isDev + ? path.join(projectRoot, 'static/tdev-artifacts', PluginName) + : path.join(projectRoot, 'build/tdev-artifacts', PluginName); + +export const dbPath = path.join(generatedDbDir, 'index.db'); +export const pageIndexPath = path.join(generatedDataDir, 'pageIndex.json'); diff --git a/packages/tdev/pyodide-code/index.ts b/packages/tdev/pyodide-code/index.ts index 21a02e9ff..880670449 100644 --- a/packages/tdev/pyodide-code/index.ts +++ b/packages/tdev/pyodide-code/index.ts @@ -1,4 +1,3 @@ -import type { CurrentBundler, PluginConfig, PluginModule } from '@docusaurus/types'; import type PyodideStore from './stores/PyodideStore'; import PyodideCode from './models/PyodideCode'; export interface PyodideData { @@ -13,6 +12,6 @@ declare module '@tdev-api/document' { ['pyodide_code']: PyodideCode; } export interface ViewStoreTypeMapping { - ['pyodideStore']: PyodideStore; // placeholder to avoid empty interface error + ['pyodideStore']: PyodideStore; } } diff --git a/src/api/OfflineApi/index.ts b/src/api/OfflineApi/index.ts index d9690c8b0..1c743fe54 100644 --- a/src/api/OfflineApi/index.ts +++ b/src/api/OfflineApi/index.ts @@ -239,6 +239,7 @@ export default class OfflineApi { ) || [] }; }) as unknown as T; + log('-> get', url, documenRoots); return resolveResponse(documenRoots); } return resolveResponse([OfflineUser] as unknown as T); diff --git a/src/api/document.ts b/src/api/document.ts index b38a01558..5172792f6 100644 --- a/src/api/document.ts +++ b/src/api/document.ts @@ -18,6 +18,7 @@ import type DocumentStore from '@tdev-stores/DocumentStore'; import iDocumentContainer from '@tdev-models/iDocumentContainer'; import iViewStore from '@tdev-stores/ViewStores/iViewStore'; import Code from '@tdev-models/documents/Code'; +import { iTaskableDocument } from '@tdev-models/iTaskableDocument'; export enum Access { RO_DocumentRoot = 'RO_DocumentRoot', @@ -85,6 +86,7 @@ export interface TaskStateData { } export interface ProgressStateData { progress: number; + totalSteps: number; } export interface MdxCommentData { @@ -112,9 +114,12 @@ export interface ContainerTypeDataMapping { ['_container_placeholder_']: { name: string }; // placeholder to avoid empty interface error } -export interface TypeDataMapping extends ContainerTypeDataMapping { +export interface TaskableDocumentMapping { ['task_state']: TaskStateData; ['progress_state']: ProgressStateData; +} + +export interface TypeDataMapping extends TaskableDocumentMapping, ContainerTypeDataMapping { ['code']: CodeData; // TODO: rename to `code_version`? ['script_version']: ScriptVersionData; @@ -130,6 +135,7 @@ export interface TypeDataMapping extends ContainerTypeDataMapping { // Add more mappings as needed } export type ContainerType = keyof ContainerTypeDataMapping; +export type TaskableType = keyof TaskableDocumentMapping; type KeysWithCode = { [K in keyof T]: 'code' extends keyof T[K] ? K : never; @@ -141,9 +147,15 @@ export interface ContainerTypeModelMapping { ['_container_placeholder_']: iDocumentContainer; // placeholder to avoid empty interface error } -export interface TypeModelMapping extends ContainerTypeModelMapping { +export interface TaskableTypeModelMapping { ['task_state']: TaskState; ['progress_state']: ProgressState; +} +// enforce all TaskableTypeMpdels to extend iTaskableDocument: +type EnsureAllTaskable }> = T; +null as unknown as EnsureAllTaskable; + +export interface TypeModelMapping extends TaskableTypeModelMapping, ContainerTypeModelMapping { ['code']: Code; // TODO: rename to `code_version`? ['script_version']: ScriptVersion; @@ -165,6 +177,7 @@ export interface TypeModelMapping extends ContainerTypeModelMapping { } export type ContainerModelType = ContainerTypeModelMapping[ContainerType]; +export type TaskableModelType = TaskableTypeModelMapping[TaskableType]; export type DocumentType = keyof TypeModelMapping; export type DocumentModelType = TypeModelMapping[DocumentType]; diff --git a/src/components/Admin/EditUser/index.tsx b/src/components/Admin/EditUser/index.tsx index 34b072411..361d772ca 100644 --- a/src/components/Admin/EditUser/index.tsx +++ b/src/components/Admin/EditUser/index.tsx @@ -285,7 +285,7 @@ const EditUser = observer((props: Props) => { setSpinState('deleting'); authClient.admin.removeUser({ userId: user.id }).then( action((res) => { - if (res.data?.success) { + if (res?.data?.success) { userStore.removeFromStore(user.id); props.close(); } diff --git a/src/components/Answer/helper.answer.ts b/src/components/Answer/helper.answer.ts new file mode 100644 index 000000000..e1f66dd5c --- /dev/null +++ b/src/components/Answer/helper.answer.ts @@ -0,0 +1,16 @@ +import { DocumentType } from '@tdev-api/document'; + +export const getAnswerDocumentType = (type: string): DocumentType => { + switch (type) { + case 'text': + return 'quill_v2'; + case 'string': + return 'string'; + case 'state': + return 'task_state'; + case 'progress': + return 'progress_state'; + default: + return type as DocumentType; + } +}; diff --git a/src/components/Answer/index.tsx b/src/components/Answer/index.tsx index db1c4bdf7..bc05d3d7a 100644 --- a/src/components/Answer/index.tsx +++ b/src/components/Answer/index.tsx @@ -5,6 +5,7 @@ import String from '@tdev-components/documents/String'; import TaskState from '@tdev-components/documents/TaskState'; import ProgressState from '@tdev-components/documents/ProgressState'; import { DocumentType } from '@tdev-api/document'; +import { getAnswerDocumentType } from './helper.answer'; interface Props { id: string; @@ -21,8 +22,7 @@ type AnswerProps = Props & ); const Answer = observer((props: AnswerProps) => { - switch (props.type) { - case 'text': + switch (getAnswerDocumentType(props.type)) { case 'quill_v2': return )} />; case 'string': @@ -34,10 +34,8 @@ const Answer = observer((props: AnswerProps) => { } /> ); - case 'progress': case 'progress_state': return )} />; - case 'state': case 'task_state': return ; } diff --git a/src/components/DynamicValues/TemplateCode/index.tsx b/src/components/DynamicValues/TemplateCode/index.tsx index 0cee3e95d..7a188ee31 100644 --- a/src/components/DynamicValues/TemplateCode/index.tsx +++ b/src/components/DynamicValues/TemplateCode/index.tsx @@ -17,8 +17,8 @@ const TemplateCode = observer((props: Props) => { if (!current) { return null; } - const code = templateReplacer(props.code, pageStore.current?.dynamicValues); - const metastring = templateReplacer(props.codeAttributes?.meta, pageStore.current?.dynamicValues); + const code = templateReplacer(props.code, current.dynamicValues); + const metastring = templateReplacer(props.codeAttributes?.meta, current.dynamicValues); return ( {code} diff --git a/src/components/DynamicValues/Val/index.tsx b/src/components/DynamicValues/Val/index.tsx index ee0bdbbdd..77d769026 100644 --- a/src/components/DynamicValues/Val/index.tsx +++ b/src/components/DynamicValues/Val/index.tsx @@ -23,7 +23,7 @@ const Val = observer((props: Props) => { } let value = ''; if ('code' in props) { - value = templateReplacer(props.code, pageStore.current?.dynamicValues); + value = templateReplacer(props.code, current.dynamicValues); } else if ('name' in props) { value = current.dynamicValues.get(props.name) || `<${props.name}>`; } diff --git a/src/components/EditingOverview/EditingStateList.tsx b/src/components/EditingOverview/EditingStateList.tsx index 8ce024e16..1d1135dd6 100644 --- a/src/components/EditingOverview/EditingStateList.tsx +++ b/src/components/EditingOverview/EditingStateList.tsx @@ -6,9 +6,10 @@ import { useStore } from '@tdev-hooks/useStore'; import Icon from '@mdi/react'; import TaskState from '@tdev-models/documents/TaskState'; import ProgressState from '@tdev-models/documents/ProgressState'; +import type { iTaskableDocument } from '@tdev-models/iTaskableDocument'; interface Props { - editingStatus: (TaskState | ProgressState)[]; + editingStatus: iTaskableDocument[]; } const EditingStateList = observer((props: Props) => { diff --git a/src/components/EditingOverview/index.tsx b/src/components/EditingOverview/index.tsx index 71c20f324..bfdfff1b5 100644 --- a/src/components/EditingOverview/index.tsx +++ b/src/components/EditingOverview/index.tsx @@ -62,7 +62,7 @@ const EditingOverview = observer(() => { if (!isBrowser || !currentUser || !currentPage) { return null; } - const taskStates = currentPage.editingState.filter((ts) => RWAccess.has(ts.root?.permission)) || []; + const taskStates = currentPage.taskableDocuments.filter((ts) => RWAccess.has(ts.root?.permission)) || []; if (taskStates.length === 0) { return null; } @@ -78,7 +78,7 @@ const EditingOverview = observer(() => { } onOpen={() => { - currentPage.loadLinkedDocumentRoots(); + currentPage.loadLinkedDocumentRoots(true); }} contentStyle={{ position: 'fixed' diff --git a/src/components/MdxPage/index.tsx b/src/components/MdxPage/index.tsx index 80442f9f8..76051be13 100644 --- a/src/components/MdxPage/index.tsx +++ b/src/components/MdxPage/index.tsx @@ -40,7 +40,7 @@ const MdxPage = observer((props: Props) => { if (!current || !userStore.current?.hasElevatedAccess) { return; } - if (userStore.viewedUserId && userStore.viewedUserId !== userStore.current?.id) { + if (userStore.isUserSwitched) { current.loadLinkedDocumentRoots(); } }, [pageStore.current, userStore.viewedUserId]); diff --git a/src/components/documents/ProgressState/index.tsx b/src/components/documents/ProgressState/index.tsx index babbd11b1..40f724ffb 100644 --- a/src/components/documents/ProgressState/index.tsx +++ b/src/components/documents/ProgressState/index.tsx @@ -74,7 +74,7 @@ const ProgressState = observer((props: Props) => { React.useEffect(() => { if (doc?.root && pageStore.current && !doc.root.isDummy) { - pageStore.current.addDocumentRoot(doc); + pageStore.current.assertDocumentRoot(doc); } }, [doc, pageStore.current]); diff --git a/src/components/documents/TaskState/index.tsx b/src/components/documents/TaskState/index.tsx index 3db082718..1f53dcb3f 100644 --- a/src/components/documents/TaskState/index.tsx +++ b/src/components/documents/TaskState/index.tsx @@ -94,7 +94,7 @@ export const TaskStateComponent = observer((props: ComponentProps) => { React.useEffect(() => { if (doc.root && pageStore.current && !doc.root.isDummy) { - pageStore.current.addDocumentRoot(doc); + pageStore.current.assertDocumentRoot(doc); } }, [doc, pageStore.current]); diff --git a/src/hooks/useDocumentRoot.ts b/src/hooks/useDocumentRoot.ts index 4fedb5830..bbc534076 100644 --- a/src/hooks/useDocumentRoot.ts +++ b/src/hooks/useDocumentRoot.ts @@ -87,7 +87,7 @@ export const useDocumentRoot = ( } if (userStore.isUserSwitched) { documentRootStore.loadInNextBatch(id, meta, { - documentRoot: false, + documentRoot: 'addIfMissing', skipCreate: true }); } else { diff --git a/src/models/DocumentRoot.ts b/src/models/DocumentRoot.ts index 27f1f67ad..60630ff41 100644 --- a/src/models/DocumentRoot.ts +++ b/src/models/DocumentRoot.ts @@ -4,6 +4,7 @@ import { DocumentRootStore } from '@tdev-stores/DocumentRootStore'; import { Access, DocumentType, TypeDataMapping, TypeModelMapping } from '@tdev-api/document'; import { highestAccess, NoneAccess, ROAccess, RWAccess } from './helpers/accessPolicy'; import { isDummyId } from '@tdev-hooks/useDummyId'; +import { orderBy } from 'es-toolkit/array'; export abstract class TypeMeta { readonly pagePosition: number; @@ -101,6 +102,21 @@ class DocumentRoot { return this.store.root.permissionStore.groupPermissionsByDocumentRoot(this.id); } + @computed + get pages() { + return this.store.root.pageStore.pages.filter((p) => p.documentRootConfigs.has(this.id)); + } + + /** + * Map of page paths to their position in this document root + */ + @computed + get pagePositions() { + return new Map( + this.pages.map((p) => [p.path, p.documentRootConfigs.get(this.id)!.position]) + ); + } + @computed get permissions() { return [...this.store.currentUsersPermissions(this.id)]; @@ -165,9 +181,11 @@ class DocumentRoot { */ @computed get mainDocuments(): TypeModelMapping[T][] { - const docs = this.documents - .filter((d) => d.isMain) - .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime()) as TypeModelMapping[T][]; + const docs = orderBy( + this.documents.filter((d) => d.isMain), + ['createdAt', 'id'], + ['asc', 'asc'] + ) as TypeModelMapping[T][]; if (this.isDummy) { return docs; } diff --git a/src/models/Page.ts b/src/models/Page.ts index 0bf48ce1e..c72527a3d 100644 --- a/src/models/Page.ts +++ b/src/models/Page.ts @@ -2,29 +2,72 @@ * A Markdown or MDX Page */ -import { action, computed, observable, ObservableSet } from 'mobx'; -import { PageStore } from '@tdev-stores/PageStore'; -import TaskState from '@tdev-models/documents/TaskState'; +import { action, computed, observable, ObservableMap } from 'mobx'; +import { AUTO_GENERATED_PAGE_PREFIX, PageStore } from '@tdev-stores/PageStore'; import _ from 'es-toolkit/compat'; import iDocument from '@tdev-models/iDocument'; import StudentGroup from '@tdev-models/StudentGroup'; -import ProgressState from './documents/ProgressState'; +import { DocumentType } from '@tdev-api/document'; +import { iTaskableDocument } from './iTaskableDocument'; +import { mdiCheckCircleOutline, mdiSpeedometer, mdiSpeedometerMedium, mdiSpeedometerSlow } from '@mdi/js'; +import { IfmColors } from '@tdev-components/shared/Colors'; +interface PageConfig { + type: DocumentType; + position: number; +} export default class Page { readonly store: PageStore; readonly id: string; - refetchTimestamps: number[] = []; + readonly path: string; + initialLoadComplete = false; @observable.ref accessor _primaryStudentGroupName: string | undefined = undefined; @observable.ref accessor _activeStudentGroup: StudentGroup | undefined = undefined; - documentRootIds: ObservableSet; + documentRootConfigs: ObservableMap; dynamicValues = observable.map(); - constructor(id: string, store: PageStore) { + constructor(id: string, path: string, store: PageStore) { this.id = id; + this.path = path; this.store = store; - this.documentRootIds = observable.set([id]); + this.documentRootConfigs = observable.map( + this.isAutoGenerated ? [] : [[id, { type: 'mdx_comment', position: 0 }]], + { deep: false } + ); + } + + @computed + get isAutoGenerated() { + return this.id.startsWith(AUTO_GENERATED_PAGE_PREFIX); + } + + @computed + get isLandingpage() { + return this.store.sidebarVersions.some((version) => version.rootPaths.includes(this.path)); + } + + @computed + get parentPath() { + const parts = this.path.split('/').slice(0, -2); + while (parts.length > 1) { + const parentPath = `${parts.join('/')}/`; + const parentPage = this.store.pages.find((p) => p.path === parentPath); + if (parentPage) { + return parentPage.path; + } + if (this.store.sidebarVersions.some((v) => v.versionPath === parentPath)) { + return parentPath; + } + parts.splice(-1, 1); + } + return '/'; + } + + @computed + get subPages() { + return this.store.pages.filter((page) => page.parentPath === this.path); } @action @@ -37,32 +80,35 @@ export default class Page { } @action - addDocumentRoot(doc: iDocument) { - this.documentRootIds.add(doc.documentRootId); + assertDocumentRoot(doc: iDocument) { + if (process.env.NODE_ENV === 'production') { + return; + } + if (!this.documentRootConfigs.has(doc.documentRootId)) { + this.store.loadPageIndex(true); + } } - @computed - get documentRoots() { - return this.store.root.documentRootStore.documentRoots.filter( - (doc) => this.documentRootIds.has(doc.id) && !doc.isDummy - ); + @action + addDocumentRootConfig(id: string, config: PageConfig) { + this.documentRootConfigs.set(id, { type: config.type, position: config.position }); } @computed - get documents() { - return this.documentRoots - .flatMap((doc) => doc.firstMainDocument) - .filter((d) => d?.root?.meta.pagePosition) - .sort((a, b) => a!.root!.meta!.pagePosition - b!.root!.meta.pagePosition); + get documentRoots() { + return this.store.root.documentRootStore.documentRoots + .filter((doc) => this.documentRootConfigs.has(doc.id) && !doc.isDummy) + .sort((a, b) => { + const pA = this.documentRootConfigs.get(a.id)!.position; + const pB = this.documentRootConfigs.get(b.id)!.position; + return pA - pB; + }); } @computed - get editingState(): (TaskState | ProgressState)[] { + get documents() { return this.documentRoots .flatMap((doc) => doc.firstMainDocument) - .filter( - (d): d is TaskState | ProgressState => d instanceof TaskState || d instanceof ProgressState - ) .filter((d) => d?.root?.meta.pagePosition) .sort((a, b) => a!.root!.meta!.pagePosition - b!.root!.meta.pagePosition); } @@ -100,18 +146,95 @@ export default class Page { * loads all linked document roots (added by #addDocumentRoot) */ @action - loadLinkedDocumentRoots() { - this.refetchTimestamps.push(Date.now()); - return this.store.loadAllDocuments(this).catch((err) => { - const now = Date.now(); - const ts = this.refetchTimestamps.filter((ts) => now - ts < 10_000); - if (ts.length < 5) { - setTimeout(() => this.loadLinkedDocumentRoots(), 500); - } - console.warn('Failed to load linked document roots for page', this, err); + loadLinkedDocumentRoots(force = false) { + if (!force && !this.store.root.userStore.isUserSwitched) { + return; + } + if (!force && this.initialLoadComplete) { + return; + } + this.initialLoadComplete = true; + return this.store.loadAllDocuments(this); + } + + get TaskableDocuments() { + return this.store.root.componentStore.taskableDocuments; + } + + @computed + get taskableDocumentRootIds() { + return [...this.documentRootConfigs.keys()].filter((id) => { + const config = this.documentRootConfigs.get(id)!; + return this.TaskableDocuments.has(config.type); + }); + } + + @computed + get taskableDocuments(): iTaskableDocument[] { + const uid = this.store.root.userStore.viewedUserId; + if (!uid) { + return []; + } + return this.taskableDocumentRootIds.flatMap((rid) => { + return this.store.root.documentStore + .findByDocumentRoot(rid) + .filter( + (doc) => doc.authorId === uid && this.TaskableDocuments.has(doc.type) + ) as iTaskableDocument[]; }); } + @computed + get stepsOnPage(): number { + return this.taskableDocuments.length; + } + + @computed + get stepsOnDirectSubPages(): number { + return this.subPages.reduce((sum, page) => sum + page.stepsOnPage, 0); + } + + @computed + get totalSteps(): number { + return this.stepsOnPage + this.subPages.reduce((sum, page) => sum + page.totalSteps, 0); + } + + @computed + get progress(): number { + return ( + this.taskableDocuments.filter((d) => d.isDone).length + + this.subPages.reduce((sum, page) => sum + page.progress, 0) + ); + } + + @computed + get isDone(): boolean { + return this.progress > 0 && this.progress >= this.totalSteps; + } + + @computed + get editingIconState() { + if (this.isDone) { + return { path: mdiCheckCircleOutline, color: IfmColors.green }; + } + const level = this.progress / this.totalSteps; + if (this.progress === 0) { + return { path: mdiSpeedometerSlow, color: IfmColors.gray }; + } + if (level < 1 / 3) { + return { path: mdiSpeedometerSlow, color: IfmColors.red }; + } + if (level < 2 / 3) { + return { path: mdiSpeedometerMedium, color: IfmColors.orange }; + } + return { path: mdiSpeedometer, color: IfmColors.lightGreen }; + } + + @computed + get editingState(): iTaskableDocument[] { + return this.taskableDocuments; + } + @action toggleActiveStudentGroup(studentGroup: StudentGroup) { if (this._activeStudentGroup && this._activeStudentGroup.id === studentGroup.id) { @@ -141,17 +264,15 @@ export default class Page { @computed get editingStateByUsers() { return _.groupBy( - this.documentRoots - .flatMap((dr) => dr.allDocuments) - .filter( - (d): d is TaskState | ProgressState => - d instanceof TaskState || d instanceof ProgressState - ) - .filter((doc) => doc.isMain && doc.root?.meta.pagePosition) + this.taskableDocumentRootIds + .flatMap((rid) => { + return this.store.root.documentStore + .findByDocumentRoot(rid) + .filter((doc) => this.TaskableDocuments.has(doc.type)) as iTaskableDocument[]; + }) .filter((doc) => this.activeStudentGroup ? this.activeStudentGroup.userIds.has(doc.authorId) : true - ) - .sort((a, b) => a.root!.meta.pagePosition - b.root!.meta.pagePosition), + ), (doc) => doc.authorId ); } diff --git a/src/models/documents/DynamicDocumentRoots/index.ts b/src/models/documents/DynamicDocumentRoots/index.ts index a56cee11f..da808568c 100644 --- a/src/models/documents/DynamicDocumentRoots/index.ts +++ b/src/models/documents/DynamicDocumentRoots/index.ts @@ -70,7 +70,7 @@ class DynamicDocumentRoots extends iDocument<'dynami addedIds.forEach((id) => { this.store.root.documentRootStore.loadInNextBatch(id, this.defaultContainerMeta, { documentType: this.containerType, - documentRoot: true + documentRoot: 'replace' }); }); } @@ -191,7 +191,7 @@ class DynamicDocumentRoots extends iDocument<'dynami return [...this.documentRootIds].map((id) => { this.store.root.documentRootStore.loadInNextBatch(id, this.defaultContainerMeta, { documentType: this.containerType, - documentRoot: true + documentRoot: 'replace' }); }); } diff --git a/src/models/documents/ProgressState/index.ts b/src/models/documents/ProgressState/index.ts index 00c8ec12e..294713c9b 100644 --- a/src/models/documents/ProgressState/index.ts +++ b/src/models/documents/ProgressState/index.ts @@ -7,6 +7,7 @@ import { RWAccess } from '@tdev-models/helpers/accessPolicy'; import { mdiCheckCircleOutline, mdiSpeedometer, mdiSpeedometerMedium, mdiSpeedometerSlow } from '@mdi/js'; import { IfmColors } from '@tdev-components/shared/Colors'; import Step from './Step'; +import type { iTaskableDocument } from '@tdev-models/iTaskableDocument'; export interface MetaInit { readonly?: boolean; @@ -52,13 +53,15 @@ export class ModelMeta extends TypeMeta<'progress_state'> { get defaultData(): TypeDataMapping['progress_state'] { return { - progress: this.default + progress: this.default, + totalSteps: Math.max(this.default, 1) }; } } -class ProgressState extends iDocument<'progress_state'> { +class ProgressState extends iDocument<'progress_state'> implements iTaskableDocument<'progress_state'> { @observable accessor _progress: number = 0; + @observable accessor _totalSteps: number = 0; @observable accessor _viewedIndex: number | undefined = undefined; @observable accessor scrollTo: boolean = false; @observable accessor hoveredIndex: number | undefined = undefined; @@ -69,6 +72,7 @@ class ProgressState extends iDocument<'progress_state'> { constructor(props: DocumentProps<'progress_state'>, store: DocumentStore) { super(props, store); this._progress = props.data?.progress ?? 0; + this.setTotalSteps(Math.max(props.data?.totalSteps ?? 1, props.data?.progress ?? 0, 1), true); } get canStepBack(): boolean { @@ -91,19 +95,19 @@ class ProgressState extends iDocument<'progress_state'> { } @action - setData(data: TypeDataMapping['progress_state'], from: Source, updatedAt?: Date): void { + setData(data: Partial, from: Source, updatedAt?: Date): void { if (!RWAccess.has(this.root?.permission)) { return; } - const { progress } = data; + const { progress, totalSteps } = data; if (progress && !this.steps[progress]?.canToggleContent && this.progress + 1 !== progress) { return; } - if (!this.canStepBack && progress < this.progress) { - return; + if (progress !== undefined && (this.canStepBack || progress > this.progress)) { + this._progress = progress; } - if (data.progress !== undefined) { - this._progress = data.progress; + if (totalSteps !== undefined) { + this.setTotalSteps(totalSteps, true); } if (from === Source.LOCAL) { @@ -116,7 +120,8 @@ class ProgressState extends iDocument<'progress_state'> { get data(): TypeDataMapping['progress_state'] { return { - progress: this._progress + progress: this._progress, + totalSteps: this._totalSteps }; } @@ -150,21 +155,19 @@ class ProgressState extends iDocument<'progress_state'> { @computed get totalSteps(): number { - return ( - this.steps.length || - ( - (this.root?.documents || []).find( - (ps) => ps.type === 'progress_state' && ps?.steps.length > 0 - ) as ProgressState | undefined - )?.steps?.length || - 0 - ); + return Math.max(this._totalSteps, 1, this.progress); } @action - setTotalSteps(totalSteps: number) { - if (this.totalSteps !== totalSteps && totalSteps > 0) { - this.steps.replace(Array.from({ length: totalSteps }, (_, i) => new Step(i, this))); + setTotalSteps(totalSteps: number, skipSave: boolean = false) { + const skip = this._totalSteps !== 0 && this.totalSteps === totalSteps; + if (totalSteps < 1 || skip) { + return; + } + this._totalSteps = totalSteps; + this.steps.replace(Array.from({ length: totalSteps }, (_, i) => new Step(i, this))); + if (!skipSave) { + this.saveNow(); } } @@ -175,6 +178,9 @@ class ProgressState extends iDocument<'progress_state'> { @computed get isDone(): boolean { + if (!this.totalSteps) { + return false; + } return this.progress > 0 && this.progress >= this.totalSteps; } @@ -219,7 +225,7 @@ class ProgressState extends iDocument<'progress_state'> { @computed get progress(): number { - return this.derivedData.progress ?? this.meta.default; + return this._progress ?? this.meta.default; } @computed diff --git a/src/models/documents/TaskState.ts b/src/models/documents/TaskState.ts index c2a306e9f..ed3530112 100644 --- a/src/models/documents/TaskState.ts +++ b/src/models/documents/TaskState.ts @@ -12,6 +12,7 @@ import { TypeMeta } from '@tdev-models/DocumentRoot'; import { RWAccess } from '@tdev-models/helpers/accessPolicy'; import { mdiIcon } from '@tdev-components/documents/TaskState'; import { mdiColor } from '@tdev-components/EditingOverview'; +import type { iTaskableDocument } from '@tdev-models/iTaskableDocument'; export interface MetaInit { readonly?: boolean; @@ -39,7 +40,7 @@ export class TaskMeta extends TypeMeta<'task_state'> { } } -class TaskState extends iDocument<'task_state'> { +class TaskState extends iDocument<'task_state'> implements iTaskableDocument<'task_state'> { @observable accessor _taskState: StateType; @observable accessor scrollTo: boolean = false; constructor(props: DocumentProps<'task_state'>, store: DocumentStore) { @@ -78,6 +79,16 @@ class TaskState extends iDocument<'task_state'> { return this.taskState === 'checked'; } + @computed + get progress(): number { + return this.isDone ? 1 : 0; + } + + @computed + get totalSteps(): number { + return 1; + } + @computed get editingIconState() { return { diff --git a/src/models/iDocumentContainer.ts b/src/models/iDocumentContainer.ts index 8e3d2a3fd..bbb4c3dbc 100644 --- a/src/models/iDocumentContainer.ts +++ b/src/models/iDocumentContainer.ts @@ -80,9 +80,9 @@ abstract class iDocumentContainer extends iDocument< this.documentRootId, undefined /* meta is only needed when you want to create a "default" document */, { - userPermissions: false /* already present from this container */, - groupPermissions: false /* already present from this container */, - documentRoot: false /* already present from this container */, + userPermissions: false /* already present for this container */, + groupPermissions: false /* already present for this container */, + documentRoot: false /* already present for this container */, skipCreate: true, documents: true } diff --git a/src/models/iTaskableDocument.ts b/src/models/iTaskableDocument.ts new file mode 100644 index 000000000..189e56a77 --- /dev/null +++ b/src/models/iTaskableDocument.ts @@ -0,0 +1,10 @@ +import type { TaskableType } from '@tdev-api/document'; +import iDocument from './iDocument'; + +export interface iTaskableDocument extends iDocument { + isDone: boolean; + editingIconState: { path: string; color: string }; + progress: number; + totalSteps: number; + setScrollTo(scroll: boolean): void; +} diff --git a/src/plugins/remark-page/plugin.ts b/src/plugins/remark-page/plugin.ts index 709756319..18d797035 100644 --- a/src/plugins/remark-page/plugin.ts +++ b/src/plugins/remark-page/plugin.ts @@ -15,7 +15,7 @@ const plugin: Plugin = function plugin(): Transformer { if (!page_id) { return; } - visit(root, (node, index, parent) => { + visit(root, (node, idx, parent) => { /** add the MdxPage exactly once at the top of the document and exit */ if (root === node && !parent) { const loaderNode: MdxJsxFlowElement = { diff --git a/src/siteConfig/markdownPluginConfigs.ts b/src/siteConfig/markdownPluginConfigs.ts index 2c62430f8..f219e8a39 100644 --- a/src/siteConfig/markdownPluginConfigs.ts +++ b/src/siteConfig/markdownPluginConfigs.ts @@ -1,5 +1,6 @@ -import type { Node } from 'mdast'; +import type { Code, Node } from 'mdast'; import type { LeafDirective } from 'mdast-util-directive'; +import type { MdxJsxFlowElement } from 'mdast-util-mdx'; import strongPlugin, { transformer as captionVisitor } from '../plugins/remark-strong/plugin'; import deflistPlugin from '../plugins/remark-deflist/plugin'; import mdiPlugin from '../plugins/remark-mdi/plugin'; @@ -13,11 +14,15 @@ import linkAnnotationPlugin from '../plugins/remark-link-annotation/plugin'; import mediaPlugin from '../plugins/remark-media/plugin'; import detailsPlugin from '../plugins/remark-details/plugin'; import pagePlugin from '../plugins/remark-page/plugin'; +import pageIndexPlugin, { + type PluginOptions as PageIndexPluginOptions +} from '@tdev/page-index/remark-plugin'; import graphvizPlugin from '@tdev/remark-graphviz/remark-plugin'; import pdfPlugin from '@tdev/remark-pdf/remark-plugin'; import codeAsAttributePlugin from '../plugins/remark-code-as-attribute/plugin'; import commentPlugin from '../plugins/remark-comments/plugin'; import enumerateAnswersPlugin from '../plugins/remark-enumerate-components/plugin'; +import { getAnswerDocumentType } from '../components/Answer/helper.answer'; export const flexCardsPluginConfig = [ flexCardsPlugin, @@ -133,7 +138,75 @@ export const enumerateAnswersPluginConfig = [ export const pdfPluginConfig = pdfPlugin; -export const pagePluginConfig = pagePlugin; +export const pagePluginConfig = [pagePlugin, {}]; + +export const PageIndexPluginDefaultOptions: PageIndexPluginOptions = { + components: [ + { + name: 'Answer', + docTypeExtractor: (node) => { + return ( + getAnswerDocumentType( + node.attributes.find((a) => a.type === 'mdxJsxAttribute' && a.name === 'type') + ?.value as string + ) || 'unknown' + ); + } + }, + { + name: 'ProgressState', + docTypeExtractor: () => 'progress_state' + }, + { + name: 'TaskState', + docTypeExtractor: () => 'task_state' + }, + { + name: 'QuillV2', + docTypeExtractor: () => 'quill_v2' + }, + { + name: 'String', + docTypeExtractor: () => 'string' + }, + { + name: 'CmsText', + docTypeExtractor: () => 'cms_text' + }, + { + name: 'CmsCode', + docTypeExtractor: () => 'cms_text' + }, + { + name: 'Restricted', + docTypeExtractor: () => 'restricted' + }, + { + name: 'DynamicDocumentRoots', + docTypeExtractor: () => 'dynamic_document_roots' + } + ], + persistedCodeType: (node: Code) => { + if (node.lang === 'html') { + return 'script'; + } + const liveLangMatch = /(live_[a-zA-Z0-9-_]+)/.exec(node.meta || ''); + const liveCode = liveLangMatch ? liveLangMatch[1] : null; + + switch (liveCode) { + case 'live_py': + case 'live_bry': + // legacy name, TODO. should be 'brython_code'? + return 'script'; + case 'live_pyo': + return 'pyodide_code'; + default: + return 'code'; + } + } +}; +export const pageIndexPluginConfig = [pageIndexPlugin, PageIndexPluginDefaultOptions]; + export const graphvizPluginConfig = graphvizPlugin; export const commentPluginConfig = [ @@ -173,6 +246,7 @@ export const recommendedRemarkPlugins = [ enumerateAnswersPluginConfig, pdfPluginConfig, pagePluginConfig, + pageIndexPluginConfig, commentPluginConfig, linkAnnotationPluginConfig, codeAsAttributePluginConfig diff --git a/src/stores/ComponentStore.ts b/src/stores/ComponentStore.ts index 590702442..8a4729b88 100644 --- a/src/stores/ComponentStore.ts +++ b/src/stores/ComponentStore.ts @@ -2,9 +2,11 @@ import { CodeMeta } from '@tdev-models/documents/Code'; import { RootStore } from './rootStore'; import { type CodeType, + type DocumentType, TypeModelMapping, type ContainerType, - type ContainerTypeModelMapping + type ContainerTypeModelMapping, + TaskableType } from '@tdev-api/document'; import { ContainerMeta } from '@tdev-models/documents/DynamicDocumentRoots/ContainerMeta'; import iCodeMeta, { MetaInit } from '@tdev-models/documents/iCode/iCodeMeta'; @@ -49,6 +51,7 @@ class ComponentStore { readonly root: RootStore; components = new Map(); editorComponents = new Map(); + taskableDocuments = new Set(['task_state', 'progress_state']); constructor(root: RootStore) { this.root = root; @@ -62,6 +65,18 @@ class ComponentStore { this.components.set(type, component as ContainerComponent); } + registerTaskableDocumentType(type: TaskableType) { + this.taskableDocuments.add(type); + } + + @computed + get defaultMeta() { + return [ + ...[...this.components.values()].map((comp) => comp.defaultMeta), + ...[...this.editorComponents.values()].map((comp) => comp.createModelMeta({})) + ]; + } + @computed get registeredContainerTypes(): ContainerType[] { return [...this.components.keys()]; diff --git a/src/stores/DocumentRootStore.ts b/src/stores/DocumentRootStore.ts index 1dca366b4..1c5a38daa 100644 --- a/src/stores/DocumentRootStore.ts +++ b/src/stores/DocumentRootStore.ts @@ -18,6 +18,15 @@ import { DocumentType } from '@tdev-api/document'; import _ from 'es-toolkit/compat'; import User from '@tdev-models/User'; import { NoneAccess } from '@tdev-models/helpers/accessPolicy'; +import { ModelMeta as ProgressStateMeta } from '@tdev-models/documents/ProgressState'; +import { CodeMeta } from '@tdev-models/documents/Code'; +import { ModelMeta as MdxCommentMeta } from '@tdev-models/documents/MdxComment'; +import { ModelMeta as RestrictedMeta } from '@tdev-models/documents/Restricted'; +import { ModelMeta as SolutionMeta } from '@tdev-models/documents/Solution'; +import { ModelMeta as StringMeta } from '@tdev-models/documents/String'; +import { TaskMeta as TaskStateMeta } from '@tdev-models/documents/TaskState'; + +import { CmsTextMeta } from '@tdev-models/documents/CmsText'; type LoadConfig = { /** if true, user permissions will be loaded @@ -30,11 +39,14 @@ type LoadConfig = { */ groupPermissions?: boolean; /** - * if true, the document root will be created and when already exists, - * it will replace the existing one - * @default true + * @option 'replace': the document root will be created and when already exists, + * it will replace the existing one. + * @option 'addIfMissing': when the document root does not exist in the mobx store, it will + * be added. But no new document root will be created on the api. + * @option false: the document root will not be loaded. + * @default 'replace' */ - documentRoot?: boolean; + documentRoot?: 'replace' | 'addIfMissing' | boolean; /** * if a document root should not be created when it is not found, * set `skipCreate` to true @@ -59,6 +71,17 @@ type BatchedMeta = { access: Partial; }; +const DefaultMeta: TypeMeta[] = [ + new CodeMeta({}), + new MdxCommentMeta({}), + new RestrictedMeta({}), + new SolutionMeta({}), + new StringMeta({}), + new TaskStateMeta({}), + new ProgressStateMeta({}), + new CmsTextMeta({}) +]; + export class DocumentRootStore extends iStore { readonly root: RootStore; documentRoots = observable.array>([]); @@ -75,6 +98,11 @@ export class DocumentRootStore extends iStore { return this.root.sessionStore.isLoggedIn; } + @computed + get defaultMetas(): TypeMeta[] { + return [...DefaultMeta, ...this.root.componentStore.defaultMeta]; + } + @action addDocumentRoot( documentRoot: DocumentRoot, @@ -123,7 +151,7 @@ export class DocumentRootStore extends iStore { this.queued.set(id, { meta: meta, load: { - documentRoot: true, + documentRoot: 'replace', groupPermissions: true, userPermissions: true, skipCreate: false, @@ -170,13 +198,13 @@ export class DocumentRootStore extends iStore { this.loadQueued(); console.log('Postponing', postponed.length, 'document roots for next batch'); } - const current = new Map(batch); + const currentBatch = new Map(batch); /** * if the user is not logged in, we can't load the documents * so we just mark all queued documents as loaded */ if (!this.root.sessionStore.isLoggedIn) { - [...current.keys()].forEach((id) => { + [...currentBatch.keys()].forEach((id) => { const dummyModel = this.find(id); if (dummyModel && dummyModel.isDummy) { dummyModel.setLoaded(); @@ -188,16 +216,16 @@ export class DocumentRootStore extends iStore { /** * load all queued documents */ - const rootIds = [...current.keys()].sort(); + const rootIds = [...currentBatch.keys()].sort(); const idConfigs: [DocumentType | undefined, string[]][] = []; - const rootIdsWithDocs = rootIds.filter((id) => !current.get(id)!.load.documentType); + const rootIdsWithDocs = rootIds.filter((id) => !currentBatch.get(id)!.load.documentType); if (rootIdsWithDocs.length > 0) { idConfigs.push([undefined, rootIdsWithDocs]); } rootIds - .filter((id) => current.get(id)!.load.documentType) + .filter((id) => currentBatch.get(id)!.load.documentType) .reduce((acc, id) => { - const type = current.get(id)!.load.documentType; + const type = currentBatch.get(id)!.load.documentType; const idx = acc.findIndex((item) => item[0] === type); if (idx < 0) { acc.push([type, [id]]); @@ -220,21 +248,21 @@ export class DocumentRootStore extends iStore { ).then((results) => results.flatMap((r) => r.data)); runInAction(() => { models.forEach((data) => { - const config = current.get(data.id); + const config = currentBatch.get(data.id); if (!config) { return; } this.addApiResultToStore(data, config); - current.delete(data.id); + currentBatch.delete(data.id); }); }); if (!isUserSwitched) { // create all missing root documents const created = await Promise.all( - [...current.keys()] - .filter((id) => !this.find(id)?.isLoaded && !current.get(id)!.load.skipCreate) + [...currentBatch.keys()] + .filter((id) => !this.find(id)?.isLoaded && !currentBatch.get(id)!.load.skipCreate) .map((id) => { - const config = current.get(id); + const config = currentBatch.get(id); if (config && config.meta) { return this.create(id, config.meta, config.access).catch(() => { // queue it up for loading later - the model was probably generated in the mean time? @@ -258,12 +286,12 @@ export class DocumentRootStore extends iStore { created .filter((docRoot) => !!docRoot) .forEach((docRoot) => { - current.delete(docRoot.id); + currentBatch.delete(docRoot.id); }); } // mark all remaining roots as loaded runInAction(() => { - [...current.keys()].forEach((id) => { + [...currentBatch.keys()].forEach((id) => { const dummyModel = this.find(id); if (dummyModel && dummyModel.isDummy) { dummyModel.setLoaded(); @@ -275,17 +303,27 @@ export class DocumentRootStore extends iStore { @action addApiResultToStore(data: ApiDocumentRoot, config: Omit) { - if (config.load.documentRoot && !config.meta) { + if (config.load.documentRoot === 'replace' && !config.meta) { return; } - const documentRoot = config.load.documentRoot - ? new DocumentRoot(data, config.meta!, this) - : this.find(data.id); + const defaultType = data.documents[0]?.type; + const meta = + config.meta || + (this.find(data.id)?.meta as TypeMeta) || + (defaultType ? this.defaultMetas.find((m) => m.type === defaultType) : undefined); + const documentRoot = + config.load.documentRoot && meta ? new DocumentRoot(data, meta, this) : this.find(data.id); if (!documentRoot) { return; } if (config.load.documentRoot) { - this.addDocumentRoot(documentRoot, { cleanup: true, deep: false }); + if (config.load.documentRoot === 'addIfMissing') { + if (!this.find(data.id)) { + this.addDocumentRoot(documentRoot); + } + } else { + this.addDocumentRoot(documentRoot, { cleanup: true, deep: false }); + } } if (config.load.groupPermissions) { data.groupPermissions.forEach((gp) => { @@ -391,7 +429,7 @@ export class DocumentRootStore extends iStore { @action reload(documentRoot: DocumentRoot) { this.loadInNextBatch(documentRoot.id, documentRoot.meta, { - documentRoot: true, + documentRoot: 'replace', documents: true, groupPermissions: true, userPermissions: true diff --git a/src/stores/PageStore.ts b/src/stores/PageStore.ts index 9ea2e63c5..18e50e2ab 100644 --- a/src/stores/PageStore.ts +++ b/src/stores/PageStore.ts @@ -4,6 +4,41 @@ import { RootStore } from '@tdev-stores/rootStore'; import Page from '@tdev-models/Page'; import { computedFn } from 'mobx-utils'; import { allDocuments as apiAllDocuments, DocumentType } from '@tdev-api/document'; +import type { GlobalPluginData } from '@docusaurus/plugin-content-docs/client'; +import siteConfig from '@generated/docusaurus.config'; +import { PageIndex } from '@tdev/page-index'; +import { groupBy } from 'es-toolkit/array'; +import globalData from '@generated/globalData'; +const ensureTrailingSlash = (str: string) => { + return str.endsWith('/') ? str : `${str}/`; +}; +export const AUTO_GENERATED_PAGE_PREFIX = '__auto_generated__'; +export const SidebarVersions = ( + globalData['docusaurus-plugin-content-docs'].default as GlobalPluginData +).versions.map((version) => { + const versionPath = ensureTrailingSlash(version.path); + const slashCount = version.path.split('/').length + 1; + const rdocs = version.docs.filter( + (doc) => + doc.path.startsWith(version.path) && doc.path.replace(/\/$/, '').split('/').length === slashCount + ); + return { + name: version.name, + rootPaths: rdocs.map((doc) => ensureTrailingSlash(doc.path)), + versionPath: versionPath + }; +}); + +const getPathTree = (pagePath: string) => { + const parts = pagePath.split('/').filter((p) => p.length > 0); + return parts.map((_, idx) => { + return `/${parts.slice(0, idx + 1).join('/')}/`; + }); +}; + +interface PagesIndex { + documentRoots: PageIndex[]; +} export class PageStore extends iStore { readonly root: RootStore; @@ -13,11 +48,73 @@ export class PageStore extends iStore { @observable accessor currentPageId: string | undefined = undefined; @observable accessor runningTurtleScriptId: string | undefined = undefined; + @observable.ref accessor _pageIndex: PageIndex[] = []; + constructor(store: RootStore) { super(); this.root = store; } + get sidebarVersions() { + return SidebarVersions; + } + + @computed + get landingPages() { + return this.pages.filter((page) => page.isLandingpage); + } + + @action + loadPageIndex(force: boolean = false) { + if (!force && this._pageIndex.length > 0) { + return Promise.resolve(); + } + return fetch(`${siteConfig.baseUrl}tdev-artifacts/page-progress-state/pageIndex.json`) + .then((res) => { + return res.json() as Promise; + }) + .then( + action((data) => { + const grouped = groupBy(data.documentRoots, (dr) => `${dr.path}::${dr.page_id}`); + const pages = Object.values(grouped).map((docRootDescriptors) => { + const doc = docRootDescriptors[0]!; + const page = new Page(doc.page_id, doc.path, this); + docRootDescriptors + .filter((doc) => doc.position > 0) + .forEach((d) => page.addDocumentRootConfig(d.id, d)); + return page; + }); + const addedPaths = new Set(pages.map((p) => p.path)); + const fullTree = new Set(pages.flatMap((p) => getPathTree(p.path))); + const missingPaths = Array.from(fullTree).filter((p) => !addedPaths.has(p)); + missingPaths.forEach((path) => { + const page = new Page(`${AUTO_GENERATED_PAGE_PREFIX}${path}`, path, this); + pages.push(page); + }); + this.pages.replace(pages); + this._pageIndex = data.documentRoots; + }) + ) + .then(() => { + this.loadTaskableDocuments(); + }) + .catch((err) => { + console.error('Failed to load page index', err); + }); + } + + @action + loadTaskableDocuments() { + this.pages.forEach((page) => { + page.taskableDocumentRootIds.forEach((id) => { + this.root.documentRootStore.loadInNextBatch(id, undefined, { + skipCreate: true, + documentRoot: 'addIfMissing' + }); + }); + }); + } + find = computedFn( function (this: PageStore, id?: string): Page | undefined { if (!id) { @@ -33,19 +130,13 @@ export class PageStore extends iStore { return this.find(this.currentPageId); } - @action - addToStore(page: Page) { - const old = this.find(page.id); - if (old) { - this.pages.remove(old); - } - this.pages.push(page); - } - @action addIfNotPresent(id: string, makeCurrent?: boolean) { if (!this.find(id)) { - const page = new Page(id, this); + if (process.env.NODE_ENV !== 'production') { + this.loadPageIndex(true); + } + const page = new Page(id, window.location.pathname, this); this.pages.push(page); } if (makeCurrent) { @@ -61,7 +152,7 @@ export class PageStore extends iStore { @action loadAllDocuments(page: Page) { return this.withAbortController(`load-all-${page.id}`, (sig) => { - return apiAllDocuments([...page.documentRootIds], sig.signal).then(({ data }) => { + return apiAllDocuments([...page.documentRootConfigs.keys()], sig.signal).then(({ data }) => { return transaction(() => { return data.map((doc) => { return this.root.documentStore.addToStore(doc); diff --git a/src/stores/SocketDataStore.ts b/src/stores/SocketDataStore.ts index dd61f4ea6..f7371789b 100644 --- a/src/stores/SocketDataStore.ts +++ b/src/stores/SocketDataStore.ts @@ -260,7 +260,7 @@ export class SocketDataStore extends iStore<'ping'> { this.root.documentRootStore.addApiResultToStore(docRoot, { meta: current.meta, load: { - documentRoot: true, + documentRoot: 'replace', documents: NoneAccess.has( current.permission ) /** only load the documents, when the current permission is None */, diff --git a/src/stores/rootStore.ts b/src/stores/rootStore.ts index c44cf01c7..821a873f9 100644 --- a/src/stores/rootStore.ts +++ b/src/stores/rootStore.ts @@ -51,6 +51,7 @@ export class RootStore { @action load(userId: string) { + this.pageStore.loadPageIndex(); this.sessionStore.setCurrentUserId(userId); this.sessionStore.setIsLoggedIn(!!userId); this.userStore.loadCurrent().then((user) => { @@ -60,6 +61,7 @@ export class RootStore { /** * load stores */ + this.userStore.load(); this.studentGroupStore.load(); this.cmsStore.initialize(); diff --git a/src/theme/DocItem/Content/index.tsx b/src/theme/DocItem/Content/index.tsx index 12295d8d1..b8cb753cb 100644 --- a/src/theme/DocItem/Content/index.tsx +++ b/src/theme/DocItem/Content/index.tsx @@ -21,11 +21,7 @@ const ContentWrapper = observer((props: Props): React.ReactNode => { }; }, [pageStore.current, location.pathname]); - return ( - <> - - - ); + return ; }); export default ContentWrapper; diff --git a/src/theme/DocSidebarItem/index.tsx b/src/theme/DocSidebarItem/index.tsx new file mode 100644 index 000000000..29c85cbe5 --- /dev/null +++ b/src/theme/DocSidebarItem/index.tsx @@ -0,0 +1,34 @@ +import React, { type ReactNode } from 'react'; +import DocSidebarItem from '@theme-original/DocSidebarItem'; +import type DocSidebarItemType from '@theme/DocSidebarItem'; +import type { WrapperProps } from '@docusaurus/types'; +import { observer } from 'mobx-react-lite'; +import { useStore } from '@tdev-hooks/useStore'; +import clsx from 'clsx'; +import styles from './styles.module.scss'; +import TaskableState from '@tdev/page-index/components/TaskableState'; +const ensureTrailingSlash = (path?: string) => { + if (!path) { + return ''; + } + return path.endsWith('/') ? path : path + '/'; +}; + +type Props = WrapperProps; +const DocSidebarItemWrapper = observer((props: Props): ReactNode => { + const pageStore = useStore('pageStore'); + const path = props.item.type !== 'html' ? ensureTrailingSlash(props.item.href) : undefined; + const page = pageStore.pages.find((p) => p.path === path); + return ( +
+ + +
+ ); +}); + +export default DocSidebarItemWrapper; diff --git a/src/theme/DocSidebarItem/styles.module.scss b/src/theme/DocSidebarItem/styles.module.scss new file mode 100644 index 000000000..2df830a7a --- /dev/null +++ b/src/theme/DocSidebarItem/styles.module.scss @@ -0,0 +1,20 @@ +.item { + position: relative; + .icon { + position: absolute; + right: 0.5em; + top: 0; + z-index: 0; + &.category { + right: 3em; + } + } + &:has(> .icon:hover) { + > li:has(+ .icon:hover) { + > a, + > div { + background: var(--ifm-menu-color-background-hover); + } + } + } +} diff --git a/src/theme/Root.tsx b/src/theme/Root.tsx index c7be59b4f..3fba443d5 100644 --- a/src/theme/Root.tsx +++ b/src/theme/Root.tsx @@ -11,6 +11,10 @@ import LoggedOutOverlay from '@tdev-components/LoggedOutOverlay'; import { authClient } from '@tdev/auth-client'; import { getOfflineUser } from '@tdev-api/OfflineApi'; import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'; +import type { GlobalPluginData } from '@docusaurus/plugin-content-docs/client'; +import { usePluginData } from '@docusaurus/useGlobalData'; +import { Hashery } from 'hashery'; +const hasher = new Hashery(); const { OFFLINE_API, SENTRY_DSN } = siteConfig.customFields as { SENTRY_DSN?: string; OFFLINE_API?: boolean | 'memory' | 'indexedDB'; @@ -175,6 +179,45 @@ const FullscreenHandler = observer(() => { }, []); return null; }); +let devHash: string | null = null; +const DevGlobalDataTracker = observer(() => { + if (process.env.NODE_ENV === 'production') { + return null; + } + const pageStore = useStore('pageStore'); + const global = usePluginData('docusaurus-plugin-content-docs', 'default') as GlobalPluginData; + React.useEffect(() => { + const controller = new AbortController(); + const check = async () => { + const pIndex = await fetch( + `${siteConfig.baseUrl}tdev-artifacts/page-progress-state/pageIndex.json`, + { signal: controller.signal } + ) + .then((res) => res.json()) + .catch(() => null); + if (controller.signal.aborted || !pIndex) { + return; + } + const hash = await hasher.toHash(pIndex); + if (controller.signal.aborted) { + return; + } + if (!devHash) { + devHash = hash; + return; + } + if (devHash !== hash) { + devHash = hash; + pageStore.loadPageIndex(true); + } + }; + check(); + return () => { + controller.abort(); + }; + }, [global]); + return null; +}); function Root({ children }: { children: React.ReactNode }) { const { siteConfig } = useDocusaurusContext(); @@ -202,6 +245,7 @@ function Root({ children }: { children: React.ReactNode }) { )} {SENTRY_DSN && } + {children} diff --git a/static/tdev-artifacts/.gitignore b/static/tdev-artifacts/.gitignore new file mode 100644 index 000000000..94a2dd146 --- /dev/null +++ b/static/tdev-artifacts/.gitignore @@ -0,0 +1 @@ +*.json \ No newline at end of file diff --git a/tdev-website/docs/gallery/persistable-documents/answer/progress-state/index.mdx b/tdev-website/docs/gallery/persistable-documents/answer/progress-state/index.mdx index 6b4d7091a..0d66574c1 100644 --- a/tdev-website/docs/gallery/persistable-documents/answer/progress-state/index.mdx +++ b/tdev-website/docs/gallery/persistable-documents/answer/progress-state/index.mdx @@ -51,7 +51,7 @@ Mit der Option `confirm` müssen die einzelnen Schritte bestätigt werden. ````md import ProgressState from '@tdev-components/documents/ProgressState'; - + 1. Hello Bello and Bella 2. World **bla** __foo__ @@ -63,7 +63,7 @@ import ProgressState from '@tdev-components/documents/ProgressState'; ```` - + 1. Hello Bello and Bella 2. World **bla** __foo__ @@ -83,7 +83,7 @@ Mit `float='right'` fährt der Bestätigungs-Button nach Rechts aus. Praktisch, ````md import ProgressState from '@tdev-components/documents/ProgressState'; - + 1. Hello Bello and Bella 2. World **bla** __foo__ @@ -95,7 +95,7 @@ import ProgressState from '@tdev-components/documents/ProgressState'; ```` - + 1. Hello Bello and Bella 2. World **bla** __foo__ diff --git a/tdev-website/docs/gallery/persistable-documents/answer/task-state/index.mdx b/tdev-website/docs/gallery/persistable-documents/answer/task-state/index.mdx index 87a07e9d3..32bcab97f 100644 --- a/tdev-website/docs/gallery/persistable-documents/answer/task-state/index.mdx +++ b/tdev-website/docs/gallery/persistable-documents/answer/task-state/index.mdx @@ -69,7 +69,8 @@ TaskState kann nicht verändert werden, wenn `readonly` gesetzt wurde. ```md ``` - - + + diff --git a/updateSync/packageDocsSync/actions.ts b/updateSync/packageDocsSync/actions.ts index b477d973c..e0c1182e0 100644 --- a/updateSync/packageDocsSync/actions.ts +++ b/updateSync/packageDocsSync/actions.ts @@ -27,6 +27,9 @@ const DEFAULT_README_CONFIG: Omit 'README.mdx', '_category_.yml', '_category_.json', + 'assets/', + 'images/', + 'img/', 'assets/**', 'images/**', 'img/**' diff --git a/yarn.lock b/yarn.lock index 372f5d1db..b4e17c3cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -157,34 +157,34 @@ "@babel/highlight" "^7.25.7" picocolors "^1.0.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.28.6.tgz#72499312ec58b1e2245ba4a4f550c132be4982f7" - integrity sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== dependencies: "@babel/helper-validator-identifier" "^7.28.5" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.6.tgz#103f466803fa0f059e82ccac271475470570d74c" - integrity sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg== +"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" + integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== "@babel/core@^7.18.5", "@babel/core@^7.21.3", "@babel/core@^7.25.9": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.6.tgz#531bf883a1126e53501ba46eb3bb414047af507f" - integrity sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw== + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" + integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/generator" "^7.28.6" + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-module-transforms" "^7.28.6" "@babel/helpers" "^7.28.6" - "@babel/parser" "^7.28.6" + "@babel/parser" "^7.29.0" "@babel/template" "^7.28.6" - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -192,13 +192,13 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.6.tgz#48dcc65d98fcc8626a48f72b62e263d25fc3c3f1" - integrity sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw== +"@babel/generator@^7.25.9", "@babel/generator@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.0.tgz#4cba5a76b3c71d8be31761b03329d5dc7768447f" + integrity sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ== dependencies: - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" @@ -267,7 +267,7 @@ "@babel/traverse" "^7.28.5" "@babel/types" "^7.28.5" -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.27.1", "@babel/helper-module-imports@^7.28.6": +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== @@ -275,7 +275,7 @@ "@babel/traverse" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3", "@babel/helper-module-transforms@^7.28.6": +"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== @@ -364,12 +364,12 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.25.4", "@babel/parser@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.6.tgz#f01a8885b7fa1e56dd8a155130226cd698ef13fd" - integrity sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ== +"@babel/parser@^7.25.4", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" + integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== dependencies: - "@babel/types" "^7.28.6" + "@babel/types" "^7.29.0" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": version "7.28.5" @@ -465,14 +465,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-async-generator-functions@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz#80cb86d3eaa2102e18ae90dd05ab87bdcad3877d" - integrity sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA== +"@babel/plugin-transform-async-generator-functions@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz#63ed829820298f0bf143d5a4a68fb8c06ffd742f" + integrity sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.28.6" + "@babel/traverse" "^7.29.0" "@babel/plugin-transform-async-to-generator@^7.28.6": version "7.28.6" @@ -556,10 +556,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz#e0c59ba54f1655dd682f2edf5f101b5910a8f6f3" - integrity sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz#8014b8a6cfd0e7b92762724443bf0d2400f26df1" + integrity sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" @@ -654,15 +654,15 @@ "@babel/helper-module-transforms" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" -"@babel/plugin-transform-modules-systemjs@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz#7439e592a92d7670dfcb95d0cbc04bd3e64801d2" - integrity sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew== +"@babel/plugin-transform-modules-systemjs@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz#e458a95a17807c415924106a3ff188a3b8dee964" + integrity sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ== dependencies: - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.5" + "@babel/traverse" "^7.29.0" "@babel/plugin-transform-modules-umd@^7.27.1": version "7.27.1" @@ -672,13 +672,13 @@ "@babel/helper-module-transforms" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz#f32b8f7818d8fc0cc46ee20a8ef75f071af976e1" - integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== +"@babel/plugin-transform-named-capturing-groups-regex@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz#a26cd51e09c4718588fc4cce1c5d1c0152102d6a" + integrity sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.28.5" + "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-new-target@^7.27.1": version "7.27.1" @@ -806,10 +806,10 @@ "@babel/helper-annotate-as-pure" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-regenerator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz#6ca2ed5b76cff87980f96eaacfc2ce833e8e7a1b" - integrity sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw== +"@babel/plugin-transform-regenerator@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz#dec237cec1b93330876d6da9992c4abd42c9d18b" + integrity sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog== dependencies: "@babel/helper-plugin-utils" "^7.28.6" @@ -829,12 +829,12 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-runtime@^7.25.9": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz#ae3e21fbefe2831ebac04dfa6b463691696afe17" - integrity sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w== + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz#a5fded13cc656700804bfd6e5ebd7fffd5266803" + integrity sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-imports" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" babel-plugin-polyfill-corejs2 "^0.4.14" babel-plugin-polyfill-corejs3 "^0.13.0" babel-plugin-polyfill-regenerator "^0.6.5" @@ -919,11 +919,11 @@ "@babel/helper-plugin-utils" "^7.28.6" "@babel/preset-env@^7.20.2", "@babel/preset-env@^7.25.9": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.6.tgz#b4586bb59d8c61be6c58997f4912e7ea6bd17178" - integrity sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw== + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.0.tgz#c55db400c515a303662faaefd2d87e796efa08d0" + integrity sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w== dependencies: - "@babel/compat-data" "^7.28.6" + "@babel/compat-data" "^7.29.0" "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-validator-option" "^7.27.1" @@ -937,7 +937,7 @@ "@babel/plugin-syntax-import-attributes" "^7.28.6" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.28.6" + "@babel/plugin-transform-async-generator-functions" "^7.29.0" "@babel/plugin-transform-async-to-generator" "^7.28.6" "@babel/plugin-transform-block-scoped-functions" "^7.27.1" "@babel/plugin-transform-block-scoping" "^7.28.6" @@ -948,7 +948,7 @@ "@babel/plugin-transform-destructuring" "^7.28.5" "@babel/plugin-transform-dotall-regex" "^7.28.6" "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.28.6" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.0" "@babel/plugin-transform-dynamic-import" "^7.27.1" "@babel/plugin-transform-explicit-resource-management" "^7.28.6" "@babel/plugin-transform-exponentiation-operator" "^7.28.6" @@ -961,9 +961,9 @@ "@babel/plugin-transform-member-expression-literals" "^7.27.1" "@babel/plugin-transform-modules-amd" "^7.27.1" "@babel/plugin-transform-modules-commonjs" "^7.28.6" - "@babel/plugin-transform-modules-systemjs" "^7.28.5" + "@babel/plugin-transform-modules-systemjs" "^7.29.0" "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.0" "@babel/plugin-transform-new-target" "^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.28.6" "@babel/plugin-transform-numeric-separator" "^7.28.6" @@ -975,7 +975,7 @@ "@babel/plugin-transform-private-methods" "^7.28.6" "@babel/plugin-transform-private-property-in-object" "^7.28.6" "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.28.6" + "@babel/plugin-transform-regenerator" "^7.29.0" "@babel/plugin-transform-regexp-modifiers" "^7.28.6" "@babel/plugin-transform-reserved-words" "^7.27.1" "@babel/plugin-transform-shorthand-properties" "^7.27.1" @@ -988,10 +988,10 @@ "@babel/plugin-transform-unicode-regex" "^7.27.1" "@babel/plugin-transform-unicode-sets-regex" "^7.28.6" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - core-js-compat "^3.43.0" + babel-plugin-polyfill-corejs2 "^0.4.15" + babel-plugin-polyfill-corejs3 "^0.14.0" + babel-plugin-polyfill-regenerator "^0.6.6" + core-js-compat "^3.48.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1027,11 +1027,11 @@ "@babel/plugin-transform-typescript" "^7.28.5" "@babel/runtime-corejs3@^7.25.9": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz#f1e4a0da50f4856ceec1bb51c83f8ed0b202ed12" - integrity sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw== + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz#56cd28ec515364482afeb880b476936a702461b9" + integrity sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA== dependencies: - core-js-pure "^3.43.0" + core-js-pure "^3.48.0" "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.25.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": version "7.28.6" @@ -1047,23 +1047,23 @@ "@babel/parser" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/traverse@^7.25.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.6.tgz#871ddc79a80599a5030c53b1cc48cbe3a5583c2e" - integrity sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/generator" "^7.28.6" + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.6" + "@babel/parser" "^7.29.0" "@babel/template" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/types" "^7.29.0" debug "^4.3.1" -"@babel/types@^7.21.3", "@babel/types@^7.25.4", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.4.4": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.6.tgz#c3e9377f1b155005bcc4c46020e7e394e13089df" - integrity sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg== +"@babel/types@^7.21.3", "@babel/types@^7.25.4", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.4.4": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" @@ -1073,27 +1073,32 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@better-auth/core@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@better-auth/core/-/core-1.4.17.tgz#975fd8cb2029835f50958cde28154d8fa62dc367" - integrity sha512-WSaEQDdUO6B1CzAmissN6j0lx9fM9lcslEYzlApB5UzFaBeAOHNUONTdglSyUs6/idiZBoRvt0t/qMXCgIU8ug== +"@better-auth/core@1.4.18": + version "1.4.18" + resolved "https://registry.yarnpkg.com/@better-auth/core/-/core-1.4.18.tgz#d424ccbf2e7754b7a7581c841dd64811b2700dd4" + integrity sha512-q+awYgC7nkLEBdx2sW0iJjkzgSHlIxGnOpsN1r/O1+a4m7osJNHtfK2mKJSL1I+GfNyIlxJF8WvD/NLuYMpmcg== dependencies: "@standard-schema/spec" "^1.0.0" zod "^4.3.5" -"@better-auth/telemetry@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@better-auth/telemetry/-/telemetry-1.4.17.tgz#1929f103807fb9010342cbcaf32e73a45a267830" - integrity sha512-R1BC4e/bNjQbXu7lG6ubpgmsPj7IMqky5DvMlzAtnAJWJhh99pMh/n6w5gOHa0cqDZgEAuj75IPTxv+q3YiInA== +"@better-auth/telemetry@1.4.18": + version "1.4.18" + resolved "https://registry.yarnpkg.com/@better-auth/telemetry/-/telemetry-1.4.18.tgz#9290df1b20c5376cb6820ae6704f682d7c676a4e" + integrity sha512-e5rDF8S4j3Um/0LIVATL2in9dL4lfO2fr2v1Wio4qTMRbfxqnUDTa+6SZtwdeJrbc4O+a3c+IyIpjG9Q/6GpfQ== dependencies: "@better-auth/utils" "0.3.0" "@better-fetch/fetch" "1.1.21" -"@better-auth/utils@0.3.0", "@better-auth/utils@^0.3.0": +"@better-auth/utils@0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@better-auth/utils/-/utils-0.3.0.tgz#066c5ce82bf393421547dd887b14a6899310003d" integrity sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw== +"@better-auth/utils@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@better-auth/utils/-/utils-0.3.1.tgz#ffa4de03b9aef33df536fd19f36a24fa9c9942c0" + integrity sha512-+CGp4UmZSUrHHnpHhLPYu6cV+wSUSvVbZbNykxhUDocpVNTo9uFFxw/NqJlh1iC4wQ9HKKWGCKuZ5wUgS0v6Kg== + "@better-fetch/fetch@1.1.21", "@better-fetch/fetch@^1.1.4": version "1.1.21" resolved "https://registry.yarnpkg.com/@better-fetch/fetch/-/fetch-1.1.21.tgz#2b4990e73c46b0ae5e66b247083610ff8c37bddc" @@ -1110,9 +1115,9 @@ integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== "@braintree/sanitize-url@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz#15e19737d946559289b915e5dad3b4c28407735e" - integrity sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw== + version "7.1.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz#ca2035b0fefe956a8676ff0c69af73e605fcd81f" + integrity sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA== "@chevrotain/cst-dts-gen@11.0.3": version "11.0.3" @@ -1450,9 +1455,9 @@ "@codemirror/language" "^6.0.0" "@codemirror/lint@^6.0.0": - version "6.9.2" - resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.9.2.tgz#09ed0aedec13381c9e36e1ac5d126027740c3ef4" - integrity sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ== + version "6.9.3" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.9.3.tgz#eee48c9d60ea63582eee1ebd6b4ae65102eb8782" + integrity sha512-y3YkYhdnhjDBAe0VIA0c4wVoFOvnp8CnAvfLqi0TqotIv92wIlAAP7HELOpLBsKwjAX6W92rSflA6an/2zBvXw== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.35.0" @@ -1486,9 +1491,9 @@ "@marijn/find-cluster-break" "^1.0.0" "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0", "@codemirror/view@^6.7.1": - version "6.39.11" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.39.11.tgz#200aebef2074bfbbb7a3d5f0644c1b560d876b39" - integrity sha512-bWdeR8gWM87l4DB/kYSF9A+dVackzDb/V56Tq7QVrQ7rn86W0rgZFtlL3g3pem6AeGcb9NQNoy3ao4WpW4h5tQ== + version "6.39.12" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.39.12.tgz#c61961d7107b44bd233647fc9e33d96309d627c9" + integrity sha512-f+/VsHVn/kOA9lltk/GFzuYwVVAKmOnNjxbrhkk3tPHntFqjWeI2TbIXx006YkBkqC10wZ4NsnWXCQiFPeAISQ== dependencies: "@codemirror/state" "^6.5.0" crelt "^1.0.6" @@ -2936,34 +2941,34 @@ lodash.isundefined "^3.0.1" lodash.uniq "^4.5.0" -"@floating-ui/core@^1.7.3": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.3.tgz#462d722f001e23e46d86fd2bd0d21b7693ccb8b7" - integrity sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w== +"@floating-ui/core@^1.7.4": + version "1.7.4" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.4.tgz#4a006a6e01565c0f87ba222c317b056a2cffd2f4" + integrity sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg== dependencies: "@floating-ui/utils" "^0.2.10" -"@floating-ui/dom@^1.0.1", "@floating-ui/dom@^1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.4.tgz#ee667549998745c9c3e3e84683b909c31d6c9a77" - integrity sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA== +"@floating-ui/dom@^1.0.1", "@floating-ui/dom@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.5.tgz#60bfc83a4d1275b2a90db76bf42ca2a5f2c231c2" + integrity sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg== dependencies: - "@floating-ui/core" "^1.7.3" + "@floating-ui/core" "^1.7.4" "@floating-ui/utils" "^0.2.10" -"@floating-ui/react-dom@^2.0.0", "@floating-ui/react-dom@^2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.6.tgz#189f681043c1400561f62972f461b93f01bf2231" - integrity sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw== +"@floating-ui/react-dom@^2.0.0", "@floating-ui/react-dom@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.7.tgz#529475cc16ee4976ba3387968117e773d9aa703e" + integrity sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg== dependencies: - "@floating-ui/dom" "^1.7.4" + "@floating-ui/dom" "^1.7.5" "@floating-ui/react@^0.27.8": - version "0.27.16" - resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.27.16.tgz#6e485b5270b7a3296fdc4d0faf2ac9abf955a2f7" - integrity sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g== + version "0.27.17" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.27.17.tgz#f1d74e01cf10016825a4167b3b0139a4d5af118a" + integrity sha512-LGVZKHwmWGg6MRHjLLgsfyaX2y2aCNgnD1zT/E6B+/h+vxg+nIJUqHPAlTzsHDyqdgEpJ1Np5kxWuFEErXzoGg== dependencies: - "@floating-ui/react-dom" "^2.1.6" + "@floating-ui/react-dom" "^2.1.7" "@floating-ui/utils" "^0.2.10" tabbable "^6.0.0" @@ -2985,9 +2990,9 @@ "@hapi/hoek" "^9.0.0" "@hpcc-js/wasm-graphviz@^1.7.0": - version "1.20.0" - resolved "https://registry.yarnpkg.com/@hpcc-js/wasm-graphviz/-/wasm-graphviz-1.20.0.tgz#26fcdc5742ef9331b81caa3c59df7a8c02bd2294" - integrity sha512-29nwKSkoKoXBHPqvimS2OmWUTojU148CFMszANgWvVOh76jbRFh1ZxXAiSzVWbtQcYFcb39T8tDEAXtUjyVlMA== + version "1.21.0" + resolved "https://registry.yarnpkg.com/@hpcc-js/wasm-graphviz/-/wasm-graphviz-1.21.0.tgz#1b7dd35aae704cf063a0b2089ea5b63efc5b798a" + integrity sha512-BQ06v/foSTxtwUyIdJYRz+S++/fHQuPVsFmX+pI3G66cANi1mQvsgToaN5deZ6ALEDUHsfHVMYlowNiimoET5g== "@iconify/types@^2.0.0": version "2.0.0" @@ -3457,9 +3462,9 @@ lexical "0.35.0" "@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.2.1", "@lezer/common@^1.3.0", "@lezer/common@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.5.0.tgz#db227b596260189b67ba286387d9dc81fb07c70b" - integrity sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.5.1.tgz#6e8c114ff5d36a41148e146a253734d3bb8807d3" + integrity sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw== "@lezer/cpp@^1.0.0": version "1.1.5" @@ -3532,9 +3537,9 @@ "@lezer/lr" "^1.0.0" "@lezer/lr@^1.0.0", "@lezer/lr@^1.1.0", "@lezer/lr@^1.3.0", "@lezer/lr@^1.3.1", "@lezer/lr@^1.3.3", "@lezer/lr@^1.4.0": - version "1.4.7" - resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.7.tgz#01a38556652bf73ffbf3af4a88b91e4c056cc6ee" - integrity sha512-wNIFWdSUfX9Jc6ePMzxSPVgTVB4EOfDIwLQLWASyiUdHKaMsiilj9bYiGkGQCKVodd0x6bgQCV207PILGFCF9Q== + version "1.4.8" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.8.tgz#333de9bc9346057323ff09beb4cda47ccc38a498" + integrity sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA== dependencies: "@lezer/common" "^1.0.0" @@ -3592,9 +3597,9 @@ "@lezer/lr" "^1.0.0" "@lezer/yaml@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@lezer/yaml/-/yaml-1.0.3.tgz#b23770ab42b390056da6b187d861b998fd60b1ff" - integrity sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@lezer/yaml/-/yaml-1.0.4.tgz#66a622188f1984a71d34506759b5807699043589" + integrity sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw== dependencies: "@lezer/common" "^1.2.0" "@lezer/highlight" "^1.0.0" @@ -3737,48 +3742,48 @@ dependencies: langium "3.3.1" -"@module-federation/error-codes@0.21.4": - version "0.21.4" - resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.21.4.tgz#037c15c641e67c2c5465d2d3f442724395691f55" - integrity sha512-ClpL5MereWNXh+EgDjz7w4RrC1JlisQTvXDa1gLxpviHafzNDfdViVmuhi9xXVuj+EYo8KU70Y999KHhk9424Q== +"@module-federation/error-codes@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.22.0.tgz#31ccc990dc240d73912ba7bd001f7e35ac751992" + integrity sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug== -"@module-federation/runtime-core@0.21.4": - version "0.21.4" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.21.4.tgz#3254ee1be28255f9b115fe02d462672ae0f66584" - integrity sha512-SGpmoOLGNxZofpTOk6Lxb2ewaoz5wMi93AFYuuJB04HTVcngEK+baNeUZ2D/xewrqNIJoMY6f5maUjVfIIBPUA== +"@module-federation/runtime-core@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz#7321ec792bb7d1d22bee6162ec43564b769d2a3c" + integrity sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA== dependencies: - "@module-federation/error-codes" "0.21.4" - "@module-federation/sdk" "0.21.4" + "@module-federation/error-codes" "0.22.0" + "@module-federation/sdk" "0.22.0" -"@module-federation/runtime-tools@0.21.4": - version "0.21.4" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-0.21.4.tgz#dbaf6d0a21ee72fc343f0d9dc50eeabb5fd9f5ba" - integrity sha512-RzFKaL0DIjSmkn76KZRfzfB6dD07cvID84950jlNQgdyoQFUGkqD80L6rIpVCJTY/R7LzR3aQjHnoqmq4JPo3w== +"@module-federation/runtime-tools@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz#36f2a7cb267af208a9d1a237fe9a71b4bf31431e" + integrity sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA== dependencies: - "@module-federation/runtime" "0.21.4" - "@module-federation/webpack-bundler-runtime" "0.21.4" + "@module-federation/runtime" "0.22.0" + "@module-federation/webpack-bundler-runtime" "0.22.0" -"@module-federation/runtime@0.21.4": - version "0.21.4" - resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.21.4.tgz#f07cc2dd9786b26d3af5440793693b953a818b97" - integrity sha512-wgvGqryurVEvkicufJmTG0ZehynCeNLklv8kIk5BLIsWYSddZAE+xe4xov1kgH5fIJQAoQNkRauFFjVNlHoAkA== +"@module-federation/runtime@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.22.0.tgz#f789c9ef40d846d110711c8221ecc0ad938d43d8" + integrity sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA== dependencies: - "@module-federation/error-codes" "0.21.4" - "@module-federation/runtime-core" "0.21.4" - "@module-federation/sdk" "0.21.4" + "@module-federation/error-codes" "0.22.0" + "@module-federation/runtime-core" "0.22.0" + "@module-federation/sdk" "0.22.0" -"@module-federation/sdk@0.21.4": - version "0.21.4" - resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.21.4.tgz#4b4757b527d9a2758d01c5aadec7963348f43385" - integrity sha512-tzvhOh/oAfX++6zCDDxuvioHY4Jurf8vcfoCbKFxusjmyKr32GPbwFDazUP+OPhYCc3dvaa9oWU6X/qpUBLfJw== +"@module-federation/sdk@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.22.0.tgz#6ad4c1de85a900c3c80ff26cb87cce253e3a2770" + integrity sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g== -"@module-federation/webpack-bundler-runtime@0.21.4": - version "0.21.4" - resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.4.tgz#d8651c5bb8e7bc999300f32f0e11358a6acd0501" - integrity sha512-dusmR3uPnQh9u9ChQo3M+GLOuGFthfvnh7WitF/a1eoeTfRmXqnMFsXtZCUK+f/uXf+64874Zj/bhAgbBcVHZA== +"@module-federation/webpack-bundler-runtime@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz#dcbe8f972d722fe278e6a7c21988d4bee53d401d" + integrity sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA== dependencies: - "@module-federation/runtime" "0.21.4" - "@module-federation/sdk" "0.21.4" + "@module-federation/runtime" "0.22.0" + "@module-federation/sdk" "0.22.0" "@napi-rs/wasm-runtime@1.0.7": version "1.0.7" @@ -4817,130 +4822,130 @@ resolved "https://registry.yarnpkg.com/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz#c06dac2d011f36d61259aa1c6df4f0d5e28bc55e" integrity sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg== -"@rollup/rollup-android-arm-eabi@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz#067cfcd81f1c1bfd92aefe3ad5ef1523549d5052" - integrity sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw== - -"@rollup/rollup-android-arm64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz#85e39a44034d7d4e4fee2a1616f0bddb85a80517" - integrity sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q== - -"@rollup/rollup-darwin-arm64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz#17d92fe98f2cc277b91101eb1528b7c0b6c00c54" - integrity sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w== - -"@rollup/rollup-darwin-x64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz#89ae6c66b1451609bd1f297da9384463f628437d" - integrity sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g== - -"@rollup/rollup-freebsd-arm64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz#cdbdb9947b26e76c188a31238c10639347413628" - integrity sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ== - -"@rollup/rollup-freebsd-x64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz#9b1458d07b6e040be16ee36d308a2c9520f7f7cc" - integrity sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg== - -"@rollup/rollup-linux-arm-gnueabihf@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz#1d50ded7c965d5f125f5832c971ad5b287befef7" - integrity sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A== - -"@rollup/rollup-linux-arm-musleabihf@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz#53597e319b7e65990d3bc2a5048097384814c179" - integrity sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw== - -"@rollup/rollup-linux-arm64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz#597002909dec198ca4bdccb25f043d32db3d6283" - integrity sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ== - -"@rollup/rollup-linux-arm64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz#286f0e0f799545ce288bdc5a7c777261fcba3d54" - integrity sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA== - -"@rollup/rollup-linux-loong64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz#1fab07fa1a4f8d3697735b996517f1bae0ba101b" - integrity sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg== - -"@rollup/rollup-linux-loong64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz#efc2cb143d6c067f95205482afb177f78ed9ea3d" - integrity sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA== - -"@rollup/rollup-linux-ppc64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz#e8de8bd3463f96b92b7dfb7f151fd80ffe8a937c" - integrity sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw== - -"@rollup/rollup-linux-ppc64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz#8c508fe28a239da83b3a9da75bcf093186e064b4" - integrity sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg== - -"@rollup/rollup-linux-riscv64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz#ff6d51976e0830732880770a9e18553136b8d92b" - integrity sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew== - -"@rollup/rollup-linux-riscv64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz#325fb35eefc7e81d75478318f0deee1e4a111493" - integrity sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ== - -"@rollup/rollup-linux-s390x-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz#37410fabb5d3ba4ad34abcfbe9ba9b6288413f30" - integrity sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ== - -"@rollup/rollup-linux-x64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz#8ef907a53b2042068fc03fcc6a641e2b02276eca" - integrity sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw== - -"@rollup/rollup-linux-x64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz#61b9ba09ea219e0174b3f35a6ad2afc94bdd5662" - integrity sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA== - -"@rollup/rollup-openbsd-x64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz#fc4e54133134c1787d0b016ffdd5aeb22a5effd3" - integrity sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA== - -"@rollup/rollup-openharmony-arm64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz#959ae225b1eeea0cc5b7c9f88e4834330fb6cd09" - integrity sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ== - -"@rollup/rollup-win32-arm64-msvc@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz#842acd38869fa1cbdbc240c76c67a86f93444c27" - integrity sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing== - -"@rollup/rollup-win32-ia32-msvc@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz#7ab654def4042df44cb29f8ed9d5044e850c66d5" - integrity sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg== - -"@rollup/rollup-win32-x64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz#7426cdec1b01d2382ffd5cda83cbdd1c8efb3ca6" - integrity sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ== - -"@rollup/rollup-win32-x64-msvc@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz#9eec0212732a432c71bde0350bc40b673d15b2db" - integrity sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g== +"@rollup/rollup-android-arm-eabi@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz#add5e608d4e7be55bc3ca3d962490b8b1890e088" + integrity sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg== + +"@rollup/rollup-android-arm64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz#10bd0382b73592beee6e9800a69401a29da625c4" + integrity sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w== + +"@rollup/rollup-darwin-arm64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz#1e99ab04c0b8c619dd7bbde725ba2b87b55bfd81" + integrity sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg== + +"@rollup/rollup-darwin-x64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz#69e741aeb2839d2e8f0da2ce7a33d8bd23632423" + integrity sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w== + +"@rollup/rollup-freebsd-arm64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz#3736c232a999c7bef7131355d83ebdf9651a0839" + integrity sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug== + +"@rollup/rollup-freebsd-x64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz#227dcb8f466684070169942bd3998901c9bfc065" + integrity sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz#ba004b30df31b724f99ce66e7128248bea17cb0c" + integrity sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw== + +"@rollup/rollup-linux-arm-musleabihf@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz#6929f3e07be6b6da5991f63c6b68b3e473d0a65a" + integrity sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw== + +"@rollup/rollup-linux-arm64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz#06e89fd4a25d21fe5575d60b6f913c0e65297bfa" + integrity sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g== + +"@rollup/rollup-linux-arm64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz#fddabf395b90990d5194038e6cd8c00156ed8ac0" + integrity sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q== + +"@rollup/rollup-linux-loong64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz#04c10bb764bbf09a3c1bd90432e92f58d6603c36" + integrity sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA== + +"@rollup/rollup-linux-loong64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz#f2450361790de80581d8687ea19142d8a4de5c0f" + integrity sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw== + +"@rollup/rollup-linux-ppc64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz#0474f4667259e407eee1a6d38e29041b708f6a30" + integrity sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w== + +"@rollup/rollup-linux-ppc64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz#9f32074819eeb1ddbe51f50ea9dcd61a6745ec33" + integrity sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw== + +"@rollup/rollup-linux-riscv64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz#3fdb9d4b1e29fb6b6a6da9f15654d42eb77b99b2" + integrity sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A== + +"@rollup/rollup-linux-riscv64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz#1de780d64e6be0e3e8762035c22e0d8ea68df8ed" + integrity sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw== + +"@rollup/rollup-linux-s390x-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz#1da022ffd2d9e9f0fd8344ea49e113001fbcac64" + integrity sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg== + +"@rollup/rollup-linux-x64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz#78c16eef9520bd10e1ea7a112593bb58e2842622" + integrity sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg== + +"@rollup/rollup-linux-x64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz#a7598591b4d9af96cb3167b50a5bf1e02dfea06c" + integrity sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw== + +"@rollup/rollup-openbsd-x64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz#c51d48c07cd6c466560e5bed934aec688ce02614" + integrity sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw== + +"@rollup/rollup-openharmony-arm64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz#f09921d0b2a0b60afbf3586d2a7a7f208ba6df17" + integrity sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ== + +"@rollup/rollup-win32-arm64-msvc@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz#08d491717135376e4a99529821c94ecd433d5b36" + integrity sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ== + +"@rollup/rollup-win32-ia32-msvc@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz#b0c12aac1104a8b8f26a5e0098e5facbb3e3964a" + integrity sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew== + +"@rollup/rollup-win32-x64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz#b9cccef26f5e6fdc013bf3c0911a3c77428509d0" + integrity sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ== + +"@rollup/rollup-win32-x64-msvc@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz#a03348e7b559c792b6277cc58874b89ef46e1e72" + integrity sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA== "@rsdoctor/client@0.4.13": version "0.4.13" @@ -5057,81 +5062,81 @@ fs-extra "^11.1.1" lodash "^4.17.21" -"@rspack/binding-darwin-arm64@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.6.5.tgz#c038886401ec0ef3128e3b4a9ddb7efee063c469" - integrity sha512-DaAJTlaenqZIqFqIYcitn0SzjJ7WpC9234JpiSDZdRyXii9qJJiToVwxSPY/CmkrP0201+aC4pzN4tI9T0Ummw== - -"@rspack/binding-darwin-x64@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.6.5.tgz#a1527e656ac9cdace2f42bbec40a70d266e40d27" - integrity sha512-fPVfp7W/GMbHayb5hbefiMI30JxlsqPexOItHGtufHmTCrNne1aHmApspyUZIUUxG36oDRHuGPnfh+IQbHR6+g== - -"@rspack/binding-linux-arm64-gnu@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.6.5.tgz#c0fb16502861ec85d8faac5a9a44e5e738d294a9" - integrity sha512-K68YDoV2e4s+nlrKZxgF0HehiiRwOAGgZFUwJNRMZ7MUrTGMNlPTJlM+bNdaCjDb6GFxBVFcNwIa1sU+0tF1zg== - -"@rspack/binding-linux-arm64-musl@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.6.5.tgz#3d0104855c63be4092e39c523f008c94533411f9" - integrity sha512-JPtxFBOq7RRmBIwpdGIStf8iyCILehDsjQtEB0Kkhtm7TsAkVGwtC41GLcNuPxcQBKqNDmD8cy3yLYhXadH2CQ== - -"@rspack/binding-linux-x64-gnu@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.6.5.tgz#635f6fb87d3aa79dbe356a3fb33f6e046e7e25ed" - integrity sha512-oh4ZNo2HtizZ/E6UK3BEONu20h8VVBw9GAXuWmo1u22cJSihzg+WfRNCMjRDil82LqSsyAgBwnU+dEjEYGKyAA== - -"@rspack/binding-linux-x64-musl@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.6.5.tgz#fa085de6b6446866f151944c8082b23dbcf178c8" - integrity sha512-8Xebp5bvPJqjifpkFEAX5nUvoU2JvbMU3gwAkEovRRuvooCXnVT2tqkUBjkR3AhivAGgAxAr9hRzUUz/6QWt3Q== - -"@rspack/binding-wasm32-wasi@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.6.5.tgz#501ce81b09de2720c725fc87c3a87edfa0e370ad" - integrity sha512-oINZNqzTxM+9dSUOjAORodHXYoJYzXvpaHI2U6ecEmoWaBCs+x3V3Po8DhpNFBwotB+jGlcoVhEHjpg5uaO6pw== +"@rspack/binding-darwin-arm64@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.5.tgz#5adad9b17d4a29c62d239bfac653b71e7d755b61" + integrity sha512-dg2/IrF+g498NUt654N8LFWfIiUsHlTankWieE1S3GWEQM6jweeRbNuu1Py1nWIUsjR2yQtv7ziia7c9Q8UTaQ== + +"@rspack/binding-darwin-x64@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.5.tgz#bfa31b9bdcea5238babf0914289ad4227a4eabdb" + integrity sha512-RQJX4boQJUu3lo1yiN344+y8W6iSO08ARXIZqFPg66coOgfX1lhsXQSRJGQEQG4PAcYuC0GmrYFzErliifbc1Q== + +"@rspack/binding-linux-arm64-gnu@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.5.tgz#2f3705a444911602619f48c2aac7a92205b9de8a" + integrity sha512-R7CO1crkJQLIQpJQzf+6DMHjvcvH/VxsatS5CG897IIT2aAfBeQuQAO+ERJko/UwSZam2K8Rxjuopcu5A2jsTQ== + +"@rspack/binding-linux-arm64-musl@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.5.tgz#ac94268f78ffd818465a2ee1d626f5d349190f39" + integrity sha512-moDVFD06ISZi+wCIjJLzQSr8WO8paViacSHk+rOKQxwKI96cPoC4JFkz0+ibT2uks4i2ecs4Op48orsoguiXxw== + +"@rspack/binding-linux-x64-gnu@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.5.tgz#69414ac99b79240d0148331bfd6579c3c669b85e" + integrity sha512-LGtdsdhtA5IxdMptj2NDVEbuZF4aqM99BVn3saHp92A4Fn20mW9UtQ+19PtaOFdbQBUN1GcP+cosrJ1wY56hOg== + +"@rspack/binding-linux-x64-musl@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.5.tgz#a5b14a9a90e2400b85b2d13e83f379974356bd83" + integrity sha512-V1HTvuj0XF/e4Xnixqf7FrxdCtTkYqn26EKwH7ExUFuVBh4SsLGr29EK5SOXBG0xdy5TSEUokMup7cuONPb3Hw== + +"@rspack/binding-wasm32-wasi@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.5.tgz#4addba33fbc8ba100cf7c963e804c9659dd87618" + integrity sha512-rGNHrk2QuLFfwOTib91skuLh2aMYeTP4lgM4zanDhtt95DLDlwioETFY7FzY1WmS+Z3qnEyrgQIRp8osy0NKTw== dependencies: "@napi-rs/wasm-runtime" "1.0.7" -"@rspack/binding-win32-arm64-msvc@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.6.5.tgz#f78c90691d5da8628da02de6e972cc8de517ae60" - integrity sha512-UUmep2ayuZxWPdrzkrzAFxVgYUWTB82pa9bkAGyeDO9SNkz8vTpdtbDaTvAzjFb8Pn+ErktDEDBKT57FLjxwxQ== - -"@rspack/binding-win32-ia32-msvc@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.6.5.tgz#4666a868eca3d24d00405e64baa708f2c8a556b2" - integrity sha512-7nx+mMimpmCMstcW7nsyToXy5TK7N+YGPu2W/oioX7qv9ZCuJGTddjzLS84wN8DVrNIirg4mcxpBsmOQMZeHQA== - -"@rspack/binding-win32-x64-msvc@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.6.5.tgz#98a4196c38e9d220cde9a5047f99cf503ca46d6e" - integrity sha512-pzO7rYFu6f6stgSccolZHiXGTTwKrIGHHNV1ALY1xPRmQEdbHcbMwadeaG99JL2lRLve9iNI+Z9Pr3oDVRN46g== - -"@rspack/binding@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/binding/-/binding-1.6.5.tgz#78afbe3c9303edc39d96b57d32f33dca6a3fd75a" - integrity sha512-FzYsr5vdjaVQIlDTxZFlISOQGxl/4grpF2BeiNy60Fpw9eeADeXk55DVacbXPqpiz7Doj6cyhEyMszQOvihrqQ== +"@rspack/binding-win32-arm64-msvc@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.5.tgz#a2bac95fa670738dd2850bac0f56fc490a2b6aad" + integrity sha512-eLyD9URS9M2pYa7sPICu9S0OuDAMnnGfuqrZYlrtgnEOEgimaG39gX6ENLwHvlNulaVMMFTNbDnS/2MELZ7r7g== + +"@rspack/binding-win32-ia32-msvc@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.5.tgz#7256001750794aa3b14815cc460c43d621ac4bdb" + integrity sha512-ZT4eC8hHWzweA6S4Tl2c/z/fvhbU7Wnh+l76z+qmDy8wuA8uNrHgIb1mHLPli/wsqcjmIy8rDO9gkIBitg5I+w== + +"@rspack/binding-win32-x64-msvc@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.5.tgz#eb8bafd9011139478ce79bd4924e3c0e481a2faa" + integrity sha512-a2j10QS3dZvW+gdu+FXteAkChxsK2g9BRUOmpt13w22LkiGrdmOkMQyDWRgJNxUGJTlqIUqtXxs72nTTlzo2Sw== + +"@rspack/binding@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/binding/-/binding-1.7.5.tgz#33efebda1596936193a6a9a8cdfb289b03c4cbba" + integrity sha512-tlZfDHfGu765FBL3hIyjrr8slJZztv7rCM+KIczZS7UlJQDl1+WsDKUe/+E1Fw9SlmorLWK40+y3rLTHmMrN2A== optionalDependencies: - "@rspack/binding-darwin-arm64" "1.6.5" - "@rspack/binding-darwin-x64" "1.6.5" - "@rspack/binding-linux-arm64-gnu" "1.6.5" - "@rspack/binding-linux-arm64-musl" "1.6.5" - "@rspack/binding-linux-x64-gnu" "1.6.5" - "@rspack/binding-linux-x64-musl" "1.6.5" - "@rspack/binding-wasm32-wasi" "1.6.5" - "@rspack/binding-win32-arm64-msvc" "1.6.5" - "@rspack/binding-win32-ia32-msvc" "1.6.5" - "@rspack/binding-win32-x64-msvc" "1.6.5" - -"@rspack/core@1.6.5", "@rspack/core@^1.5.0": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@rspack/core/-/core-1.6.5.tgz#8e06a917dfbc556156d5c544cbf985b4da89dbd7" - integrity sha512-AqaOMA6MTNhqMYYwrhvPA+2uS662SkAi8Rb7B/IFOzh/Z5ooyczL4lUX+qyhAO3ymn50iwM4jikQCf9XfBiaQA== - dependencies: - "@module-federation/runtime-tools" "0.21.4" - "@rspack/binding" "1.6.5" + "@rspack/binding-darwin-arm64" "1.7.5" + "@rspack/binding-darwin-x64" "1.7.5" + "@rspack/binding-linux-arm64-gnu" "1.7.5" + "@rspack/binding-linux-arm64-musl" "1.7.5" + "@rspack/binding-linux-x64-gnu" "1.7.5" + "@rspack/binding-linux-x64-musl" "1.7.5" + "@rspack/binding-wasm32-wasi" "1.7.5" + "@rspack/binding-win32-arm64-msvc" "1.7.5" + "@rspack/binding-win32-ia32-msvc" "1.7.5" + "@rspack/binding-win32-x64-msvc" "1.7.5" + +"@rspack/core@^1.5.0": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@rspack/core/-/core-1.7.5.tgz#d19295b5c2f137d4458701cf6dc3cbd3f73708b7" + integrity sha512-W1ChLhjBxGg6y4AHjEVjhcww/FZJ2O9obR0EOlYcfrfQGojCAUMeQjbmaF2sse5g5m0vSCaPtNYkycZ0qVRk1A== + dependencies: + "@module-federation/runtime-tools" "0.22.0" + "@rspack/binding" "1.7.5" "@rspack/lite-tapable" "1.1.0" "@rspack/lite-tapable@1.1.0": @@ -5300,9 +5305,9 @@ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + version "0.27.10" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" + integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== "@sindresorhus/is@^4.6.0": version "4.6.0" @@ -5444,147 +5449,147 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" -"@swc/core-darwin-arm64@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.10.tgz#fb76ac44fa1d30696299d45c84f35b62f9ea2bac" - integrity sha512-U72pGqmJYbjrLhMndIemZ7u9Q9owcJczGxwtfJlz/WwMaGYAV/g4nkGiUVk/+QSX8sFCAjanovcU1IUsP2YulA== +"@swc/core-darwin-arm64@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.11.tgz#6f177125831b765e5dacdd1d8c07de576962ad16" + integrity sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg== -"@swc/core-darwin-x64@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.10.tgz#b00fdc59022152cc4998e8478a9250ca8382a7d7" - integrity sha512-NZpDXtwHH083L40xdyj1sY31MIwLgOxKfZEAGCI8xHXdHa+GWvEiVdGiu4qhkJctoHFzAEc7ZX3GN5phuJcPuQ== +"@swc/core-darwin-x64@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz#31381b6560bbd8b8ca6a0755262df321e28c039d" + integrity sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA== -"@swc/core-linux-arm-gnueabihf@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.10.tgz#d39405a2ddcf6604db684fcbbcc9c807810b5d41" - integrity sha512-ioieF5iuRziUF1HkH1gg1r93e055dAdeBAPGAk40VjqpL5/igPJ/WxFHGvc6WMLhUubSJI4S0AiZAAhEAp1jDg== +"@swc/core-linux-arm-gnueabihf@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz#ea7831776f7d8a548db4a8a5f38ef37faf5c0c66" + integrity sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg== -"@swc/core-linux-arm64-gnu@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.10.tgz#5f59553f7d1d3e0af02eb9544b6f88c05a7bb372" - integrity sha512-tD6BClOrxSsNus9cJL7Gxdv7z7Y2hlyvZd9l0NQz+YXzmTWqnfzLpg16ovEI7gknH2AgDBB5ywOsqu8hUgSeEQ== +"@swc/core-linux-arm64-gnu@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz#c99a5843115ef57cbefd40b93c99cb130d6db12f" + integrity sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA== -"@swc/core-linux-arm64-musl@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.10.tgz#eb833e49df2a706d2ccf8e4474c111e7a1b784a5" - integrity sha512-4uAHO3nbfbrTcmO/9YcVweTQdx5fN3l7ewwl5AEK4yoC4wXmoBTEPHAVdKNe4r9+xrTgd4BgyPsy0409OjjlMw== +"@swc/core-linux-arm64-musl@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz#9a7831f558b2ff504d3d6eaaf6a4c84e5232284b" + integrity sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w== -"@swc/core-linux-x64-gnu@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.10.tgz#5d0b6f36e9d9d49fc0a2170fec2b6de2c9c0e76a" - integrity sha512-W0h9ONNw1pVIA0cN7wtboOSTl4Jk3tHq+w2cMPQudu9/+3xoCxpFb9ZdehwCAk29IsvdWzGzY6P7dDVTyFwoqg== +"@swc/core-linux-x64-gnu@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz#4a1fce9b9abedde04459fefe5da9dd9e405a2ae8" + integrity sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ== -"@swc/core-linux-x64-musl@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.10.tgz#0788cf24330f8efec0379cce594c727f3bc0a7c8" - integrity sha512-XQNZlLZB62S8nAbw7pqoqwy91Ldy2RpaMRqdRN3T+tAg6Xg6FywXRKCsLh6IQOadr4p1+lGnqM/Wn35z5a/0Vw== +"@swc/core-linux-x64-musl@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz#0865f23b1cc532d9d77e743a83279e074edbee25" + integrity sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw== -"@swc/core-win32-arm64-msvc@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.10.tgz#1555dc561606268ff84805568cd9a60b5de42543" - integrity sha512-qnAGrRv5Nj/DATxAmCnJQRXXQqnJwR0trxLndhoHoxGci9MuguNIjWahS0gw8YZFjgTinbTxOwzatkoySihnmw== +"@swc/core-win32-arm64-msvc@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz#73eda8b54c94046728f5983e5516223ad1009c59" + integrity sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA== -"@swc/core-win32-ia32-msvc@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.10.tgz#e51f79e4e257f9b1a8c90437b20fc5a9b5b13119" - integrity sha512-i4X/q8QSvzVlaRtv1xfnfl+hVKpCfiJ+9th484rh937fiEZKxZGf51C+uO0lfKDP1FfnT6C1yBYwHy7FLBVXFw== +"@swc/core-win32-ia32-msvc@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz#0df41547974ba9f26ba3e903e803ff523c15650b" + integrity sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw== -"@swc/core-win32-x64-msvc@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.10.tgz#9c2a11ac3321ebea8fc24940a1cd4b4cc9249fe2" - integrity sha512-HvY8XUFuoTXn6lSccDLYFlXv1SU/PzYi4PyUqGT++WfTnbw/68N/7BdUZqglGRwiSqr0qhYt/EhmBpULj0J9rA== +"@swc/core-win32-x64-msvc@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz#f6f97500472c0ea4ab756c383c5d97896075f95c" + integrity sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw== "@swc/core@^1.7.39": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.10.tgz#8487c006be73f4b4bee52d431f2b29881ae70ea4" - integrity sha512-udNofxftduMUEv7nqahl2nvodCiCDQ4Ge0ebzsEm6P8s0RC2tBM0Hqx0nNF5J/6t9uagFJyWIDjXy3IIWMHDJw== + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.11.tgz#8f52ab37b4d874b9cc1b1ae809778620b42dbf9f" + integrity sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w== dependencies: "@swc/counter" "^0.1.3" "@swc/types" "^0.1.25" optionalDependencies: - "@swc/core-darwin-arm64" "1.15.10" - "@swc/core-darwin-x64" "1.15.10" - "@swc/core-linux-arm-gnueabihf" "1.15.10" - "@swc/core-linux-arm64-gnu" "1.15.10" - "@swc/core-linux-arm64-musl" "1.15.10" - "@swc/core-linux-x64-gnu" "1.15.10" - "@swc/core-linux-x64-musl" "1.15.10" - "@swc/core-win32-arm64-msvc" "1.15.10" - "@swc/core-win32-ia32-msvc" "1.15.10" - "@swc/core-win32-x64-msvc" "1.15.10" + "@swc/core-darwin-arm64" "1.15.11" + "@swc/core-darwin-x64" "1.15.11" + "@swc/core-linux-arm-gnueabihf" "1.15.11" + "@swc/core-linux-arm64-gnu" "1.15.11" + "@swc/core-linux-arm64-musl" "1.15.11" + "@swc/core-linux-x64-gnu" "1.15.11" + "@swc/core-linux-x64-musl" "1.15.11" + "@swc/core-win32-arm64-msvc" "1.15.11" + "@swc/core-win32-ia32-msvc" "1.15.11" + "@swc/core-win32-x64-msvc" "1.15.11" "@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/html-darwin-arm64@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-darwin-arm64/-/html-darwin-arm64-1.15.10.tgz#98c95d79b6713906fadb0618a9fc18ef4068231e" - integrity sha512-WmQiAZe3TSbIvdPKljsFUwGqj3j53CSNxNcJcLhbTPVCU8Z0QQ9cEpeyktkqGNrQWOGp5r5EorWi+nvFu4HfqQ== +"@swc/html-darwin-arm64@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-darwin-arm64/-/html-darwin-arm64-1.15.11.tgz#209c1591bb8c3cff87f104ae44ec75c8e9c9ecfc" + integrity sha512-FTa0ypbMbUXiwXIIT76HMFQYewEdTsPKOQGDqI6/kUTzU+lCIqIJequdoh6gqQvMq2BtBu/15dkTYYIlp4JoJw== -"@swc/html-darwin-x64@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-darwin-x64/-/html-darwin-x64-1.15.10.tgz#f93e63c582b93598ffdb79b2ccc1f318a52ecdc7" - integrity sha512-EQaa43uKUn48dOaXyY7JpA2DChFYTwdfyfFvqz+sN3LoEM1OV1QxocWoF+qHPTKEzvLUzIYH5Tm09GzJz9hWIA== +"@swc/html-darwin-x64@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-darwin-x64/-/html-darwin-x64-1.15.11.tgz#411b53362105385132ffdf9bf556217d71283cfd" + integrity sha512-U+WFUFqbqS2WsLVCt40MuBGJ7mxDJi/T8RocBvQkoRwU3juOmeM2V/Od/QLBZxTFZTLQ3RCHJTkLXSDnxUWUuw== -"@swc/html-linux-arm-gnueabihf@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.15.10.tgz#dcad09c8e9bea3fe6d2d230700c786695d723c40" - integrity sha512-UymYHc37ejcKubESPGP5LlGqmx6vJnVs5CYCUbdpblar1XN1oW0SkxKOZVjURYCVAaB3XxfCTCptEol04uvhiw== +"@swc/html-linux-arm-gnueabihf@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.15.11.tgz#12a9e6a0fbb62f68fe0f003f2c43a9232c66d1ea" + integrity sha512-Cid64465sEkAiTh8KLFCbQbsIbgDzPeGdA5ZYB8w5AXmYAGPJ0xbeRHEFq3iq469Dj2rxYvExrLCXNhn8rHbww== -"@swc/html-linux-arm64-gnu@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.15.10.tgz#db770640cd8e14837209cb3f3fbeddd8977b0460" - integrity sha512-o9FzVmnpyD0Z4fzUbIrFz+1JZ72ZFaij+tZ4ZPtIWgA0ymyqlplPOHAbRsbt5/YoLoAx0wo2FN/sYsMdPv3mcA== +"@swc/html-linux-arm64-gnu@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.15.11.tgz#35b7395c3db2c702a4e2db7bac9e2805d3d0453f" + integrity sha512-sxKdt0QJIR2x/6pAmDPK0tjfGVwsSZsfeY1BM8ODTm7h18ApE7KVNN+ZtsDbl4n5ejfXG7fOWNmMPUvj8qSMSA== -"@swc/html-linux-arm64-musl@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.15.10.tgz#08e7a223944006121d94b6883f0189f396723f3a" - integrity sha512-3bBKC6VbOCFH4zJECWmp6jpuoOTcRIaC33zXLJta/GL9bT4AL3PAP0TdSvjNJ4fCAnOJFmbhawlCIOJJ5mTl/g== +"@swc/html-linux-arm64-musl@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.15.11.tgz#c21b62f3027720aeac30039fcc85487893d1523c" + integrity sha512-aNACh2/HPy52VbKPqHieVRDeKzkO66DQdlhiVUi+fggdn8khvllni6Xr52INeAMjYFASrTTth/3vKXMv215t3A== -"@swc/html-linux-x64-gnu@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.15.10.tgz#6811a3f9de97a1377715d3176163931462fec63e" - integrity sha512-4Bb77cpu8fZ38+PqfctHzO3JuJ74B8HKG3/NaqGUlJbwQOiHy0RSAowAp9njyMZ1EzbEkpC9XXju75RLI1KdLA== +"@swc/html-linux-x64-gnu@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.15.11.tgz#c0bb4430a406f5fdd171b4ba1d6157320dbbe3c7" + integrity sha512-8YOar0XeRLBzA+UMMW5smGpsQamoZLtaQ5RKGfap21FxOUUXqkPhkDTRr+kBVCYb47yz3NokjTPaDGTWOYNyww== -"@swc/html-linux-x64-musl@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.15.10.tgz#170a25071cc42c02740eb3a5f6d9b51faab50cfc" - integrity sha512-amYNWp667VbuV+4cAJB0RWYwsBPyh+7WtV0CDpD0ATgB4UvkOWuencFqUYXKC9xczFriani6OqdMa1d2Bffbog== +"@swc/html-linux-x64-musl@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.15.11.tgz#2b3ea8fb8937966fac39bf5d36c07dd99b6d34c0" + integrity sha512-em2Ur0uGFA/nw2JbMclXu9mLuUC7q/1J06i8FZTRHqZzNGt9Q0UMdgH9T8HkGLT5e7dZ6ROJoq1H4st6B8N3uw== -"@swc/html-win32-arm64-msvc@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.15.10.tgz#2c67ce17b84c7bf5bdf82e80bc0ca12ce95dc4d6" - integrity sha512-FRtTz1akAUfS1PH1WsILwBuRAgy/4E/d++il+dZAGkaAP5UaNUXPduNfLaJhT/mR3rVJaIqfAmAJEc1ts0u0lA== +"@swc/html-win32-arm64-msvc@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.15.11.tgz#3503c7ecddb773bd90ee09f31fb30e230edcecda" + integrity sha512-Xf9Vd4UsYTs4ejBwS+j9zShkyp3KQ+qfn/ZKVMKDygWjuOjU6FFXWYm93/PdTmS5qD0c58FhmoqTv+uFEZ4nxQ== -"@swc/html-win32-ia32-msvc@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.15.10.tgz#6b320b474bb42a590bb38ac584ff19b2e53df78e" - integrity sha512-eRscB+1U3WvxKyKrbh7aBioxNB/G3t+NP/RoTEAfSmKfIMuRTR3YX6FrPSU/7SFjv2lgswjRt5MGX7Ygjh5xuw== +"@swc/html-win32-ia32-msvc@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.15.11.tgz#41ce66ac169bb7d4b3fa061f0a5be1cc834a5ddb" + integrity sha512-+YNzKR81UqH+xOZPU8XEIy5L6E63UUGSSEu1Wv3D85GVMQkZ8X9LZkZ5hq4vvqmCTV1zeHIPfzNrrVElqK198g== -"@swc/html-win32-x64-msvc@1.15.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.15.10.tgz#a7300047fd90710907ba7d4f52a882eb33047efc" - integrity sha512-UnKP25R8n3rxl3o0/04FK0iezi9m3Yp8Qrc9nzzrjFpso/TPbJwfgE+2bGUYaX482EsBU7TBorLY2t8fWcD7/Q== +"@swc/html-win32-x64-msvc@1.15.11": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.15.11.tgz#98793d32a81457c33248c3bf50711379025104d2" + integrity sha512-Y3Xj62eA+pjadhgiVNFUBgIN9Wa1gYrB3N1l6NmSLeApVE2qkBww3WrVXhRDfqUXiWz7eRHPDakZSRQREyMv5A== "@swc/html@^1.13.5": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@swc/html/-/html-1.15.10.tgz#5d20c1b04a11cb1134e4af6de8d9fd8bf1516226" - integrity sha512-nlsp1DcT84fQPLcdOO8InIApoD6pI2gWmZCqyCfdu9WRIXZyKv43xIFEymtFrkZgR1iE0YlQV5mrsMnY2D2kxA== + version "1.15.11" + resolved "https://registry.yarnpkg.com/@swc/html/-/html-1.15.11.tgz#f8dcdc099eaffdc2d40b0a818b13ec6198d75b50" + integrity sha512-JOO48SCxyR3KbH9iiLMSWRDm7+Xl6lgvOBe5di54W8PsumdeP0Imatq8cunkRAUR7br8xAjlpB16bX6iJeyeMw== dependencies: "@swc/counter" "^0.1.3" optionalDependencies: - "@swc/html-darwin-arm64" "1.15.10" - "@swc/html-darwin-x64" "1.15.10" - "@swc/html-linux-arm-gnueabihf" "1.15.10" - "@swc/html-linux-arm64-gnu" "1.15.10" - "@swc/html-linux-arm64-musl" "1.15.10" - "@swc/html-linux-x64-gnu" "1.15.10" - "@swc/html-linux-x64-musl" "1.15.10" - "@swc/html-win32-arm64-msvc" "1.15.10" - "@swc/html-win32-ia32-msvc" "1.15.10" - "@swc/html-win32-x64-msvc" "1.15.10" + "@swc/html-darwin-arm64" "1.15.11" + "@swc/html-darwin-x64" "1.15.11" + "@swc/html-linux-arm-gnueabihf" "1.15.11" + "@swc/html-linux-arm64-gnu" "1.15.11" + "@swc/html-linux-arm64-musl" "1.15.11" + "@swc/html-linux-x64-gnu" "1.15.11" + "@swc/html-linux-x64-musl" "1.15.11" + "@swc/html-win32-arm64-msvc" "1.15.11" + "@swc/html-win32-ia32-msvc" "1.15.11" + "@swc/html-win32-x64-msvc" "1.15.11" "@swc/types@^0.1.25": version "0.1.25" @@ -5632,6 +5637,13 @@ dependencies: tslib "^2.4.0" +"@types/better-sqlite3@^7.6.13": + version "7.6.13" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz#a72387f00d2f53cab699e63f2e2c05453cf953f0" + integrity sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA== + dependencies: + "@types/node" "*" + "@types/body-parser@*": version "1.19.6" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" @@ -6024,9 +6036,9 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-cache-semantics@^4.0.2": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#f6a7788f438cbfde15f29acad46512b4c01913b3" + integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q== "@types/http-errors@*": version "2.0.5" @@ -6123,9 +6135,9 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*", "@types/node@>=10.0.0": - version "25.0.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.10.tgz#4864459c3c9459376b8b75fd051315071c8213e7" - integrity sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg== + version "25.2.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.2.0.tgz#015b7d228470c1dcbfc17fe9c63039d216b4d782" + integrity sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w== dependencies: undici-types "~7.16.0" @@ -6203,9 +6215,9 @@ integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== "@types/react@*": - version "19.2.9" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.9.tgz#84ec7669742bb3e7e2e8d6a5258d95ead7764200" - integrity sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA== + version "19.2.11" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.11.tgz#301b615ec33df67f6b0ba63f2b6aedce46cca0de" + integrity sha512-tORuanb01iEzWvMGVGv2ZDhYZVeRMrw453DCSAIn/5yvcSVnMoUMTyf33nQJLahYEnv9xqrTNbgz4qY5EfSh0g== dependencies: csstype "^3.2.2" @@ -6895,20 +6907,20 @@ asynckit@^0.4.0: integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== autoprefixer@^10.4.19, autoprefixer@^10.4.23: - version "10.4.23" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.23.tgz#c6aa6db8e7376fcd900f9fd79d143ceebad8c4e6" - integrity sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA== + version "10.4.24" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.24.tgz#2c29595f3abd820a79976a609d0bf40eecf212fb" + integrity sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw== dependencies: browserslist "^4.28.1" - caniuse-lite "^1.0.30001760" + caniuse-lite "^1.0.30001766" fraction.js "^5.3.4" picocolors "^1.1.1" postcss-value-parser "^4.2.0" axios@^1.7.9, axios@^1.9.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.2.tgz#9ada120b7b5ab24509553ec3e40123521117f687" - integrity sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA== + version "1.13.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.4.tgz#15d109a4817fb82f73aea910d41a2c85606076bc" + integrity sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg== dependencies: follow-redirects "^1.15.6" form-data "^4.0.4" @@ -6938,7 +6950,7 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.4.14: +babel-plugin-polyfill-corejs2@^0.4.14, babel-plugin-polyfill-corejs2@^0.4.15: version "0.4.15" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz#808fa349686eea4741807cfaaa2aa3aa57ce120a" integrity sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw== @@ -6955,7 +6967,15 @@ babel-plugin-polyfill-corejs3@^0.13.0: "@babel/helper-define-polyfill-provider" "^0.6.5" core-js-compat "^3.43.0" -babel-plugin-polyfill-regenerator@^0.6.5: +babel-plugin-polyfill-corejs3@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz#65b06cda48d6e447e1e926681f5a247c6ae2b9cf" + integrity sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.6" + core-js-compat "^3.48.0" + +babel-plugin-polyfill-regenerator@^0.6.5, babel-plugin-polyfill-regenerator@^0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz#69f5dd263cab933c42fe5ea05e83443b374bd4bf" integrity sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A== @@ -6983,9 +7003,9 @@ base64id@2.0.0, base64id@~2.0.0: integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== baseline-browser-mapping@^2.9.0: - version "2.9.17" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz#9d6019766cd7eba738cb5f32c84b9f937cc87780" - integrity sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ== + version "2.9.19" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz#3e508c43c46d961eb4d7d2e5b8d1dd0f9ee4f488" + integrity sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg== batch@0.6.1: version "0.6.1" @@ -6998,12 +7018,12 @@ before-after-hook@^3.0.2: integrity sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A== better-auth@^1.4.9: - version "1.4.17" - resolved "https://registry.yarnpkg.com/better-auth/-/better-auth-1.4.17.tgz#a6f6176042900690df880ed349ca27ec0620291c" - integrity sha512-VmHGQyKsEahkEs37qguROKg/6ypYpNF13D7v/lkbO7w7Aivz0Bv2h+VyUkH4NzrGY0QBKXi1577mGhDCVwp0ew== + version "1.4.18" + resolved "https://registry.yarnpkg.com/better-auth/-/better-auth-1.4.18.tgz#460cfa3f71d2da9ffcbfc1ad4d87977a4d51b5d5" + integrity sha512-bnyifLWBPcYVltH3RhS7CM62MoelEqC6Q+GnZwfiDWNfepXoQZBjEvn4urcERC7NTKgKq5zNBM8rvPvRBa6xcg== dependencies: - "@better-auth/core" "1.4.17" - "@better-auth/telemetry" "1.4.17" + "@better-auth/core" "1.4.18" + "@better-auth/telemetry" "1.4.18" "@better-auth/utils" "0.3.0" "@better-fetch/fetch" "1.1.21" "@noble/ciphers" "^2.0.0" @@ -7025,6 +7045,14 @@ better-call@1.1.8: rou3 "^0.7.10" set-cookie-parser "^2.7.1" +better-sqlite3@^12.6.2: + version "12.6.2" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-12.6.2.tgz#770649f28a62e543a360f3dfa1afe4cc944b1937" + integrity sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.1.1" + big-integer@^1.6.17: version "1.6.52" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" @@ -7048,6 +7076,13 @@ binary@~0.3.0: buffers "~0.1.1" chainsaw "~0.1.0" +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -7324,10 +7359,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001760: - version "1.0.30001766" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz#b6f6b55cb25a2d888d9393104d14751c6a7d6f7a" - integrity sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001766: + version "1.0.30001767" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz#0279c498e862efb067938bba0a0aabafe8d0b730" + integrity sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ== canvas-roundrect-polyfill@0.0.1: version "0.0.1" @@ -7821,14 +7856,14 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.43.0: +core-js-compat@^3.43.0, core-js-compat@^3.48.0: version "3.48.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q== dependencies: browserslist "^4.28.1" -core-js-pure@^3.43.0: +core-js-pure@^3.48.0: version "3.48.0" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.48.0.tgz#7d5a3fe1ec3631b9aa76a81c843ac2ce918e5023" integrity sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw== @@ -8041,9 +8076,9 @@ css-what@^6.0.1, css-what@^6.1.0: integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== cssdb@^8.6.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.7.0.tgz#5a0846fabf863a4d397d980d8d29eb3eb26dfde1" - integrity sha512-UxiWVpV953ENHqAKjKRPZHNDfRo3uOymvO5Ef7MFCWlenaohkYj7PTO7WCBdjZm8z/aDZd6rXyUIlwZ0AjyFSg== + version "8.7.1" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.7.1.tgz#f296bbedc39ace9edf0ed8fbbec57c3e117747cd" + integrity sha512-+F6LKx48RrdGOtE4DT5jz7Uo+VeyKXpK797FAevIkzjV8bMHz6xTO5F7gNDcRCHmPgD5jj2g6QCsY9zmVrh38A== cssesc@^3.0.0: version "3.0.0" @@ -8516,9 +8551,9 @@ default-browser-id@^5.0.0: integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== default-browser@^5.2.1: - version "5.4.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.4.0.tgz#b55cf335bb0b465dd7c961a02cd24246aa434287" - integrity sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg== + version "5.5.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" + integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== dependencies: bundle-name "^4.1.0" default-browser-id "^5.0.0" @@ -8804,9 +8839,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.263: - version "1.5.278" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz#807a5e321f012a41bfd64e653f35993c9af95493" - integrity sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw== + version "1.5.286" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz#142be1ab5e1cd5044954db0e5898f60a4960384e" + integrity sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A== elkjs@^0.9.0, elkjs@^0.9.3: version "0.9.3" @@ -8894,13 +8929,13 @@ enhanced-resolve@5.12.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.17.4: - version "5.18.4" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz#c22d33055f3952035ce6a144ce092447c525f828" - integrity sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q== +enhanced-resolve@^5.19.0: + version "5.19.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz#6687446a15e969eaa63c2fa2694510e17ae6d97c" + integrity sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg== dependencies: graceful-fs "^4.2.4" - tapable "^2.2.0" + tapable "^2.3.0" entities@^2.0.0: version "2.2.0" @@ -9454,6 +9489,11 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filesize@^10.1.6: version "10.1.6" resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.6.tgz#31194da825ac58689c0bce3948f33ce83aabd361" @@ -10080,9 +10120,9 @@ hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.1, hoist-non-react- react-is "^16.7.0" hookified@^1.14.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.15.0.tgz#d51db9fe134b8bd19c1aa88f9fcd7878995e4b66" - integrity sha512-51w+ZZGt7Zw5q7rM3nC4t3aLn/xvKDETsXqMczndvwyVQhAHfUmUuFBRFcos8Iyebtk7OAE9dL26wFNzZVVOkw== + version "1.15.1" + resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.15.1.tgz#b1fafeaa5489cdc29cb85546a8f837ed4ffbbcb6" + integrity sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg== hpack.js@^2.1.6: version "2.1.6" @@ -10788,9 +10828,9 @@ jszip@^3.10.1: setimmediate "^1.0.5" katex@^0.16.0, katex@^0.16.22, katex@^0.16.9: - version "0.16.27" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.27.tgz#4ecf6f620e0ca1c1a5de722e85fcdcec49086a48" - integrity sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw== + version "0.16.28" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.28.tgz#64068425b5a29b41b136aae0d51cbb2c71d64c39" + integrity sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg== dependencies: commander "^8.3.0" @@ -10827,9 +10867,9 @@ known-css-properties@^0.36.0: integrity sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA== kysely@^0.28.5: - version "0.28.10" - resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.28.10.tgz#d2441080cd6c633a3c6a927c2a364c69bbb829a7" - integrity sha512-ksNxfzIW77OcZ+QWSAPC7yDqUSaIVwkTWnTPNiIy//vifNbwsSgQ57OkkncHxxpcBHM3LRfLAZVEh7kjq5twVA== + version "0.28.11" + resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.28.11.tgz#23b0d027cf59401e66d516eb23ed5e8e945fd4fd" + integrity sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg== langium@3.3.1: version "3.3.1" @@ -13610,7 +13650,7 @@ postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.4.43, postcss@^8.5 picocolors "^1.1.1" source-map-js "^1.2.1" -prebuild-install@^7.1.3: +prebuild-install@^7.1.1, prebuild-install@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== @@ -13747,9 +13787,9 @@ pwacompat@2.0.17: integrity sha512-6Du7IZdIy7cHiv7AhtDy4X2QRM8IAD5DII69mt5qWibC2d15ZU8DmBG1WdZKekG11cChSu4zkSUGPF9sweOl6w== pyodide@^0.29.1: - version "0.29.2" - resolved "https://registry.yarnpkg.com/pyodide/-/pyodide-0.29.2.tgz#cab544903fe202b765da2e6046e7d55c064ec34e" - integrity sha512-q/Fnbmiwlw80GfaG74gTbZ6hXOYHwZ1wCDZzE03+tzQYDP1wKEqrSqmIuLQRSYixFFdNdlGEinoGYcDnulwp5g== + version "0.29.3" + resolved "https://registry.yarnpkg.com/pyodide/-/pyodide-0.29.3.tgz#555ec43c09983a3cf3794c778e40084de24cfb95" + integrity sha512-22UBuhOJawj7vKUnS7/F3xK+515LJdjiMAHoCfuS6/PbHiOrSQVnYwDe+2sbVwiOZ3sMMexdXICew6NqOMQGgA== dependencies: "@types/emscripten" "^1.41.4" ws "^8.5.0" @@ -13904,9 +13944,9 @@ react-diff-viewer-continued@^3.4.0: prop-types "^15.8.1" react-dom@^19.2.0: - version "19.2.3" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.3.tgz#f0b61d7e5c4a86773889fcc1853af3ed5f215b17" - integrity sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg== + version "19.2.4" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.4.tgz#6fac6bd96f7db477d966c7ec17c1a2b1ad8e6591" + integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ== dependencies: scheduler "^0.27.0" @@ -14094,9 +14134,9 @@ react-transition-group@^4.3.0: prop-types "^15.6.2" react@^19.2.0: - version "19.2.3" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.3.tgz#d83e5e8e7a258cf6b4fe28640515f99b87cd19b8" - integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA== + version "19.2.4" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a" + integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== reactjs-popup@^2.0.6: version "2.0.6" @@ -14476,37 +14516,37 @@ robust-predicates@^3.0.2: integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== rollup@^4.20.0, rollup@^4.43.0: - version "4.56.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.56.0.tgz#65959d13cfbd7e48b8868c05165b1738f0143862" - integrity sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg== + version "4.57.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.57.1.tgz#947f70baca32db2b9c594267fe9150aa316e5a88" + integrity sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A== dependencies: "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.56.0" - "@rollup/rollup-android-arm64" "4.56.0" - "@rollup/rollup-darwin-arm64" "4.56.0" - "@rollup/rollup-darwin-x64" "4.56.0" - "@rollup/rollup-freebsd-arm64" "4.56.0" - "@rollup/rollup-freebsd-x64" "4.56.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.56.0" - "@rollup/rollup-linux-arm-musleabihf" "4.56.0" - "@rollup/rollup-linux-arm64-gnu" "4.56.0" - "@rollup/rollup-linux-arm64-musl" "4.56.0" - "@rollup/rollup-linux-loong64-gnu" "4.56.0" - "@rollup/rollup-linux-loong64-musl" "4.56.0" - "@rollup/rollup-linux-ppc64-gnu" "4.56.0" - "@rollup/rollup-linux-ppc64-musl" "4.56.0" - "@rollup/rollup-linux-riscv64-gnu" "4.56.0" - "@rollup/rollup-linux-riscv64-musl" "4.56.0" - "@rollup/rollup-linux-s390x-gnu" "4.56.0" - "@rollup/rollup-linux-x64-gnu" "4.56.0" - "@rollup/rollup-linux-x64-musl" "4.56.0" - "@rollup/rollup-openbsd-x64" "4.56.0" - "@rollup/rollup-openharmony-arm64" "4.56.0" - "@rollup/rollup-win32-arm64-msvc" "4.56.0" - "@rollup/rollup-win32-ia32-msvc" "4.56.0" - "@rollup/rollup-win32-x64-gnu" "4.56.0" - "@rollup/rollup-win32-x64-msvc" "4.56.0" + "@rollup/rollup-android-arm-eabi" "4.57.1" + "@rollup/rollup-android-arm64" "4.57.1" + "@rollup/rollup-darwin-arm64" "4.57.1" + "@rollup/rollup-darwin-x64" "4.57.1" + "@rollup/rollup-freebsd-arm64" "4.57.1" + "@rollup/rollup-freebsd-x64" "4.57.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.57.1" + "@rollup/rollup-linux-arm-musleabihf" "4.57.1" + "@rollup/rollup-linux-arm64-gnu" "4.57.1" + "@rollup/rollup-linux-arm64-musl" "4.57.1" + "@rollup/rollup-linux-loong64-gnu" "4.57.1" + "@rollup/rollup-linux-loong64-musl" "4.57.1" + "@rollup/rollup-linux-ppc64-gnu" "4.57.1" + "@rollup/rollup-linux-ppc64-musl" "4.57.1" + "@rollup/rollup-linux-riscv64-gnu" "4.57.1" + "@rollup/rollup-linux-riscv64-musl" "4.57.1" + "@rollup/rollup-linux-s390x-gnu" "4.57.1" + "@rollup/rollup-linux-x64-gnu" "4.57.1" + "@rollup/rollup-linux-x64-musl" "4.57.1" + "@rollup/rollup-openbsd-x64" "4.57.1" + "@rollup/rollup-openharmony-arm64" "4.57.1" + "@rollup/rollup-win32-arm64-msvc" "4.57.1" + "@rollup/rollup-win32-ia32-msvc" "4.57.1" + "@rollup/rollup-win32-x64-gnu" "4.57.1" + "@rollup/rollup-win32-x64-msvc" "4.57.1" fsevents "~2.3.2" rou3@^0.7.10: @@ -16070,7 +16110,7 @@ warning@^4.0.0: dependencies: loose-envify "^1.0.0" -watchpack@^2.4.4: +watchpack@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== @@ -16193,9 +16233,9 @@ webpack-virtual-modules@^0.5.0: integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== webpack@^5.88.1, webpack@^5.95.0: - version "5.104.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.104.1.tgz#94bd41eb5dbf06e93be165ba8be41b8260d4fb1a" - integrity sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA== + version "5.105.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.0.tgz#38b5e6c5db8cbe81debbd16e089335ada05ea23a" + integrity sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" @@ -16207,7 +16247,7 @@ webpack@^5.88.1, webpack@^5.95.0: acorn-import-phases "^1.0.3" browserslist "^4.28.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.4" + enhanced-resolve "^5.19.0" es-module-lexer "^2.0.0" eslint-scope "5.1.1" events "^3.2.0" @@ -16220,7 +16260,7 @@ webpack@^5.88.1, webpack@^5.95.0: schema-utils "^4.3.3" tapable "^2.3.0" terser-webpack-plugin "^5.3.16" - watchpack "^2.4.4" + watchpack "^2.5.1" webpack-sources "^3.3.3" webpackbar@^6.0.1: