From 02b26b6d144949939716da91b45f709ebf39ff5b Mon Sep 17 00:00:00 2001 From: licoricee Date: Fri, 6 Mar 2026 19:01:19 -0300 Subject: [PATCH 1/3] feat: added a new field in settings screen, regarding maxConnection config --- package-lock.json | 7033 +++++++++++++++++++++++++++++++ src-tauri/src/config.rs | 19 + src-tauri/src/pool_manager.rs | 10 +- src/contexts/SettingsContext.ts | 2 + src/i18n/locales/en.json | 3 + src/i18n/locales/es.json | 3 + src/i18n/locales/it.json | 3 + src/pages/Settings.tsx | 27 + 8 files changed, 7094 insertions(+), 6 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..204ec70 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7033 @@ +{ + "name": "tabularis", + "version": "0.9.5", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tabularis", + "version": "0.9.5", + "dependencies": { + "@monaco-editor/react": "^4.7.0", + "@tailwindcss/postcss": "^4.1.18", + "@tanstack/react-table": "^8.21.3", + "@tanstack/react-virtual": "^3.13.18", + "@tauri-apps/api": "^2.10.1", + "@tauri-apps/plugin-clipboard-manager": "~2.3.2", + "@tauri-apps/plugin-dialog": "^2.6.0", + "@tauri-apps/plugin-fs": "^2.4.5", + "@tauri-apps/plugin-opener": "^2.5.3", + "@tauri-apps/plugin-updater": "~2.10.0", + "@types/dagre": "^0.7.53", + "@xyflow/react": "^12.10.0", + "buffer": "^6.0.3", + "clsx": "^2.1.1", + "dagre": "^0.8.5", + "i18next": "^25.8.0", + "i18next-browser-languagedetector": "^8.2.0", + "lucide-react": "^0.563.0", + "monaco-editor": "^0.55.1", + "process": "^0.11.10", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-i18next": "^16.5.4", + "react-router-dom": "^7.13.0", + "tailwind-merge": "^3.4.0", + "util": "^0.12.5", + "wkx": "^0.5.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@tauri-apps/cli": "^2.10.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "@vitest/coverage-v8": "^4.0.18", + "autoprefixer": "^10.4.23", + "conventional-changelog": "^7.2.0", + "conventional-changelog-angular": "^8.2.0", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "jsdom": "^28.0.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4", + "vitest": "^4.0.18" + } + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", + "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.1.1", + "@csstools/css-color-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.29.0", + "@babel/template": "^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", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.6.0.tgz", + "integrity": "sha512-T+uPDciKf0/ioNNDpMGc8FDsehJClZP0yR3Q5MN6wE/Y/1QZ7F+80OgznnTCOlMEG4AV0LvH2UJi3C/nBnaBUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.3.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/@conventional-changelog/git-client/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", + "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", + "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.1.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.0.tgz", + "integrity": "sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.3", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", + "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "integrity": "sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/hosted-git-info": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/hosted-git-info/-/hosted-git-info-1.0.2.tgz", + "integrity": "sha512-aAmGQdMH+ZinytKuA2832u0ATeOFNYNk4meBEXtB5xaPotUgggYNhq5tYU/v17wEbmTW5P9iHNqNrFyrhnqBAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz", + "integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "postcss": "^8.5.6", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.21.tgz", + "integrity": "sha512-SYXFrmrbPgXBvf+HsOsKhFgqSe4M6B29VHOsX9Jih9TlNkNkDWx0hWMiMLUghMEzyUz772ndzdEeCEBx+3GIZw==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.21" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.21", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.21.tgz", + "integrity": "sha512-ww+fmLHyCbPSf7JNbWZP3g7wl6SdNo3ah5Aiw+0e9FDErkVHLKprYUrwTm7dF646FtEkN/KkAKPYezxpmvOjxw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tauri-apps/api": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz", + "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.1.tgz", + "integrity": "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.10.1", + "@tauri-apps/cli-darwin-x64": "2.10.1", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", + "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", + "@tauri-apps/cli-linux-arm64-musl": "2.10.1", + "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", + "@tauri-apps/cli-linux-x64-gnu": "2.10.1", + "@tauri-apps/cli-linux-x64-musl": "2.10.1", + "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", + "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", + "@tauri-apps/cli-win32-x64-msvc": "2.10.1" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.1.tgz", + "integrity": "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.1.tgz", + "integrity": "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.1.tgz", + "integrity": "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.1.tgz", + "integrity": "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.1.tgz", + "integrity": "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.1.tgz", + "integrity": "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.1.tgz", + "integrity": "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.1.tgz", + "integrity": "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.1.tgz", + "integrity": "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.1.tgz", + "integrity": "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.1.tgz", + "integrity": "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/plugin-clipboard-manager": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-clipboard-manager/-/plugin-clipboard-manager-2.3.2.tgz", + "integrity": "sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-dialog": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.6.0.tgz", + "integrity": "sha512-q4Uq3eY87TdcYzXACiYSPhmpBA76shgmQswGkSVio4C82Sz2W4iehe9TnKYwbq7weHiL88Yw19XZm7v28+Micg==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-fs": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.5.tgz", + "integrity": "sha512-dVxWWGE6VrOxC7/jlhyE+ON/Cc2REJlM35R3PJX3UvFw2XwYhLGQVAIyrehenDdKjotipjYEVc4YjOl3qq90fA==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-opener": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz", + "integrity": "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-updater": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.10.0.tgz", + "integrity": "sha512-ljN8jPlnT0aSn8ecYhuBib84alxfMx6Hc8vJSKMJyzGbTPFZAC44T2I1QNFZssgWKrAlofvJqCC6Rr472JWfkQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.10.1" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/dagre": { + "version": "0.7.54", + "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.54.tgz", + "integrity": "sha512-QjcRY+adGbYvBFS7cwv5txhVIwX1XXIUswWl+kSQTbI6NjgZydrZkEKX/etzVd7i+bCsCb40Z/xlBY5eoFuvWQ==", + "license": "MIT" + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", + "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz", + "integrity": "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.0.18", + "ast-v8-to-istanbul": "^0.3.10", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.1", + "obug": "^2.1.1", + "std-env": "^3.10.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.0.18", + "vitest": "4.0.18" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.18", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.18", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.18", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.18", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@xyflow/react": { + "version": "12.10.1", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.1.tgz", + "integrity": "sha512-5eSWtIK/+rkldOuFbOOz44CRgQRjtS9v5nufk77DV+XBnfCGL9HAQ8PG00o2ZYKqkEU/Ak6wrKC95Tu+2zuK3Q==", + "license": "MIT", + "dependencies": { + "@xyflow/system": "0.0.75", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.75", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.75.tgz", + "integrity": "sha512-iXs+AGFLi8w/VlAoc/iSxk+CxfT6o64Uw/k0CKASOPqjqz6E0rb5jFZgJtXGZCpfQI6OQpu5EnumP5fGxQheaQ==", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.12.tgz", + "integrity": "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001777", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz", + "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/conventional-changelog": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-7.2.0.tgz", + "integrity": "sha512-BEdgG+vPl53EVlTTk9sZ96aagFp0AQ5pw/ggiQMy2SClLbTo1r0l+8dSg79gkLOO5DS1Lswuhp5fWn6RwE+ivg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.6.0", + "@simple-libs/hosted-git-info": "^1.0.2", + "@types/normalize-package-data": "^2.4.4", + "conventional-changelog-preset-loader": "^5.0.0", + "conventional-changelog-writer": "^8.3.0", + "conventional-commits-parser": "^6.3.0", + "fd-package-json": "^2.0.0", + "meow": "^13.0.0", + "normalize-package-data": "^7.0.0" + }, + "bin": { + "conventional-changelog": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.0.tgz", + "integrity": "sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-5.0.0.tgz", + "integrity": "sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.4.0.tgz", + "integrity": "sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", + "conventional-commits-filter": "^5.0.0", + "handlebars": "^4.7.7", + "meow": "^13.0.0", + "semver": "^7.5.2" + }, + "bin": { + "conventional-changelog-writer": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-parser": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.3.0.tgz", + "integrity": "sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.2.0.tgz", + "integrity": "sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.0.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.28", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "license": "MIT", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-package-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", + "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "walk-up-path": "^4.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.4.tgz", + "integrity": "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/i18next": { + "version": "25.8.14", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.14.tgz", + "integrity": "sha512-paMUYkfWJMsWPeE/Hejcw+XLhHrQPehem+4wMo+uELnvIwvCG019L9sAIljwjCmEMtFQQO3YeitJY8Kctei3iA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz", + "integrity": "sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-28.1.0.tgz", + "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.31", + "@asamuzakjp/dom-selector": "^6.8.1", + "@bramus/specificity": "^2.4.2", + "@exodus/bytes": "^1.11.0", + "cssstyle": "^6.0.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "undici": "^7.21.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.563.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.563.0.tgz", + "integrity": "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "license": "MIT", + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.1.tgz", + "integrity": "sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^8.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-i18next": { + "version": "16.5.6", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.6.tgz", + "integrity": "sha512-Ua7V2/efA88ido7KyK51fb8Ki8M/sRfW8LR/rZ/9ZKr2luhuTI7kwYZN5agT1rWG7aYm5G0RYE/6JR8KJoCMDw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 25.6.2", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.1.tgz", + "integrity": "sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.1.tgz", + "integrity": "sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw==", + "license": "MIT", + "dependencies": { + "react-router": "7.13.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.25.tgz", + "integrity": "sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.25" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.25.tgz", + "integrity": "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici": { + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index 2af784d..2eaa1f5 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -1,4 +1,5 @@ use crate::keychain_utils; +use crate::paths::get_app_config_dir; use serde::{Deserialize, Serialize}; use std::fs; use std::path::PathBuf; @@ -31,6 +32,7 @@ pub struct AppConfig { pub max_blob_size: Option, pub active_external_drivers: Option>, pub custom_registry_url: Option, + pub max_connections: Option, } pub fn get_config_dir(app: &AppHandle) -> Option { @@ -129,6 +131,9 @@ pub fn save_config(app: AppHandle, config: AppConfig) -> Result<(), String> { if config.active_external_drivers.is_some() { existing_config.active_external_drivers = config.active_external_drivers; } + if config.max_connections.is_some() { + existing_config.max_connections = config.max_connections; + } let content = serde_json::to_string_pretty(&existing_config).map_err(|e| e.to_string())?; fs::write(config_path, content).map_err(|e| e.to_string())?; @@ -213,6 +218,20 @@ pub fn delete_ai_key(provider: String) -> Result<(), String> { keychain_utils::delete_ai_key(&provider) } +pub const DEFAULT_MAX_CONNECTIONS: u32 = 10; + +/// Get the configured maximum pool connections, or DEFAULT_MAX_CONNECTIONS if not set. +/// Does not require AppHandle — reads config.json directly via the paths module. +pub fn get_pool_max_connections() -> u32 { + let config_path = get_app_config_dir().join("config.json"); + if let Ok(content) = fs::read_to_string(config_path) { + if let Ok(config) = serde_json::from_str::(&content) { + return config.max_connections.unwrap_or(DEFAULT_MAX_CONNECTIONS); + } + } + DEFAULT_MAX_CONNECTIONS +} + /// Get the configured maximum BLOB size in bytes, or DEFAULT_MAX_BLOB_SIZE if not set pub fn get_max_blob_size(app: &AppHandle) -> u64 { let config = load_config_internal(app); diff --git a/src-tauri/src/pool_manager.rs b/src-tauri/src/pool_manager.rs index cd839eb..1420e48 100644 --- a/src-tauri/src/pool_manager.rs +++ b/src-tauri/src/pool_manager.rs @@ -72,7 +72,6 @@ pub async fn get_mysql_pool_with_id( connection_id: Option<&str>, ) -> Result, String> { let key = build_connection_key(params, connection_id); - // Try to get existing pool { let pools = MYSQL_POOLS.read().await; @@ -95,14 +94,13 @@ pub async fn get_mysql_pool_with_id( ); let url = build_mysql_url(params); let pool = sqlx::mysql::MySqlPoolOptions::new() - .max_connections(10) + .max_connections(crate::config::get_pool_max_connections()) .connect(&url) .await .map_err(|e| { log::error!("Failed to create MySQL connection pool: {}", e); e.to_string() })?; - log::info!( "MySQL connection pool created successfully for: {} (key: {})", params.database, @@ -151,14 +149,14 @@ pub async fn get_postgres_pool_with_id( ); let url = build_postgres_url(params); let pool = sqlx::postgres::PgPoolOptions::new() - .max_connections(10) + .max_connections(crate::config::get_pool_max_connections()) .connect(&url) .await .map_err(|e| { log::error!("Failed to create PostgreSQL connection pool: {}", e); e.to_string() })?; - + log::info!("Max connections: {}", crate::config::get_pool_max_connections()); log::info!( "PostgreSQL connection pool created successfully for: {} (key: {})", params.database, @@ -206,7 +204,7 @@ pub async fn get_sqlite_pool_with_id( ); let url = build_sqlite_url(params); let pool = sqlx::sqlite::SqlitePoolOptions::new() - .max_connections(5) // SQLite has lower concurrency needs + .max_connections(crate::config::get_pool_max_connections()) .connect(&url) .await .map_err(|e| { diff --git a/src/contexts/SettingsContext.ts b/src/contexts/SettingsContext.ts index 5e75d57..f812a23 100644 --- a/src/contexts/SettingsContext.ts +++ b/src/contexts/SettingsContext.ts @@ -26,6 +26,7 @@ export interface Settings { maxLogEntries?: number; erDiagramDefaultLayout?: ERDiagramLayout; activeExternalDrivers?: string[]; + maxConnections?: number; } export interface SettingsContextType { @@ -53,4 +54,5 @@ export const DEFAULT_SETTINGS: Settings = { loggingEnabled: true, maxLogEntries: 1000, erDiagramDefaultLayout: "LR", + maxConnections: 10, }; diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 2bc9b7d..40acf21 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -180,6 +180,9 @@ "pageSize": "Result Page Size (Limit)", "pageSizeDesc": "Limits the number of rows fetched per query to prevent performance issues. Set to 0 to disable (not recommended).", "rows": "rows", + "maxConnections": "Connection Pool Size", + "maxConnectionsDesc": "Maximum number of concurrent database connections per pool. Takes effect when a new connection pool is created. Restart connections to apply changes.", + "connections": "connections", "appearance": "Appearance", "localization": "Localization", "themeSelection": "Theme Selection", diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 7341482..cf263e0 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -180,6 +180,9 @@ "pageSize": "Tamaño de Página de Resultados (Límite)", "pageSizeDesc": "Limita el número de filas obtenidas por consulta para prevenir problemas de rendimiento. Establece en 0 para desactivar (no recomendado).", "rows": "filas", + "maxConnections": "Tamaño del Pool de Conexiones", + "maxConnectionsDesc": "Número máximo de conexiones simultáneas a la base de datos por pool. Tiene efecto cuando se crea un nuevo pool de conexiones. Reinicia las conexiones para aplicar los cambios.", + "connections": "conexiones", "appearance": "Apariencia", "localization": "Localización", "themeSelection": "Selección de Tema", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index e187145..b2c78d6 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -180,6 +180,9 @@ "pageSize": "Dimensione Pagina Risultati (Limite)", "pageSizeDesc": "Limita il numero di righe caricate per query per prevenire problemi di performance. Imposta a 0 per disabilitare (non consigliato).", "rows": "righe", + "maxConnections": "Dimensione Pool di Connessioni", + "maxConnectionsDesc": "Numero massimo di connessioni simultanee al database per pool. Ha effetto quando viene creato un nuovo pool di connessioni. Riavvia le connessioni per applicare le modifiche.", + "connections": "connessioni", "appearance": "Aspetto", "localization": "Localizzazione", "themeSelection": "Selezione Tema", diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx index c8ebb36..b9d711d 100644 --- a/src/pages/Settings.tsx +++ b/src/pages/Settings.tsx @@ -977,6 +977,33 @@ export const Settings = () => { + +
+ +

+ {t("settings.maxConnectionsDesc")} +

+
+ + updateSetting( + "maxConnections", + parseInt(e.target.value) || DEFAULT_SETTINGS.maxConnections!, + ) + } + min="1" + max="100" + className="bg-base border border-strong rounded px-3 py-2 text-primary w-32 focus:outline-none focus:border-blue-500 transition-colors" + /> + + {t("settings.connections")} + +
+
From 1bf57599bf21ad5c7dd3bc988d8bfd74e1ce0fc7 Mon Sep 17 00:00:00 2001 From: licoricee Date: Fri, 6 Mar 2026 19:07:22 -0300 Subject: [PATCH 2/3] fix: changed default_max_connection to 1 --- src-tauri/src/config.rs | 2 +- src-tauri/src/pool_manager.rs | 1 - src/contexts/SettingsContext.ts | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index 2eaa1f5..503a9f8 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -218,7 +218,7 @@ pub fn delete_ai_key(provider: String) -> Result<(), String> { keychain_utils::delete_ai_key(&provider) } -pub const DEFAULT_MAX_CONNECTIONS: u32 = 10; +pub const DEFAULT_MAX_CONNECTIONS: u32 = 1; /// Get the configured maximum pool connections, or DEFAULT_MAX_CONNECTIONS if not set. /// Does not require AppHandle — reads config.json directly via the paths module. diff --git a/src-tauri/src/pool_manager.rs b/src-tauri/src/pool_manager.rs index 1420e48..d17076f 100644 --- a/src-tauri/src/pool_manager.rs +++ b/src-tauri/src/pool_manager.rs @@ -156,7 +156,6 @@ pub async fn get_postgres_pool_with_id( log::error!("Failed to create PostgreSQL connection pool: {}", e); e.to_string() })?; - log::info!("Max connections: {}", crate::config::get_pool_max_connections()); log::info!( "PostgreSQL connection pool created successfully for: {} (key: {})", params.database, diff --git a/src/contexts/SettingsContext.ts b/src/contexts/SettingsContext.ts index f812a23..1c7b964 100644 --- a/src/contexts/SettingsContext.ts +++ b/src/contexts/SettingsContext.ts @@ -54,5 +54,5 @@ export const DEFAULT_SETTINGS: Settings = { loggingEnabled: true, maxLogEntries: 1000, erDiagramDefaultLayout: "LR", - maxConnections: 10, + maxConnections: 1, }; From d57573a0f895e10156c50b0bc659a3620deddbfb Mon Sep 17 00:00:00 2001 From: licoricee Date: Wed, 11 Mar 2026 20:43:17 -0300 Subject: [PATCH 3/3] fix: merge from main --- .claude/skills/gitnexus/gitnexus-cli/SKILL.md | 2 +- .github/workflows/ci.yml | 7 +- .github/workflows/release.yml | 44 +- .github/workflows/static.yml | 2 - .node-version | 1 + AGENTS.md | 103 ++- CHANGELOG.md | 65 ++ README.md | 2 +- package.json | 5 +- plugins/PLUGIN_GUIDE.md | 125 ++- plugins/manifest.schema.json | 85 ++- plugins/registry.json | 42 + src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/src/commands.rs | 488 +++++++++--- src-tauri/src/config.rs | 29 +- src-tauri/src/credential_cache.rs | 175 +++++ src-tauri/src/drivers/driver_trait.rs | 31 + src-tauri/src/drivers/mysql/mod.rs | 4 + src-tauri/src/drivers/postgres/mod.rs | 6 +- src-tauri/src/drivers/sqlite/mod.rs | 29 +- src-tauri/src/keychain_utils.rs | 27 +- src-tauri/src/lib.rs | 16 +- src-tauri/src/models.rs | 26 + src-tauri/src/persistence.rs | 83 +- src-tauri/src/plugins/commands.rs | 53 +- src-tauri/src/plugins/driver.rs | 18 +- src-tauri/src/plugins/manager.rs | 72 +- src-tauri/src/pool_manager.rs | 49 +- src-tauri/src/task_manager.rs | 9 +- src-tauri/tauri.conf.json | 2 +- src-tauri/tests/integration_tests.rs | 2 + src/components/layout/Sidebar.tsx | 84 +- .../layout/sidebar/ConnectionGroupFolder.tsx | 225 ++++++ .../layout/sidebar/SidebarTableItem.tsx | 26 +- src/components/modals/ConfirmModal.tsx | 62 ++ src/components/modals/PluginRemoveModal.tsx | 29 + src/components/modals/PluginSettingsModal.tsx | 209 +++++ .../modals/PluginStartErrorModal.tsx | 120 +++ src/components/modals/SshConnectionsModal.tsx | 4 - src/components/ui/NewConnectionModal.tsx | 716 ++++++++++++++---- src/components/ui/SearchableSelect.tsx | 2 +- src/components/ui/Select.tsx | 192 +++++ src/components/ui/VisualQueryBuilder.tsx | 25 +- src/contexts/DatabaseContext.ts | 23 + src/contexts/DatabaseProvider.tsx | 87 ++- src/contexts/EditorProvider.tsx | 30 +- src/contexts/SettingsContext.ts | 8 +- src/hooks/useDrivers.ts | 5 + src/i18n/config.ts | 26 +- src/i18n/locales/en.json | 49 +- src/i18n/locales/es.json | 30 +- src/i18n/locales/it.json | 30 +- src/i18n/locales/pt-br.json | 0 src/pages/Connections.tsx | 606 ++++++++++++--- src/pages/Settings.tsx | 374 ++++++--- src/types/plugins.ts | 24 + src/utils/connectionStringParser.ts | 242 ++++++ src/utils/connections.ts | 1 + src/utils/credentials.ts | 34 + src/utils/database.ts | 1 + src/utils/dragState.ts | 7 + src/utils/pluginConfig.ts | 68 ++ src/utils/tabFilters.ts | 9 +- src/version.ts | 2 +- tests/utils/connectionStringParser.test.ts | 396 ++++++++++ tests/utils/credentials.test.ts | 37 + tests/utils/pluginConfig.test.ts | 154 ++++ website/content/posts/hackernews-plugin.md | 106 +++ .../content/posts/nosql-plugins-community.md | 71 ++ .../posts/v096-redis-clickhouse-filters.md | 78 ++ .../v097-plugin-settings-connection-groups.md | 128 ++++ website/content/wiki/plugins.md | 62 ++ website/next-env.d.ts | 2 +- .../public/img/posts/connection-groups.png | Bin 0 -> 67302 bytes .../public/img/posts/hackernews-plugin.png | Bin 0 -> 192726 bytes .../img/posts/plugin-settings-error.png | Bin 0 -> 112739 bytes .../public/img/posts/plugin-settings-gear.png | Bin 0 -> 88745 bytes .../img/posts/plugin-settings-modal.png | Bin 0 -> 104522 bytes website/public/videos/posts/filters-demo.mp4 | Bin 0 -> 597264 bytes website/src/app/globals.css | 317 +++++++- website/src/components/DownloadButtons.tsx | 121 ++- website/src/components/DownloadModal.tsx | 224 ++++++ website/src/lib/posts.ts | 2 +- website/src/lib/version.ts | 2 +- 85 files changed, 5974 insertions(+), 682 deletions(-) create mode 100644 .node-version create mode 100644 src-tauri/src/credential_cache.rs create mode 100644 src/components/layout/sidebar/ConnectionGroupFolder.tsx create mode 100644 src/components/modals/ConfirmModal.tsx create mode 100644 src/components/modals/PluginRemoveModal.tsx create mode 100644 src/components/modals/PluginSettingsModal.tsx create mode 100644 src/components/modals/PluginStartErrorModal.tsx create mode 100644 src/components/ui/Select.tsx create mode 100644 src/i18n/locales/pt-br.json create mode 100644 src/utils/connectionStringParser.ts create mode 100644 src/utils/credentials.ts create mode 100644 src/utils/dragState.ts create mode 100644 src/utils/pluginConfig.ts create mode 100644 tests/utils/connectionStringParser.test.ts create mode 100644 tests/utils/credentials.test.ts create mode 100644 tests/utils/pluginConfig.test.ts create mode 100644 website/content/posts/hackernews-plugin.md create mode 100644 website/content/posts/nosql-plugins-community.md create mode 100644 website/content/posts/v096-redis-clickhouse-filters.md create mode 100644 website/content/posts/v097-plugin-settings-connection-groups.md create mode 100644 website/public/img/posts/connection-groups.png create mode 100644 website/public/img/posts/hackernews-plugin.png create mode 100644 website/public/img/posts/plugin-settings-error.png create mode 100644 website/public/img/posts/plugin-settings-gear.png create mode 100644 website/public/img/posts/plugin-settings-modal.png create mode 100644 website/public/videos/posts/filters-demo.mp4 create mode 100644 website/src/components/DownloadModal.tsx diff --git a/.claude/skills/gitnexus/gitnexus-cli/SKILL.md b/.claude/skills/gitnexus/gitnexus-cli/SKILL.md index 3ae9c18..c9e0af3 100644 --- a/.claude/skills/gitnexus/gitnexus-cli/SKILL.md +++ b/.claude/skills/gitnexus/gitnexus-cli/SKILL.md @@ -22,7 +22,7 @@ Run from the project root. This parses all source files, builds the knowledge gr | `--force` | Force full re-index even if up to date | | `--embeddings` | Enable embedding generation for semantic search (off by default) | -**When to run:** First time in a project, after major code changes, or when `gitnexus://repo/{name}/context` reports the index is stale. +**When to run:** First time in a project, after major code changes, or when `gitnexus://repo/{name}/context` reports the index is stale. In Claude Code, a PostToolUse hook runs `analyze` automatically after `git commit` and `git merge`, preserving embeddings if previously generated. ### status — Check index freshness diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1af7673..68d650a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,9 @@ name: CI +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + on: push: branches: [main] @@ -30,9 +34,6 @@ jobs: - uses: pnpm/action-setup@v4 name: Install pnpm - with: - version: 10 - cache: true - name: Install Rust/Tauri dependencies run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2011cd6..34e3969 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,7 @@ on: push: tags: - "v*" + workflow_dispatch: jobs: publish-tauri: @@ -27,10 +28,14 @@ jobs: steps: - uses: actions/checkout@v4 - - name: setup node - uses: actions/setup-node@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v4.2.0 + + - name: Setup Node.js + uses: actions/setup-node@v6 with: - node-version: lts/* + node-version-file: .node-version + cache: "pnpm" - name: install Rust stable uses: dtolnay/rust-toolchain@stable @@ -40,23 +45,44 @@ jobs: - name: install dependencies (ubuntu only) if: matrix.platform == 'ubuntu-24.04' - # You can remove libayatana-appindicator3-dev if you don't use the system tray feature. run: | sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev libsoup-3.0-dev build-essential curl wget file libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libfuse2 + sudo apt-get install -y \ + build-essential \ + curl \ + wget \ + file \ + libssl-dev \ + libgtk-3-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + libfuse2 \ + libsoup-3.0-dev \ + libwebkit2gtk-4.1-dev \ + patchelf \ + xdg-utils \ + gstreamer1.0-plugins-base \ + gstreamer1.0-plugins-bad \ + fonts-noto-color-emoji \ + pkg-config \ + unzip - name: install frontend dependencies - run: npm install + run: pnpm install --frozen-lockfile - name: Cache Rust dependencies - uses: swatinem/rust-cache@v2 + uses: swatinem/rust-cache@v2.8.2 with: workspaces: src-tauri + - name: Override tauri-cli with custom AppImage format (Linux) + if: matrix.platform == 'ubuntu-24.04' + run: cargo install tauri-cli --git https://github.com/tauri-apps/tauri --branch feat/truly-portable-appimage --force + - uses: tauri-apps/tauri-action@v0.6.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_BUNDLER_NEW_APPIMAGE_FORMAT: ${{ runner.os == 'Linux' && 'true' || '' }} + TAURI_BUNDLER_NEW_APPIMAGE_FORMAT: "true" TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} with: @@ -65,5 +91,5 @@ jobs: releaseBody: "See the assets to download this version and install." releaseDraft: true prerelease: false - tauriScript: "npm tauri" + tauriScript: ${{ matrix.platform == 'ubuntu-24.04' && 'cargo tauri' || 'pnpm tauri' }} args: ${{ matrix.args }} diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 0d65885..93be763 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -32,8 +32,6 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v4 - with: - version: 9 - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..156ca6d --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +22.16.0 \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index 60b6044..5b63a81 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,27 +9,98 @@ Adhere to the rules defined in the [rules directory](./.rules/): - [Testing Conventions](./.rules/testing.md) (Test file organization and structure) -# GitNexus MCP +# GitNexus — Code Intelligence -This project is indexed by GitNexus as **tabularis** (2360 symbols, 6027 relationships, 179 execution flows). +This project is indexed by GitNexus as **tabularis** (2799 symbols, 6979 relationships, 215 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. -## Always Start Here +> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. -1. **Read `gitnexus://repo/{name}/context`** — codebase overview + check index freshness -2. **Match your task to a skill below** and **read that skill file** -3. **Follow the skill's workflow and checklist** +## Always Do -> If step 1 warns the index is stale, run `npx gitnexus analyze` in the terminal first. +- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `gitnexus_impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user. +- **MUST run `gitnexus_detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows. +- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits. +- When exploring unfamiliar code, use `gitnexus_query({query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance. +- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `gitnexus_context({name: "symbolName"})`. -## Skills +## When Debugging -| Task | Read this skill file | -|------|---------------------| -| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` | -| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` | -| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` | -| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` | -| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` | -| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` | +1. `gitnexus_query({query: ""})` — find execution flows related to the issue +2. `gitnexus_context({name: ""})` — see all callers, callees, and process participation +3. `READ gitnexus://repo/tabularis/process/{processName}` — trace the full execution flow step by step +4. For regressions: `gitnexus_detect_changes({scope: "compare", base_ref: "main"})` — see what your branch changed + +## When Refactoring + +- **Renaming**: MUST use `gitnexus_rename({symbol_name: "old", new_name: "new", dry_run: true})` first. Review the preview — graph edits are safe, text_search edits need manual review. Then run with `dry_run: false`. +- **Extracting/Splitting**: MUST run `gitnexus_context({name: "target"})` to see all incoming/outgoing refs, then `gitnexus_impact({target: "target", direction: "upstream"})` to find all external callers before moving code. +- After any refactor: run `gitnexus_detect_changes({scope: "all"})` to verify only expected files changed. + +## Never Do + +- NEVER edit a function, class, or method without first running `gitnexus_impact` on it. +- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis. +- NEVER rename symbols with find-and-replace — use `gitnexus_rename` which understands the call graph. +- NEVER commit changes without running `gitnexus_detect_changes()` to check affected scope. + +## Tools Quick Reference + +| Tool | When to use | Command | +|------|-------------|---------| +| `query` | Find code by concept | `gitnexus_query({query: "auth validation"})` | +| `context` | 360-degree view of one symbol | `gitnexus_context({name: "validateUser"})` | +| `impact` | Blast radius before editing | `gitnexus_impact({target: "X", direction: "upstream"})` | +| `detect_changes` | Pre-commit scope check | `gitnexus_detect_changes({scope: "staged"})` | +| `rename` | Safe multi-file rename | `gitnexus_rename({symbol_name: "old", new_name: "new", dry_run: true})` | +| `cypher` | Custom graph queries | `gitnexus_cypher({query: "MATCH ..."})` | + +## Impact Risk Levels + +| Depth | Meaning | Action | +|-------|---------|--------| +| d=1 | WILL BREAK — direct callers/importers | MUST update these | +| d=2 | LIKELY AFFECTED — indirect deps | Should test | +| d=3 | MAY NEED TESTING — transitive | Test if critical path | + +## Resources + +| Resource | Use for | +|----------|---------| +| `gitnexus://repo/tabularis/context` | Codebase overview, check index freshness | +| `gitnexus://repo/tabularis/clusters` | All functional areas | +| `gitnexus://repo/tabularis/processes` | All execution flows | +| `gitnexus://repo/tabularis/process/{name}` | Step-by-step execution trace | + +## Self-Check Before Finishing + +Before completing any code modification task, verify: +1. `gitnexus_impact` was run for all modified symbols +2. No HIGH/CRITICAL risk warnings were ignored +3. `gitnexus_detect_changes()` confirms changes match expected scope +4. All d=1 (WILL BREAK) dependents were updated + +## Keeping the Index Fresh + +After committing code changes, the GitNexus index becomes stale. Re-run analyze to update it: + +```bash +npx gitnexus analyze +``` + +If the index previously included embeddings, preserve them by adding `--embeddings`: + +```bash +npx gitnexus analyze --embeddings +``` + +To check whether embeddings exist, inspect `.gitnexus/meta.json` — the `stats.embeddings` field shows the count (0 means no embeddings). **Running analyze without `--embeddings` will delete any previously generated embeddings.** + +> Claude Code users: A PostToolUse hook handles this automatically after `git commit` and `git merge`. + +## CLI + +- Re-index: `npx gitnexus analyze` +- Check freshness: `npx gitnexus status` +- Generate docs: `npx gitnexus wiki` diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d81c68..fe70006 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,68 @@ +## [0.9.8](https://github.com/debba/tabularis/compare/v0.9.7...v0.9.8) (2026-03-11) + + +### Bug Fixes + +* **new-connection-modal:** avoid returning promise from onClick ([14f644e](https://github.com/debba/tabularis/commit/14f644e7878249b471a2cb1c48a1c25bedbb747b)) +* **new-connection-modal:** reset tab on close and UI tweaks ([7a1f2fb](https://github.com/debba/tabularis/commit/7a1f2fbeb6301c89b588a59cdeb0a8f4f739a285)) +* **sqlite:** resolve SQLITE_CANTOPEN (error code 14) on Windows ([c8e5734](https://github.com/debba/tabularis/commit/c8e5734dbdf5920294bfdf24e76c8c8ef249e163)) +* **visual-query:** replace HTML5 drag-and-drop with pointer events for ([3afee6b](https://github.com/debba/tabularis/commit/3afee6ba61188f4bdb70096927c2311c45b1c8e8)) + + +### Features + +* **download-buttons:** add split download button with platform dropdown ([542961c](https://github.com/debba/tabularis/commit/542961cf34e3b8d0723af752f6ef96242b59818e)) +* **download:** add download modal and wire up download buttons ([f2cc6ab](https://github.com/debba/tabularis/commit/f2cc6ab146ea6d3313e1e175784fce0f04667ed3)) +* **drivers:** add connection string parser and import UI ([2258ba3](https://github.com/debba/tabularis/commit/2258ba39a4c84bdf0567bd12dd3716bccd2cf096)) +* **plugins:** add hackernews plugin to registry ([6635124](https://github.com/debba/tabularis/commit/663512496c25f88c5e03c413f34e30fb8db1fc1f)) +* use ubuntu 25.04 for building linux ([5f80a89](https://github.com/debba/tabularis/commit/5f80a89d4d31564af0f9da82b189917dcab02c09)) + + + +## [0.9.7](https://github.com/debba/tabularis/compare/v0.9.6...v0.9.7) (2026-03-09) + + +### Bug Fixes + +* build alerts ([c5cf57a](https://github.com/debba/tabularis/commit/c5cf57a16efc41e4b3644372fa779794c2b2cf6d)) +* merged code ([c430a5b](https://github.com/debba/tabularis/commit/c430a5b00a24b733dec3b35b6c312391459cebd9)) +* **tabs:** prefer loaded activeTabId or null, avoid implicit fallback ([297138b](https://github.com/debba/tabularis/commit/297138b702b51134d91f9f0b487f867a6c667546)) +* use SqliteConnectOptions for reliable WAL mode database opening ([b0d0a4f](https://github.com/debba/tabularis/commit/b0d0a4f44ed8ec929daa5745bbb0e701e8c2201e)) + + +### Features + +* add connections group ([1e91768](https://github.com/debba/tabularis/commit/1e91768d3171f1a08b8b80e81fc269e2684510bc)) +* **credential-cache:** add credential cache to reduce keychain calls, ([ca2e668](https://github.com/debba/tabularis/commit/ca2e668763491032d5b109105889b76ad49e5de5)) +* **credentials:** fetch connection credentials when editing connections ([e580ccf](https://github.com/debba/tabularis/commit/e580ccfd5f62466679fbcd288d6d8acd5db16071)) +* **modals:** add ConfirmModal and replace inline confirm dialogs ([0ceddda](https://github.com/debba/tabularis/commit/0cedddad723105ffb16e08a02f17570754e83bda)) +* **new-connection-modal:** preselect databases from initial connection ([53d10c9](https://github.com/debba/tabularis/commit/53d10c91ec2260023b564a66ac635e0f68f55875)) +* **plugins:** add per-plugin interpreter settings with error modal ([64ed30c](https://github.com/debba/tabularis/commit/64ed30cab6e980f78ad4c29c3e67841451857d74)) +* **plugins:** add plugin remove modal and integrate into Settings ([e2d38f5](https://github.com/debba/tabularis/commit/e2d38f5292c61dd7ce14dfd8fb912846692ef7f7)) +* **plugins:** add plugin settings and no_connection_required flag ([7097190](https://github.com/debba/tabularis/commit/70971909c34fc73b3c59ab743cb183654e54e63f)) +* **select:** add Select component and replace SearchableSelect ([3be733a](https://github.com/debba/tabularis/commit/3be733a176b3265a7d2bd06a7dc2f4cd271556fa)) +* **settings:** add portal-based plugin version dropdown ([9f4f82c](https://github.com/debba/tabularis/commit/9f4f82c2ce90bada6d091fe08e1042ead58f98b9)) + +## [0.9.6](https://github.com/debba/tabularis/compare/v0.9.5...v0.9.6) (2026-03-07) + + +### Bug Fixes + +* add autoComplete="off" to all connection dialog inputs ([573380b](https://github.com/debba/tabularis/commit/573380b6f01888e4ddadc3b5a597de454b2e413a)), closes [#64](https://github.com/debba/tabularis/issues/64) +* disable macOS autocorrect on connection dialog inputs ([481f7fe](https://github.com/debba/tabularis/commit/481f7fe4bb081c8424fe2ab3050986d547ea26f7)), closes [#64](https://github.com/debba/tabularis/issues/64) +* **website:** scope badge image rule to shields.io only ([af7dfb7](https://github.com/debba/tabularis/commit/af7dfb7cf1bfa6933be1617af11a2b8fea2b89fd)) + + +### Features + +* **editor:** add close tab keyboard shortcut ([167de6e](https://github.com/debba/tabularis/commit/167de6e9409f121b58622556954d8f17e9c9db10)) +* **filters:** add structured filter utils and toolbar UI ([150e08f](https://github.com/debba/tabularis/commit/150e08f323bcedc477ba605a89eec6d513ce9130)) +* **plugins:** add clickhouse plugin to registry ([1a78418](https://github.com/debba/tabularis/commit/1a78418c41b509195d3e8672582f8892f660c008)) +* **plugins:** add install error modal and improve installer logging ([db2d0de](https://github.com/debba/tabularis/commit/db2d0ded454b5f2be9110d0279dc6b3ec8cdccd0)) +* **plugins:** add Redis plugin to registry with version 0.1.0 and download links ([848b530](https://github.com/debba/tabularis/commit/848b530010306b3087fe1604dc20cf5ca24375b0)) +* **plugins:** update redis plugin assets and add download logging ([204175f](https://github.com/debba/tabularis/commit/204175f4a2370df23bc81a6a1b7fc0b7014ed7de)) +* **table-toolbar:** add ORDER BY autocomplete ([ed58068](https://github.com/debba/tabularis/commit/ed58068e127842a9784c3d3788df283049411f71)) + ## [0.9.5](https://github.com/debba/tabularis/compare/v0.9.4...v0.9.5) (2026-03-04) diff --git a/README.md b/README.md index 820ff1e..9b26012 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ A lightweight, developer-focused database management tool, built with Tauri and ## Release Download: -[![Windows](https://img.shields.io/badge/Windows-Download-blue?logo=windows)](https://github.com/debba/tabularis/releases/download/v0.9.5/tabularis_0.9.5_x64-setup.exe) [![macOS](https://img.shields.io/badge/macOS-Download-black?logo=apple)](https://github.com/debba/tabularis/releases/download/v0.9.5/tabularis_0.9.5_x64.dmg) [![Linux](https://img.shields.io/badge/Linux-Download-green?logo=linux)](https://github.com/debba/tabularis/releases/download/v0.9.5/tabularis_0.9.5_amd64.AppImage) +[![Windows](https://img.shields.io/badge/Windows-Download-blue?logo=windows)](https://github.com/debba/tabularis/releases/download/v0.9.8/tabularis_0.9.8_x64-setup.exe) [![macOS](https://img.shields.io/badge/macOS-Download-black?logo=apple)](https://github.com/debba/tabularis/releases/download/v0.9.8/tabularis_0.9.8_x64.dmg) [![Linux AppImage](https://img.shields.io/badge/Linux-AppImage-green?logo=linux)](https://github.com/debba/tabularis/releases/download/v0.9.8/tabularis_0.9.8_amd64.AppImage) [![Linux .deb](https://img.shields.io/badge/Linux-.deb-orange?logo=debian)](https://github.com/debba/tabularis/releases/download/v0.9.8/tabularis_0.9.8_amd64.deb) [![Linux .rpm](https://img.shields.io/badge/Linux-.rpm-red?logo=redhat)](https://github.com/debba/tabularis/releases/download/v0.9.8/tabularis-0.9.7-1.x86_64.rpm) ## Table of Contents diff --git a/package.json b/package.json index 3d5f893..f6a976b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tabularis", "private": true, - "version": "0.9.5", + "version": "0.9.8", "type": "module", "links": { "discord": "https://discord.gg/YrZPHAwMSG", @@ -76,5 +76,6 @@ "typescript-eslint": "^8.46.4", "vite": "^7.2.4", "vitest": "^4.0.18" - } + }, + "packageManager": "pnpm@10.30.3" } diff --git a/plugins/PLUGIN_GUIDE.md b/plugins/PLUGIN_GUIDE.md index 2e8a55c..32046fc 100644 --- a/plugins/PLUGIN_GUIDE.md +++ b/plugins/PLUGIN_GUIDE.md @@ -99,6 +99,8 @@ The manifest tells Tabularis everything about your plugin. | `views` | bool | `true` if the database supports views. Enables the views section in the explorer. | | `routines` | bool | `true` if the database supports stored procedures/functions. | | `file_based` | bool | `true` for local file databases (e.g., SQLite, DuckDB). Replaces host/port with a file path input in the connection form. | +| `folder_based` | bool | `true` for plugins that connect to a directory rather than a single file (e.g. CSV plugin). Replaces host/port with a folder picker. | +| `no_connection_required` | bool | `true` for API-based plugins that need no host, port, or credentials (e.g. a public REST API). Hides the entire connection form — the user only fills in the connection name. | | `identifier_quote` | string | Character used to quote SQL identifiers. Use `"\""` for ANSI standard or `` "`" `` for MySQL style. | | `alter_primary_key` | bool | `true` if the database supports altering primary keys after table creation. | @@ -128,7 +130,120 @@ Each entry in `data_types` describes a type the driver supports for column creat --- -## 3. Implementing the JSON-RPC Interface +## 3. Plugin Settings + +Plugins can declare custom configuration fields that Tabularis renders in the **Settings → gear icon** modal for that plugin. Users fill in the values, Tabularis persists them in `config.json`, and passes them to the plugin at startup via an `initialize` RPC call. + +### Declaring settings in `manifest.json` + +Add an optional `settings` array at the top level of your manifest: + +```json +{ + "id": "my-plugin", + "name": "My Plugin", + "version": "1.0.0", + "description": "A custom plugin with settings", + "executable": "my-plugin", + "capabilities": { ... }, + "data_types": [ ... ], + "settings": [ + { + "key": "api_key", + "label": "API Key", + "type": "string", + "required": true, + "description": "Your API key for authentication." + }, + { + "key": "region", + "label": "Region", + "type": "select", + "options": ["us-east-1", "eu-west-1", "ap-southeast-1"], + "default": "us-east-1", + "description": "Deployment region." + }, + { + "key": "max_connections", + "label": "Max Connections", + "type": "number", + "default": 10 + }, + { + "key": "ssl", + "label": "Enable SSL", + "type": "boolean", + "default": true + } + ] +} +``` + +### Setting definition fields + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `key` | string | yes | Unique identifier used as the key in the settings map. | +| `label` | string | yes | Human-readable label shown in the UI. | +| `type` | string | yes | One of: `"string"`, `"boolean"`, `"number"`, `"select"`. | +| `default` | any | no | Default value pre-filled when no saved value exists. | +| `description` | string | no | Optional hint displayed below the field. | +| `required` | boolean | no | If `true`, saving the modal is blocked until the field is filled. | +| `options` | string[] | no | For `"select"` type: the list of choices shown in the dropdown. | + +### The `initialize` RPC method + +Immediately after spawning the plugin process, Tabularis sends an `initialize` call: + +```json +{ + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "settings": { + "api_key": "abc123", + "region": "eu-west-1", + "max_connections": 10, + "ssl": true + } + }, + "id": 1 +} +``` + +- The `settings` object contains only the keys the user has configured (merged with defaults). +- Returning an error response is safe — Tabularis silently ignores any `initialize` failure. +- Plugins that do not implement `initialize` are unaffected (the error is ignored). +- Use `initialize` to store settings in your plugin's state before any query arrives. + +#### Handling `initialize` in Rust + +```rust +"initialize" => { + let settings = ¶ms["settings"]; + // Store settings in your plugin state, e.g.: + // API_KEY.set(settings["api_key"].as_str().unwrap_or("").to_string()); + json!({ + "jsonrpc": "2.0", + "result": null, + "id": id + }) +} +``` + +#### Handling `initialize` in Python + +```python +elif method == "initialize": + settings = params.get("settings", {}) + # Store settings for later use: + # api_key = settings.get("api_key", "") + send_response({"result": None, "id": req_id}) +``` + +--- + +## 4. Implementing the JSON-RPC Interface Your plugin must run an event loop that: 1. Reads one JSON line from `stdin`. @@ -197,7 +312,7 @@ The `params.params` object is a `ConnectionParams` — the same values the user --- -## 4. Required Methods +## 5. Required Methods Your plugin must respond to the following JSON-RPC methods. For unsupported features, return an empty array `[]` or a `-32601` (Method not found) error. @@ -612,7 +727,7 @@ These methods generate SQL statements. Tabularis may display the SQL to the user --- -## 5. Example: Building a Minimal Plugin in Rust +## 6. Example: Building a Minimal Plugin in Rust Here is a minimal but functional skeleton for a plugin executable in Rust. @@ -719,7 +834,7 @@ serde_json = "1" --- -## 6. Testing Your Plugin +## 7. Testing Your Plugin ### Manual Testing via Shell @@ -746,7 +861,7 @@ You should see a valid JSON-RPC response on stdout. --- -## 7. Publishing Your Plugin +## 8. Publishing Your Plugin To make your plugin available in the official registry: diff --git a/plugins/manifest.schema.json b/plugins/manifest.schema.json index 944baec..e4b40f0 100644 --- a/plugins/manifest.schema.json +++ b/plugins/manifest.schema.json @@ -4,7 +4,14 @@ "title": "Tabularis Plugin Manifest", "description": "Schema for the manifest.json file required by every Tabularis database driver plugin.", "type": "object", - "required": ["id", "name", "version", "executable", "capabilities", "data_types"], + "required": [ + "id", + "name", + "version", + "executable", + "capabilities", + "data_types" + ], "additionalProperties": false, "properties": { "id": { @@ -46,7 +53,14 @@ "capabilities": { "type": "object", "description": "Feature flags that control which UI elements Tabularis renders for this driver.", - "required": ["schemas", "views", "routines", "file_based", "identifier_quote", "alter_primary_key"], + "required": [ + "schemas", + "views", + "routines", + "file_based", + "identifier_quote", + "alter_primary_key" + ], "additionalProperties": false, "properties": { "schemas": { @@ -70,6 +84,26 @@ "default": false, "description": "true for plugins that connect to a directory rather than a single file (e.g. CSV plugin). Replaces host/port fields with a folder picker." }, + "connection_string": { + "type": "boolean", + "default": true, + "description": "Optional capability for network drivers. Set false to hide connection string import in the UI." + }, + "connectionString": { + "type": "boolean", + "default": true, + "description": "CamelCase alias of connection_string. Optional capability for network drivers." + }, + "connection_string_example": { + "type": "string", + "default": "", + "description": "Optional placeholder example shown in the connection string field (e.g. \"postgres://user:pass@localhost:5432/db\")." + }, + "connectionStringExample": { + "type": "string", + "default": "", + "description": "CamelCase alias of connection_string_example." + }, "identifier_quote": { "type": "string", "enum": ["\"", "`"], @@ -103,6 +137,36 @@ "type": "boolean", "default": false, "description": "true if the driver properly supports creating foreign key constraints." + }, + "no_connection_required": { + "type": "boolean", + "default": false, + "description": "true for API-based plugins that need no host/port/credentials (e.g. public REST APIs). Hides the entire connection form and skips database validation." + } + } + }, + "interpreter": { + "type": "string", + "description": "Optional interpreter for script-based plugins (e.g. python3)." + }, + "settings": { + "type": "array", + "description": "Optional list of configuration fields the plugin exposes to the user.", + "items": { + "type": "object", + "required": ["key", "label", "type"], + "additionalProperties": false, + "properties": { + "key": { "type": "string" }, + "label": { "type": "string" }, + "type": { + "type": "string", + "enum": ["string", "boolean", "number", "select"] + }, + "default": {}, + "description": { "type": "string" }, + "required": { "type": "boolean", "default": false }, + "options": { "type": "array", "items": { "type": "string" } } } } }, @@ -111,7 +175,12 @@ "description": "List of SQL data types supported by this driver for column creation in the UI.", "items": { "type": "object", - "required": ["name", "category", "requires_length", "requires_precision"], + "required": [ + "name", + "category", + "requires_length", + "requires_precision" + ], "additionalProperties": false, "properties": { "name": { @@ -120,7 +189,15 @@ }, "category": { "type": "string", - "enum": ["numeric", "string", "date", "binary", "json", "spatial", "other"], + "enum": [ + "numeric", + "string", + "date", + "binary", + "json", + "spatial", + "other" + ], "description": "UI grouping category for this type." }, "requires_length": { diff --git a/plugins/registry.json b/plugins/registry.json index 96292c1..a8bd7f7 100644 --- a/plugins/registry.json +++ b/plugins/registry.json @@ -98,6 +98,48 @@ } } ] + }, + { + "id": "clickhouse", + "name": "Clickhouse", + "description": "ClickHouse columnar OLAP database driver", + "author": "debba ", + "homepage": "https://github.com/debba/tabularis-clickhouse-plugin", + "latest_version": "0.1.0", + "releases": [ + { + "version": "0.1.0", + "min_tabularis_version": "0.9.5", + "assets": { + "linux-x64": "https://github.com/debba/tabularis-clickhouse-plugin/releases/download/v0.1.0/clickhouse-plugin-linux-x64.zip", + "linux-arm64": "https://github.com/debba/tabularis-clickhouse-plugin/releases/download/v0.1.0/clickhouse-plugin-linux-arm64.zip", + "darwin-x64": "https://github.com/debba/tabularis-clickhouse-plugin/releases/download/v0.1.0/clickhouse-plugin-darwin-x64.zip", + "darwin-arm64": "https://github.com/debba/tabularis-clickhouse-plugin/releases/download/v0.1.0/clickhouse-plugin-darwin-arm64.zip", + "win-x64": "https://github.com/debba/tabularis-clickhouse-plugin/releases/download/v0.1.0/clickhouse-plugin-win-x64.zip" + } + } + ] + }, + { + "id": "hackernews", + "name": "HackerNews", + "description": "Query Hacker News as SQL: a style exercise showcasing Tabularis plugin settings, from feeds and comment depth to user profiles and poll options.", + "author": "debba ", + "homepage": "https://github.com/debba/tabularis-hackernews-plugin", + "latest_version": "0.1.0", + "releases": [ + { + "version": "0.1.0", + "min_tabularis_version": "0.9.7", + "assets": { + "linux-x64": "https://github.com/debba/tabularis-hackernews-plugin/releases/download/v0.1.0/hackernews-plugin-linux-x64.zip", + "linux-arm64": "https://github.com/debba/tabularis-hackernews-plugin/releases/download/v0.1.0/hackernews-plugin-linux-arm64.zip", + "darwin-x64": "https://github.com/debba/tabularis-hackernews-plugin/releases/download/v0.1.0/hackernews-plugin-darwin-x64.zip", + "darwin-arm64": "https://github.com/debba/tabularis-hackernews-plugin/releases/download/v0.1.0/hackernews-plugin-darwin-arm64.zip", + "win-x64": "https://github.com/debba/tabularis-hackernews-plugin/releases/download/v0.1.0/hackernews-plugin-win-x64.zip" + } + } + ] } ] } diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 860a47d..78059eb 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -5925,7 +5925,7 @@ dependencies = [ [[package]] name = "tabularis" -version = "0.9.5" +version = "0.9.8" dependencies = [ "async-trait", "base64 0.22.1", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 8370c5b..225cc4e 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tabularis" -version = "0.9.5" +version = "0.9.8" description = "tabularis - A database manager for developers" authors = ["Debba"] edition = "2021" diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index e43b9b0..c4e8a3b 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -7,12 +7,14 @@ use tokio::task::AbortHandle; use urlencoding::encode; use uuid::Uuid; +use crate::credential_cache; use crate::keychain_utils; use crate::models::{ - ColumnDefinition, ConnectionParams, ForeignKey, Index, QueryResult, - RoutineInfo, RoutineParameter, SavedConnection, SshConnection, SshConnectionInput, - SshTestParams, TableColumn, TableInfo, TestConnectionRequest, + ColumnDefinition, ConnectionGroup, ConnectionParams, ConnectionsFile, ForeignKey, Index, + QueryResult, RoutineInfo, RoutineParameter, SavedConnection, SshConnection, + SshConnectionInput, SshTestParams, TableColumn, TableInfo, TestConnectionRequest, }; +use crate::persistence; use crate::ssh_tunnel::{get_tunnels, SshTunnel}; // Constants @@ -42,6 +44,66 @@ impl Default for QueryCancellationState { // --- Persistence Helpers --- +/// Load a single SSH connection by ID, fetching only its credentials from +/// keychain (via the in-memory cache). This is O(1) keychain calls versus the +/// O(N) behaviour of `get_ssh_connections`, which loads every saved SSH +/// connection and retrieves credentials for each one. +async fn get_ssh_connection_by_id( + app: &AppHandle, + ssh_id: &str, +) -> Result { + let path = get_ssh_config_path(app)?; + if !path.exists() { + return Err(format!("SSH connection with ID {} not found", ssh_id)); + } + + // File I/O off the Tokio executor thread + let content = tokio::task::spawn_blocking({ + let path = path.clone(); + move || std::fs::read_to_string(path).map_err(|e| e.to_string()) + }) + .await + .map_err(|e| e.to_string())??; + + let mut ssh = serde_json::from_str::>(&content) + .unwrap_or_default() + .into_iter() + .find(|s| s.id == ssh_id) + .ok_or_else(|| format!("SSH connection with ID {} not found", ssh_id))?; + + // Backward compat: determine auth_type if absent (mirrors get_ssh_connections logic) + if ssh.auth_type.is_none() { + ssh.auth_type = Some( + if ssh.key_file.as_ref().map_or(false, |k| !k.trim().is_empty()) { + "ssh_key".to_string() + } else { + "password".to_string() + }, + ); + } + + // Fetch credentials only for this connection, via the in-memory cache. + // On a warm cache hit this is a HashMap lookup (nanoseconds); on a cold miss + // it calls keychain once per credential and then caches the result. + if ssh.save_in_keychain.unwrap_or(false) { + // Clone the Arc out of the Tauri State so the closure owns it ('static bound) + let cache = app.state::>().inner().clone(); + let id = ssh.id.clone(); + let (pwd_r, pass_r) = tokio::task::spawn_blocking(move || { + let pwd = credential_cache::get_ssh_password_cached(&cache, &id); + let pass = credential_cache::get_ssh_key_passphrase_cached(&cache, &id); + (pwd, pass) + }) + .await + .map_err(|e| e.to_string())?; + + if let Ok(v) = pwd_r { if !v.trim().is_empty() { ssh.password = Some(v); } } + if let Ok(v) = pass_r { if !v.trim().is_empty() { ssh.key_passphrase = Some(v); } } + } + + Ok(ssh) +} + pub async fn expand_ssh_connection_params( app: &AppHandle, params: &ConnectionParams, @@ -50,25 +112,18 @@ pub async fn expand_ssh_connection_params( // If ssh_connection_id is set and SSH is enabled, load the SSH connection and merge it if params.ssh_enabled.unwrap_or(false) { - println!("[expand_ssh_connection_params] SSH is enabled"); if let Some(ssh_id) = ¶ms.ssh_connection_id { - println!( - "[expand_ssh_connection_params] Loading SSH connection: {}", - ssh_id - ); - let ssh_connections = get_ssh_connections(app.clone()).await?; - let ssh_conn = ssh_connections - .iter() - .find(|s| &s.id == ssh_id) - .ok_or_else(|| format!("SSH connection with ID {} not found", ssh_id))?; + // Use targeted lookup instead of loading all SSH connections: + // this calls keychain only for this specific connection (O(1)), + // and results are backed by the in-memory credential cache. + let ssh_conn = get_ssh_connection_by_id(app, ssh_id).await?; // Populate legacy SSH fields from the SSH connection - // Passwords are already loaded by get_ssh_connections - expanded_params.ssh_host = Some(ssh_conn.host.clone()); - expanded_params.ssh_port = Some(ssh_conn.port); - expanded_params.ssh_user = Some(ssh_conn.user.clone()); - expanded_params.ssh_password = ssh_conn.password.clone(); - expanded_params.ssh_key_file = ssh_conn.key_file.clone(); + expanded_params.ssh_host = Some(ssh_conn.host.clone()); + expanded_params.ssh_port = Some(ssh_conn.port); + expanded_params.ssh_user = Some(ssh_conn.user.clone()); + expanded_params.ssh_password = ssh_conn.password.clone(); + expanded_params.ssh_key_file = ssh_conn.key_file.clone(); expanded_params.ssh_key_passphrase = ssh_conn.key_passphrase.clone(); } } @@ -190,16 +245,19 @@ pub fn find_connection_by_id( if !path.exists() { return Err("Connection not found".into()); } - let content = fs::read_to_string(path).map_err(|e| e.to_string())?; - let connections: Vec = serde_json::from_str(&content).unwrap_or_default(); - let mut conn = connections + // Use persistence module to properly load connections (handles both old and new formats) + let conn_file = persistence::load_connections_file(&path)?; + let mut conn = conn_file.connections .into_iter() .find(|c| c.id == id) .ok_or_else(|| "Connection not found".to_string())?; - // Load passwords from keychain if needed (like get_connections in v0.8.8) + // Load passwords from keychain if needed, via the in-memory cache. + // On a warm cache hit this is a HashMap lookup (nanoseconds); on a cold miss + // it calls keychain once and caches the result for all subsequent reads. if conn.params.save_in_keychain.unwrap_or(false) { - match keychain_utils::get_db_password(&conn.id) { + let cache = app.state::>(); + match credential_cache::get_db_password_cached(&cache, &conn.id) { Ok(pwd) => conn.params.password = Some(pwd), Err(e) => eprintln!( "[Keyring Error] Failed to get DB password for {}: {}", @@ -207,12 +265,12 @@ pub fn find_connection_by_id( ), } if conn.params.ssh_enabled.unwrap_or(false) { - if let Ok(ssh_pwd) = keychain_utils::get_ssh_password(&conn.id) { + if let Ok(ssh_pwd) = credential_cache::get_ssh_password_cached(&cache, &conn.id) { if !ssh_pwd.trim().is_empty() { conn.params.ssh_password = Some(ssh_pwd); } } - if let Ok(ssh_passphrase) = keychain_utils::get_ssh_key_passphrase(&conn.id) { + if let Ok(ssh_passphrase) = credential_cache::get_ssh_key_passphrase_cached(&cache, &conn.id) { if !ssh_passphrase.trim().is_empty() { conn.params.ssh_key_passphrase = Some(ssh_passphrase); } @@ -225,6 +283,14 @@ pub fn find_connection_by_id( // --- Commands --- +#[tauri::command] +pub async fn get_connection_by_id( + app: AppHandle, + id: String, +) -> Result { + find_connection_by_id(&app, &id) +} + #[tauri::command] pub async fn get_schemas( app: AppHandle, @@ -337,28 +403,27 @@ pub async fn save_connection( log::info!("Saving new connection: {}", name); let path = get_config_path(&app)?; - let mut connections: Vec = if path.exists() { - let content = fs::read_to_string(&path).map_err(|e| e.to_string())?; - serde_json::from_str(&content).unwrap_or_default() - } else { - Vec::new() - }; + let mut conn_file = persistence::load_connections_file(&path).unwrap_or_default(); let id = Uuid::new_v4().to_string(); let mut params_to_save = params.clone(); if params.save_in_keychain.unwrap_or(false) { log::debug!("Storing passwords in keychain for connection: {}", name); + let cache = app.state::>(); if let Some(pwd) = ¶ms.password { keychain_utils::set_db_password(&id, pwd)?; + credential_cache::set_db_password_cached(&cache, &id, pwd); } if params.ssh_enabled.unwrap_or(false) { if let Some(ssh_pwd) = ¶ms.ssh_password { keychain_utils::set_ssh_password(&id, ssh_pwd)?; + credential_cache::set_ssh_password_cached(&cache, &id, ssh_pwd); } if let Some(ssh_passphrase) = ¶ms.ssh_key_passphrase { if !ssh_passphrase.trim().is_empty() { keychain_utils::set_ssh_key_passphrase(&id, ssh_passphrase)?; + credential_cache::set_ssh_key_passphrase_cached(&cache, &id, ssh_passphrase); } } } @@ -371,10 +436,11 @@ pub async fn save_connection( id: id.clone(), name: name.clone(), params: params_to_save, + group_id: None, + sort_order: None, }; - connections.push(new_conn.clone()); - let json = serde_json::to_string_pretty(&connections).map_err(|e| e.to_string())?; - fs::write(path, json).map_err(|e| e.to_string())?; + conn_file.connections.push(new_conn.clone()); + persistence::save_connections_file(&path, &conn_file)?; log::info!("Connection saved successfully: {} (ID: {})", name, id); @@ -392,20 +458,21 @@ pub async fn delete_connection(app: AppHandle, id: String) -> Res return Ok(()); } - let content = fs::read_to_string(&path).map_err(|e| e.to_string())?; - let mut connections: Vec = serde_json::from_str(&content).unwrap_or_default(); + let mut conn_file = persistence::load_connections_file(&path)?; - let initial_count = connections.len(); - connections.retain(|c| c.id != id); - let deleted = connections.len() < initial_count; + let initial_count = conn_file.connections.len(); + conn_file.connections.retain(|c| c.id != id); + let deleted = conn_file.connections.len() < initial_count; // Attempt to remove passwords from keychain (ignore if not found) keychain_utils::delete_db_password(&id).ok(); keychain_utils::delete_ssh_password(&id).ok(); keychain_utils::delete_ssh_key_passphrase(&id).ok(); + // Invalidate the in-memory cache for this connection + let cache = app.state::>(); + credential_cache::invalidate_all_for_connection(&cache, &id); - let json = serde_json::to_string_pretty(&connections).map_err(|e| e.to_string())?; - fs::write(path, json).map_err(|e| e.to_string())?; + persistence::save_connections_file(&path, &conn_file)?; if deleted { log::info!("Connection deleted successfully: {}", id); @@ -424,32 +491,38 @@ pub async fn update_connection( params: ConnectionParams, ) -> Result { let path = get_config_path(&app)?; - let content = fs::read_to_string(&path).map_err(|e| e.to_string())?; - let mut connections: Vec = serde_json::from_str(&content).unwrap_or_default(); + let mut conn_file = persistence::load_connections_file(&path)?; - let conn_idx = connections + let conn_idx = conn_file + .connections .iter() .position(|c| c.id == id) .ok_or("Connection not found")?; let mut params_to_save = params.clone(); + let cache = app.state::>(); if params.save_in_keychain.unwrap_or(false) { if let Some(pwd) = ¶ms.password { keychain_utils::set_db_password(&id, pwd)?; + credential_cache::set_db_password_cached(&cache, &id, pwd); } if params.ssh_enabled.unwrap_or(false) { if let Some(ssh_pwd) = ¶ms.ssh_password { keychain_utils::set_ssh_password(&id, ssh_pwd)?; + credential_cache::set_ssh_password_cached(&cache, &id, ssh_pwd); } if let Some(ssh_passphrase) = ¶ms.ssh_key_passphrase { if !ssh_passphrase.trim().is_empty() { keychain_utils::set_ssh_key_passphrase(&id, ssh_passphrase)?; + credential_cache::set_ssh_key_passphrase_cached(&cache, &id, ssh_passphrase); } } } else { keychain_utils::delete_ssh_password(&id).ok(); keychain_utils::delete_ssh_key_passphrase(&id).ok(); + credential_cache::invalidate_ssh_password(&cache, &id); + credential_cache::invalidate_ssh_key_passphrase(&cache, &id); } params_to_save.password = None; params_to_save.ssh_password = None; @@ -458,18 +531,28 @@ pub async fn update_connection( keychain_utils::delete_db_password(&id).ok(); keychain_utils::delete_ssh_password(&id).ok(); keychain_utils::delete_ssh_key_passphrase(&id).ok(); + credential_cache::invalidate_all_for_connection(&cache, &id); } + // Preserve existing group_id and sort_order from the original connection + let original_group_id = conn_file.connections[conn_idx].group_id.clone(); + let original_sort_order = conn_file.connections[conn_idx].sort_order; + let updated = SavedConnection { id: id.clone(), name, params: params_to_save, + group_id: original_group_id, + sort_order: original_sort_order, }; - connections[conn_idx] = updated.clone(); + conn_file.connections[conn_idx] = updated.clone(); - let json = serde_json::to_string_pretty(&connections).map_err(|e| e.to_string())?; - fs::write(path, json).map_err(|e| e.to_string())?; + persistence::save_connections_file(&path, &conn_file)?; + + // Invalidate the cached pool so reconnecting picks up any changed settings + // (e.g. max_connections). Only affects this specific connection. + crate::pool_manager::close_pool_with_id(¶ms, Some(&id)).await; let mut returned_conn = updated; returned_conn.params = params; @@ -482,27 +565,29 @@ pub async fn duplicate_connection( id: String, ) -> Result { let path = get_config_path(&app)?; - let content = fs::read_to_string(&path).map_err(|e| e.to_string())?; - let mut connections: Vec = serde_json::from_str(&content).unwrap_or_default(); + let mut conn_file = persistence::load_connections_file(&path)?; - let original_idx = connections + let original_idx = conn_file + .connections .iter() .position(|c| c.id == id) .ok_or("Connection not found")?; - let mut original = connections[original_idx].clone(); + let mut original = conn_file.connections[original_idx].clone(); - // Recover passwords if in keychain + let cache = app.state::>(); + + // Recover passwords if in keychain (via cache for fast repeat access) if original.params.save_in_keychain.unwrap_or(false) { - if let Ok(pwd) = keychain_utils::get_db_password(&original.id) { + if let Ok(pwd) = credential_cache::get_db_password_cached(&cache, &original.id) { original.params.password = Some(pwd); } if original.params.ssh_enabled.unwrap_or(false) { - if let Ok(ssh_pwd) = keychain_utils::get_ssh_password(&original.id) { + if let Ok(ssh_pwd) = credential_cache::get_ssh_password_cached(&cache, &original.id) { if !ssh_pwd.trim().is_empty() { original.params.ssh_password = Some(ssh_pwd); } } - if let Ok(ssh_passphrase) = keychain_utils::get_ssh_key_passphrase(&original.id) { + if let Ok(ssh_passphrase) = credential_cache::get_ssh_key_passphrase_cached(&cache, &original.id) { if !ssh_passphrase.trim().is_empty() { original.params.ssh_key_passphrase = Some(ssh_passphrase); } @@ -517,14 +602,17 @@ pub async fn duplicate_connection( if new_params.save_in_keychain.unwrap_or(false) { if let Some(pwd) = &new_params.password { keychain_utils::set_db_password(&new_id, pwd)?; + credential_cache::set_db_password_cached(&cache, &new_id, pwd); } if new_params.ssh_enabled.unwrap_or(false) { if let Some(ssh_pwd) = &new_params.ssh_password { keychain_utils::set_ssh_password(&new_id, ssh_pwd)?; + credential_cache::set_ssh_password_cached(&cache, &new_id, ssh_pwd); } if let Some(ssh_passphrase) = &new_params.ssh_key_passphrase { if !ssh_passphrase.trim().is_empty() { keychain_utils::set_ssh_key_passphrase(&new_id, ssh_passphrase)?; + credential_cache::set_ssh_key_passphrase_cached(&cache, &new_id, ssh_passphrase); } } } @@ -537,12 +625,13 @@ pub async fn duplicate_connection( id: new_id, name: format!("{} (Copy)", original.name), params: new_params, + group_id: original.group_id.clone(), // Copy to same group as original + sort_order: None, // Will be placed at end of group }; - connections.push(new_conn.clone()); + conn_file.connections.push(new_conn.clone()); - let json = serde_json::to_string_pretty(&connections).map_err(|e| e.to_string())?; - fs::write(path, json).map_err(|e| e.to_string())?; + persistence::save_connections_file(&path, &conn_file)?; let mut returned_conn = new_conn; // Return with passwords for frontend consistency @@ -565,13 +654,8 @@ pub async fn get_connections( migrate_ssh_connections(&app).await.ok(); let path = get_config_path(&app)?; - if !path.exists() { - return Ok(Vec::new()); - } - let content = fs::read_to_string(path).map_err(|e| e.to_string())?; - let connections: Vec = serde_json::from_str(&content).unwrap_or_default(); - - Ok(connections) + // Use persistence function that handles both old and new formats + persistence::load_connections(&path) } // ==================== SSH Connection Management ==================== @@ -583,8 +667,9 @@ async fn migrate_ssh_connections(app: &AppHandle) -> Result<(), S return Ok(()); // Nothing to migrate } - let content = fs::read_to_string(&conn_path).map_err(|e| e.to_string())?; - let connections: Vec = serde_json::from_str(&content).unwrap_or_default(); + // Load connections using persistence (handles both old and new formats) + let mut conn_file = persistence::load_connections_file(&conn_path)?; + let connections = &conn_file.connections; // Check if any connections have old embedded SSH params let needs_migration = connections @@ -608,7 +693,7 @@ async fn migrate_ssh_connections(app: &AppHandle) -> Result<(), S let mut migrated_connections = Vec::new(); let mut ssh_connection_map: HashMap = HashMap::new(); // (ssh_key -> ssh_id) - for mut conn in connections { + for mut conn in conn_file.connections.clone() { if conn.params.ssh_enabled.unwrap_or(false) && conn.params.ssh_connection_id.is_none() { // Extract SSH params if let (Some(host), Some(user)) = (&conn.params.ssh_host, &conn.params.ssh_user) { @@ -628,12 +713,12 @@ async fn migrate_ssh_connections(app: &AppHandle) -> Result<(), S // Migrate credentials from connection keychain to SSH keychain if conn.params.save_in_keychain.unwrap_or(false) { - if let Ok(ssh_pwd) = keychain_utils::get_ssh_password(&conn.id) { + if let Ok(ssh_pwd) = keychain_utils::get_ssh_password(&conn.id, &conn.name) { if !ssh_pwd.trim().is_empty() { keychain_utils::set_ssh_password(&new_ssh_id, &ssh_pwd).ok(); } } - if let Ok(ssh_pass) = keychain_utils::get_ssh_key_passphrase(&conn.id) { + if let Ok(ssh_pass) = keychain_utils::get_ssh_key_passphrase(&conn.id, &conn.name) { if !ssh_pass.trim().is_empty() { keychain_utils::set_ssh_key_passphrase(&new_ssh_id, &ssh_pass).ok(); } @@ -685,10 +770,9 @@ async fn migrate_ssh_connections(app: &AppHandle) -> Result<(), S let ssh_json = serde_json::to_string_pretty(&ssh_connections).map_err(|e| e.to_string())?; fs::write(ssh_path, ssh_json).map_err(|e| e.to_string())?; - // Save migrated connections - let conn_json = - serde_json::to_string_pretty(&migrated_connections).map_err(|e| e.to_string())?; - fs::write(conn_path, conn_json).map_err(|e| e.to_string())?; + // Save migrated connections using new format (preserving groups) + conn_file.connections = migrated_connections; + persistence::save_connections_file(&conn_path, &conn_file)?; println!( "[Migration] Successfully migrated {} SSH connections", @@ -705,37 +789,67 @@ pub async fn get_ssh_connections( if !path.exists() { return Ok(Vec::new()); } - let content = fs::read_to_string(path).map_err(|e| e.to_string())?; + + // File I/O off the Tokio executor thread + let content = tokio::task::spawn_blocking({ + let path = path.clone(); + move || std::fs::read_to_string(path).map_err(|e| e.to_string()) + }) + .await + .map_err(|e| e.to_string())??; + let mut ssh_connections: Vec = serde_json::from_str(&content).unwrap_or_default(); - // Populate passwords from keychain if needed and determine auth_type for backward compatibility + // Backward compatibility: determine auth_type if missing for ssh in &mut ssh_connections { - // Backward compatibility: determine auth_type if missing if ssh.auth_type.is_none() { ssh.auth_type = Some( - if ssh.key_file.is_some() - && ssh - .key_file - .as_ref() - .map_or(false, |k| !k.trim().is_empty()) - { + if ssh.key_file.as_ref().map_or(false, |k| !k.trim().is_empty()) { "ssh_key".to_string() } else { "password".to_string() }, ); } + } + + // Fetch credentials for all connections that use keychain, in a single + // spawn_blocking call. The cache is checked first (HashMap lookup), so + // subsequent calls (e.g. from the UI refreshing the list) are near-instant. + let ids_needing_creds: Vec = ssh_connections + .iter() + .filter(|s| s.save_in_keychain.unwrap_or(false)) + .map(|s| s.id.clone()) + .collect(); + + if !ids_needing_creds.is_empty() { + // Clone the Arc out of the Tauri State so the closure owns it ('static bound) + let cache = app.state::>().inner().clone(); + let credentials = tokio::task::spawn_blocking(move || { + ids_needing_creds + .into_iter() + .map(|id| { + let pwd = credential_cache::get_ssh_password_cached(&cache, &id); + let pass = credential_cache::get_ssh_key_passphrase_cached(&cache, &id); + (id, pwd, pass) + }) + .collect::>() + }) + .await + .map_err(|e| e.to_string())?; - if ssh.save_in_keychain.unwrap_or(false) { - if let Ok(pwd) = keychain_utils::get_ssh_password(&ssh.id) { - if !pwd.trim().is_empty() { - ssh.password = Some(pwd); + for (id, pwd_r, pass_r) in credentials { + if let Some(ssh) = ssh_connections.iter_mut().find(|s| s.id == id) { + if let Ok(pwd) = pwd_r { + if !pwd.trim().is_empty() { + ssh.password = Some(pwd); + } } - } - if let Ok(passphrase) = keychain_utils::get_ssh_key_passphrase(&ssh.id) { - if !passphrase.trim().is_empty() { - ssh.key_passphrase = Some(passphrase); + if let Ok(pass) = pass_r { + if !pass.trim().is_empty() { + ssh.key_passphrase = Some(pass); + } } } } @@ -767,8 +881,10 @@ pub async fn save_ssh_connection( user: ssh.user, auth_type: Some(ssh.auth_type.clone()), password: if ssh.save_in_keychain.unwrap_or(false) { + let cache = app.state::>(); if let Some(pwd) = &ssh.password { keychain_utils::set_ssh_password(&id, pwd)?; + credential_cache::set_ssh_password_cached(&cache, &id, pwd); } None } else { @@ -776,9 +892,11 @@ pub async fn save_ssh_connection( }, key_file: ssh.key_file.clone(), key_passphrase: if ssh.save_in_keychain.unwrap_or(false) { + let cache = app.state::>(); if let Some(passphrase) = &ssh.key_passphrase { if !passphrase.trim().is_empty() { keychain_utils::set_ssh_key_passphrase(&id, passphrase)?; + credential_cache::set_ssh_key_passphrase_cached(&cache, &id, passphrase); } } None @@ -815,18 +933,23 @@ pub async fn update_ssh_connection( .position(|s| s.id == id) .ok_or("SSH connection not found")?; + let cache = app.state::>(); if ssh.save_in_keychain.unwrap_or(false) { if let Some(pwd) = &ssh.password { keychain_utils::set_ssh_password(&id, pwd)?; + credential_cache::set_ssh_password_cached(&cache, &id, pwd); } if let Some(passphrase) = &ssh.key_passphrase { if !passphrase.trim().is_empty() { keychain_utils::set_ssh_key_passphrase(&id, passphrase)?; + credential_cache::set_ssh_key_passphrase_cached(&cache, &id, passphrase); } } } else { keychain_utils::delete_ssh_password(&id).ok(); keychain_utils::delete_ssh_key_passphrase(&id).ok(); + credential_cache::invalidate_ssh_password(&cache, &id); + credential_cache::invalidate_ssh_key_passphrase(&cache, &id); } let ssh_to_save = SshConnection { @@ -877,9 +1000,12 @@ pub async fn delete_ssh_connection( ssh_connections.retain(|s| s.id != id); - // Remove credentials from keychain + // Remove credentials from keychain and invalidate cache keychain_utils::delete_ssh_password(&id).ok(); keychain_utils::delete_ssh_key_passphrase(&id).ok(); + let cache = app.state::>(); + credential_cache::invalidate_ssh_password(&cache, &id); + credential_cache::invalidate_ssh_key_passphrase(&cache, &id); let json = serde_json::to_string_pretty(&ssh_connections).map_err(|e| e.to_string())?; fs::write(path, json).map_err(|e| e.to_string())?; @@ -907,7 +1033,7 @@ pub async fn test_ssh_connection( serde_json::from_str(&content).unwrap_or_default(); connections.into_iter().find(|c| c.id == conn_id) }, - |conn_id| keychain_utils::get_ssh_password(conn_id), + |conn_id| keychain_utils::get_ssh_password(conn_id, ""), ); // Resolve passphrase using same logic @@ -924,7 +1050,7 @@ pub async fn test_ssh_connection( serde_json::from_str(&content).unwrap_or_default(); connections.into_iter().find(|c| c.id == conn_id) }, - |conn_id| keychain_utils::get_ssh_key_passphrase(conn_id), + |conn_id| keychain_utils::get_ssh_key_passphrase(conn_id, ""), |conn| { conn.key_passphrase .as_ref() @@ -962,7 +1088,7 @@ pub async fn test_connection( }; expanded_params.password = resolve_test_connection_password(&request.params, saved_conn.as_ref(), |conn_id| { - keychain_utils::get_db_password(conn_id) + keychain_utils::get_db_password(conn_id, "") }); } @@ -1012,6 +1138,7 @@ mod tests { username: Some("root".to_string()), password: None, database: DatabaseSelection::Single("testdb".to_string()), + ssl_mode: None, ssh_enabled: None, ssh_connection_id: None, ssh_host: None, @@ -1034,6 +1161,8 @@ mod tests { save_in_keychain: Some(save_in_keychain), ..base_params() }, + group_id: None, + sort_order: None, } } @@ -1090,6 +1219,7 @@ mod tests { username: Some(username.to_string()), password: password.map(|p| p.to_string()), database: DatabaseSelection::Single(database.to_string()), + ssl_mode: None, ssh_enabled: None, ssh_connection_id: None, ssh_host: None, @@ -1367,6 +1497,7 @@ mod tests { username: Some("dbuser".to_string()), password: Some("dbpass".to_string()), database: DatabaseSelection::Single("testdb".to_string()), + ssl_mode: None, ssh_enabled: Some(true), ssh_connection_id: None, ssh_host: Some(ssh_host.to_string()), @@ -1477,7 +1608,7 @@ pub async fn list_databases( }; expanded_params.password = resolve_test_connection_password(&request.params, saved_conn.as_ref(), |conn_id| { - keychain_utils::get_db_password(conn_id) + keychain_utils::get_db_password(conn_id, "") }); } @@ -2509,3 +2640,166 @@ pub async fn get_driver_manifest( .await .map(|d| d.manifest().clone()) } + +// ==================== Connection Groups Management ==================== + +#[tauri::command] +pub async fn get_connection_groups( + app: AppHandle, +) -> Result, String> { + let path = get_config_path(&app)?; + persistence::load_groups(&path) +} + +#[tauri::command] +pub async fn get_connections_with_groups( + app: AppHandle, +) -> Result { + // Run migration if needed + migrate_ssh_connections(&app).await.ok(); + + let path = get_config_path(&app)?; + persistence::load_connections_file(&path) +} + +#[tauri::command] +pub async fn create_connection_group( + app: AppHandle, + name: String, +) -> Result { + let path = get_config_path(&app)?; + let mut file = persistence::load_connections_file(&path).unwrap_or_default(); + + // Calculate next sort_order + let max_order = file.groups.iter().map(|g| g.sort_order).max().unwrap_or(-1); + + let group = ConnectionGroup { + id: Uuid::new_v4().to_string(), + name, + collapsed: false, + sort_order: max_order + 1, + }; + + file.groups.push(group.clone()); + persistence::save_connections_file(&path, &file)?; + + Ok(group) +} + +#[tauri::command] +pub async fn update_connection_group( + app: AppHandle, + id: String, + name: Option, + collapsed: Option, + sort_order: Option, +) -> Result { + let path = get_config_path(&app)?; + let mut file = persistence::load_connections_file(&path)?; + + let group = file + .groups + .iter_mut() + .find(|g| g.id == id) + .ok_or_else(|| format!("Group with ID {} not found", id))?; + + if let Some(n) = name { + group.name = n; + } + if let Some(c) = collapsed { + group.collapsed = c; + } + if let Some(o) = sort_order { + group.sort_order = o; + } + + let updated = group.clone(); + persistence::save_connections_file(&path, &file)?; + + Ok(updated) +} + +#[tauri::command] +pub async fn delete_connection_group( + app: AppHandle, + id: String, +) -> Result<(), String> { + let path = get_config_path(&app)?; + let mut file = persistence::load_connections_file(&path)?; + + // Remove connections from the group (set group_id to None) + for conn in &mut file.connections { + if conn.group_id.as_ref() == Some(&id) { + conn.group_id = None; + } + } + + // Remove the group + file.groups.retain(|g| g.id != id); + persistence::save_connections_file(&path, &file)?; + + Ok(()) +} + +#[tauri::command] +pub async fn move_connection_to_group( + app: AppHandle, + connection_id: String, + group_id: Option, + sort_order: Option, +) -> Result { + let path = get_config_path(&app)?; + let mut file = persistence::load_connections_file(&path)?; + + let conn = file + .connections + .iter_mut() + .find(|c| c.id == connection_id) + .ok_or_else(|| format!("Connection with ID {} not found", connection_id))?; + + conn.group_id = group_id; + if let Some(order) = sort_order { + conn.sort_order = Some(order); + } + + let updated = conn.clone(); + persistence::save_connections_file(&path, &file)?; + + Ok(updated) +} + +#[tauri::command] +pub async fn reorder_groups( + app: AppHandle, + group_orders: Vec<(String, i32)>, +) -> Result<(), String> { + let path = get_config_path(&app)?; + let mut file = persistence::load_connections_file(&path)?; + + for (group_id, order) in group_orders { + if let Some(group) = file.groups.iter_mut().find(|g| g.id == group_id) { + group.sort_order = order; + } + } + + persistence::save_connections_file(&path, &file)?; + Ok(()) +} + +#[tauri::command] +pub async fn reorder_connections_in_group( + app: AppHandle, + connection_orders: Vec<(String, i32)>, +) -> Result<(), String> { + let path = get_config_path(&app)?; + let mut file = persistence::load_connections_file(&path)?; + + for (conn_id, order) in connection_orders { + if let Some(conn) = file.connections.iter_mut().find(|c| c.id == conn_id) { + conn.sort_order = Some(order); + } + } + + persistence::save_connections_file(&path, &file)?; + Ok(()) +} diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index 503a9f8..0c65323 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -1,5 +1,4 @@ use crate::keychain_utils; -use crate::paths::get_app_config_dir; use serde::{Deserialize, Serialize}; use std::fs; use std::path::PathBuf; @@ -8,6 +7,14 @@ use tauri::Manager; use std::collections::HashMap; +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +#[serde(rename_all = "camelCase")] +pub struct PluginConfig { + pub interpreter: Option, + #[serde(default)] + pub settings: HashMap, +} + #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "camelCase")] pub struct AppConfig { @@ -32,7 +39,7 @@ pub struct AppConfig { pub max_blob_size: Option, pub active_external_drivers: Option>, pub custom_registry_url: Option, - pub max_connections: Option, + pub plugins: Option>, } pub fn get_config_dir(app: &AppHandle) -> Option { @@ -131,8 +138,9 @@ pub fn save_config(app: AppHandle, config: AppConfig) -> Result<(), String> { if config.active_external_drivers.is_some() { existing_config.active_external_drivers = config.active_external_drivers; } - if config.max_connections.is_some() { - existing_config.max_connections = config.max_connections; + + if config.plugins.is_some() { + existing_config.plugins = config.plugins; } let content = serde_json::to_string_pretty(&existing_config).map_err(|e| e.to_string())?; @@ -218,19 +226,8 @@ pub fn delete_ai_key(provider: String) -> Result<(), String> { keychain_utils::delete_ai_key(&provider) } -pub const DEFAULT_MAX_CONNECTIONS: u32 = 1; +pub const DEFAULT_MAX_CONNECTIONS: u32 = 10; -/// Get the configured maximum pool connections, or DEFAULT_MAX_CONNECTIONS if not set. -/// Does not require AppHandle — reads config.json directly via the paths module. -pub fn get_pool_max_connections() -> u32 { - let config_path = get_app_config_dir().join("config.json"); - if let Ok(content) = fs::read_to_string(config_path) { - if let Ok(config) = serde_json::from_str::(&content) { - return config.max_connections.unwrap_or(DEFAULT_MAX_CONNECTIONS); - } - } - DEFAULT_MAX_CONNECTIONS -} /// Get the configured maximum BLOB size in bytes, or DEFAULT_MAX_BLOB_SIZE if not set pub fn get_max_blob_size(app: &AppHandle) -> u64 { diff --git a/src-tauri/src/credential_cache.rs b/src-tauri/src/credential_cache.rs new file mode 100644 index 0000000..34cc76b --- /dev/null +++ b/src-tauri/src/credential_cache.rs @@ -0,0 +1,175 @@ +use std::collections::HashMap; +use std::sync::Mutex; + +/// Cached credential value. +/// `Present` = keychain returned a value. +/// `Absent` = keychain confirmed no entry exists (NoEntry). Caching misses +/// avoids redundant IPC round-trips on every DB command. +#[derive(Clone, Debug)] +pub enum CacheEntry { + Present(String), + Absent, +} + +/// In-memory credential cache backed by four HashMaps. +/// +/// Uses `std::sync::Mutex` (not `tokio::sync::Mutex`) because all critical +/// sections are pure HashMap operations (nanoseconds) and are never held +/// across `.await` points. Wrapping the struct in `Arc` lets callers clone +/// it into `tokio::task::spawn_blocking` closures. +pub struct CredentialCache { + pub db_passwords: Mutex>, + pub ssh_passwords: Mutex>, + pub ssh_passphrases: Mutex>, + pub ai_keys: Mutex>, +} + +impl Default for CredentialCache { + fn default() -> Self { + Self { + db_passwords: Mutex::new(HashMap::new()), + ssh_passwords: Mutex::new(HashMap::new()), + ssh_passphrases: Mutex::new(HashMap::new()), + ai_keys: Mutex::new(HashMap::new()), + } + } +} + +// ─── Read-through helpers ───────────────────────────────────────────────────── +// These functions are synchronous and intended to be called from inside +// `tokio::task::spawn_blocking` when used in async contexts. + +/// Get DB password: check cache first, fall through to keychain on miss. +pub fn get_db_password_cached(cache: &CredentialCache, connection_id: &str) -> Result { + { + let guard = cache.db_passwords.lock().unwrap(); + match guard.get(connection_id) { + Some(CacheEntry::Present(v)) => return Ok(v.clone()), + Some(CacheEntry::Absent) => return Err("No entry".to_string()), + None => {} + } + } + let result = crate::keychain_utils::get_db_password(connection_id, ""); + { + let mut guard = cache.db_passwords.lock().unwrap(); + guard.insert(connection_id.to_string(), match &result { + Ok(v) => CacheEntry::Present(v.clone()), + Err(_) => CacheEntry::Absent, + }); + } + result +} + +/// Get SSH password: check cache first, fall through to keychain on miss. +pub fn get_ssh_password_cached(cache: &CredentialCache, connection_id: &str) -> Result { + { + let guard = cache.ssh_passwords.lock().unwrap(); + match guard.get(connection_id) { + Some(CacheEntry::Present(v)) => return Ok(v.clone()), + Some(CacheEntry::Absent) => return Err("No entry".to_string()), + None => {} + } + } + let result = crate::keychain_utils::get_ssh_password(connection_id, ""); + { + let mut guard = cache.ssh_passwords.lock().unwrap(); + guard.insert(connection_id.to_string(), match &result { + Ok(v) => CacheEntry::Present(v.clone()), + Err(_) => CacheEntry::Absent, + }); + } + result +} + +/// Get SSH key passphrase: check cache first, fall through to keychain on miss. +pub fn get_ssh_key_passphrase_cached(cache: &CredentialCache, connection_id: &str) -> Result { + { + let guard = cache.ssh_passphrases.lock().unwrap(); + match guard.get(connection_id) { + Some(CacheEntry::Present(v)) => return Ok(v.clone()), + Some(CacheEntry::Absent) => return Err("No entry".to_string()), + None => {} + } + } + let result = crate::keychain_utils::get_ssh_key_passphrase(connection_id, ""); + { + let mut guard = cache.ssh_passphrases.lock().unwrap(); + guard.insert(connection_id.to_string(), match &result { + Ok(v) => CacheEntry::Present(v.clone()), + Err(_) => CacheEntry::Absent, + }); + } + result +} + +/// Get AI API key: check cache first, fall through to keychain on miss. +pub fn get_ai_key_cached(cache: &CredentialCache, provider: &str) -> Result { + { + let guard = cache.ai_keys.lock().unwrap(); + match guard.get(provider) { + Some(CacheEntry::Present(v)) => return Ok(v.clone()), + Some(CacheEntry::Absent) => return Err("No entry".to_string()), + None => {} + } + } + let result = crate::keychain_utils::get_ai_key(provider); + { + let mut guard = cache.ai_keys.lock().unwrap(); + guard.insert(provider.to_string(), match &result { + Ok(v) => CacheEntry::Present(v.clone()), + Err(_) => CacheEntry::Absent, + }); + } + result +} + +// ─── Write-through helpers ──────────────────────────────────────────────────── +// Call these AFTER the corresponding keychain_utils::set_* succeeds. + +pub fn set_db_password_cached(cache: &CredentialCache, connection_id: &str, password: &str) { + cache.db_passwords.lock().unwrap() + .insert(connection_id.to_string(), CacheEntry::Present(password.to_string())); +} + +pub fn set_ssh_password_cached(cache: &CredentialCache, connection_id: &str, password: &str) { + cache.ssh_passwords.lock().unwrap() + .insert(connection_id.to_string(), CacheEntry::Present(password.to_string())); +} + +pub fn set_ssh_key_passphrase_cached(cache: &CredentialCache, connection_id: &str, passphrase: &str) { + cache.ssh_passphrases.lock().unwrap() + .insert(connection_id.to_string(), CacheEntry::Present(passphrase.to_string())); +} + +pub fn set_ai_key_cached(cache: &CredentialCache, provider: &str, key: &str) { + cache.ai_keys.lock().unwrap() + .insert(provider.to_string(), CacheEntry::Present(key.to_string())); +} + +// ─── Invalidation helpers ───────────────────────────────────────────────────── +// Call these AFTER the corresponding keychain_utils::delete_* succeeds. +// Removing the entry forces the next read to re-query the keychain (which will +// return NoEntry, caching Absent). + +pub fn invalidate_db_password(cache: &CredentialCache, connection_id: &str) { + cache.db_passwords.lock().unwrap().remove(connection_id); +} + +pub fn invalidate_ssh_password(cache: &CredentialCache, connection_id: &str) { + cache.ssh_passwords.lock().unwrap().remove(connection_id); +} + +pub fn invalidate_ssh_key_passphrase(cache: &CredentialCache, connection_id: &str) { + cache.ssh_passphrases.lock().unwrap().remove(connection_id); +} + +pub fn invalidate_ai_key(cache: &CredentialCache, provider: &str) { + cache.ai_keys.lock().unwrap().remove(provider); +} + +/// Invalidate all cached credentials for a connection ID (e.g. on delete). +pub fn invalidate_all_for_connection(cache: &CredentialCache, connection_id: &str) { + cache.db_passwords.lock().unwrap().remove(connection_id); + cache.ssh_passwords.lock().unwrap().remove(connection_id); + cache.ssh_passphrases.lock().unwrap().remove(connection_id); +} diff --git a/src-tauri/src/drivers/driver_trait.rs b/src-tauri/src/drivers/driver_trait.rs index 63a7ddf..5e9a0d6 100644 --- a/src-tauri/src/drivers/driver_trait.rs +++ b/src-tauri/src/drivers/driver_trait.rs @@ -26,6 +26,13 @@ pub struct DriverCapabilities { /// Folder-based database (e.g. CSV directory); connection points to a directory instead of a file. #[serde(default)] pub folder_based: bool, + /// Enables connection string import input in the connection modal. + /// Defaults to `true` for backward compatibility. + #[serde(default = "default_true", alias = "connectionString")] + pub connection_string: bool, + /// Optional placeholder example shown for connection string input. + #[serde(default, alias = "connectionStringExample")] + pub connection_string_example: String, /// Character used to quote identifiers (e.g. `"` for PostgreSQL, `` ` `` for MySQL). #[serde(default = "default_double_quote")] pub identifier_quote: String, @@ -51,6 +58,10 @@ pub struct DriverCapabilities { /// Supports creating foreign key constraints (properly enforced). #[serde(default)] pub create_foreign_keys: bool, + /// API-based plugin that requires no host, port, or credentials. + /// When `true`, the connection form is hidden and database validation is skipped. + #[serde(default)] + pub no_connection_required: bool, } fn default_double_quote() -> String { @@ -61,6 +72,23 @@ fn default_true() -> bool { true } +/// A single user-configurable setting declared in a plugin's manifest. +#[derive(Serialize, Deserialize, Clone, Debug, Default)] +pub struct PluginSettingDefinition { + pub key: String, + pub label: String, + #[serde(rename = "type")] + pub setting_type: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub default: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(default)] + pub required: bool, + #[serde(default)] + pub options: Vec, +} + /// Metadata describing a registered driver plugin. #[derive(Debug, Serialize, Deserialize, Clone)] pub struct PluginManifest { @@ -90,6 +118,9 @@ pub struct PluginManifest { /// Lucide-compatible icon name (e.g. `"network"`, `"database"`). Empty string falls back to a generic icon. #[serde(default)] pub icon: String, + /// Plugin-declared settings definitions. Empty for built-in drivers. + #[serde(default)] + pub settings: Vec, } /// The complete interface every database driver plugin must implement. diff --git a/src-tauri/src/drivers/mysql/mod.rs b/src-tauri/src/drivers/mysql/mod.rs index 1791578..1d35817 100644 --- a/src-tauri/src/drivers/mysql/mod.rs +++ b/src-tauri/src/drivers/mysql/mod.rs @@ -1041,6 +1041,8 @@ impl MysqlDriver { routines: true, file_based: false, folder_based: false, + connection_string: true, + connection_string_example: "mysql://user:pass@localhost:3306/db".into(), identifier_quote: "`".into(), alter_primary_key: true, auto_increment_keyword: "AUTO_INCREMENT".into(), @@ -1048,11 +1050,13 @@ impl MysqlDriver { inline_pk: false, alter_column: true, create_foreign_keys: true, + no_connection_required: false, }, is_builtin: true, default_username: "root".to_string(), color: "#f97316".to_string(), icon: "mysql".to_string(), + settings: vec![], }, } } diff --git a/src-tauri/src/drivers/postgres/mod.rs b/src-tauri/src/drivers/postgres/mod.rs index 320cb33..b1bb580 100644 --- a/src-tauri/src/drivers/postgres/mod.rs +++ b/src-tauri/src/drivers/postgres/mod.rs @@ -1231,6 +1231,8 @@ impl PostgresDriver { routines: true, file_based: false, folder_based: false, + connection_string: true, + connection_string_example: "postgres://user:pass@localhost:5432/db".into(), identifier_quote: "\"".into(), alter_primary_key: true, auto_increment_keyword: String::new(), @@ -1238,11 +1240,13 @@ impl PostgresDriver { inline_pk: false, alter_column: true, create_foreign_keys: true, + no_connection_required: false, }, is_builtin: true, default_username: "postgres".to_string(), color: "#3b82f6".to_string(), icon: "postgres".to_string(), + settings: vec![], }, } } @@ -1623,4 +1627,4 @@ impl DatabaseDriver for PostgresDriver { foreign_keys: fks_map.remove(&t.name).unwrap_or_default(), }).collect()) } -} \ No newline at end of file +} diff --git a/src-tauri/src/drivers/sqlite/mod.rs b/src-tauri/src/drivers/sqlite/mod.rs index eda96ad..311cd56 100644 --- a/src-tauri/src/drivers/sqlite/mod.rs +++ b/src-tauri/src/drivers/sqlite/mod.rs @@ -723,7 +723,6 @@ mod tests { use super::*; use crate::models::{ConnectionParams, DatabaseSelection}; use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions}; - use std::str::FromStr; use tempfile::NamedTempFile; async fn setup_test_db() -> (ConnectionParams, NamedTempFile) { @@ -737,6 +736,7 @@ mod tests { port: None, username: None, password: None, + ssl_mode: None, ssh_enabled: None, ssh_connection_id: None, ssh_host: None, @@ -750,10 +750,9 @@ mod tests { }; // Initialize DB with a table - // We use create_if_missing=true to ensure it works even if tempfile behavior varies - let url = format!("sqlite://{}", path); - let options = SqliteConnectOptions::from_str(&url) - .unwrap() + // Use .filename() to handle Windows paths correctly (avoids backslash issues in URLs) + let options = SqliteConnectOptions::new() + .filename(&path) .create_if_missing(true); let pool = SqlitePoolOptions::new() @@ -863,6 +862,8 @@ impl SqliteDriver { routines: false, file_based: true, folder_based: false, + connection_string: false, + connection_string_example: String::new(), identifier_quote: "\"".into(), alter_primary_key: true, auto_increment_keyword: "AUTOINCREMENT".into(), @@ -870,11 +871,13 @@ impl SqliteDriver { inline_pk: true, alter_column: false, create_foreign_keys: false, + no_connection_required: false, }, is_builtin: true, default_username: String::new(), color: "#06b6d4".to_string(), icon: "sqlite".to_string(), + settings: vec![], }, } } @@ -889,7 +892,21 @@ impl DatabaseDriver for SqliteDriver { } fn build_connection_url(&self, params: &crate::models::ConnectionParams) -> Result { - Ok(format!("sqlite://{}", params.database)) + // Normalize path separators for URL format (Windows backslashes → forward slashes) + let path = params.database.to_string().replace('\\', "/"); + // Windows absolute paths (e.g. C:/path/file) need sqlite:///C:/... (3 slashes = empty authority + abs path) + // Unix absolute paths already start with / so sqlite:// + /path = sqlite:///path + if path.len() >= 2 && path.chars().nth(1) == Some(':') { + Ok(format!("sqlite:///{}", path)) + } else { + Ok(format!("sqlite://{}", path)) + } + } + + async fn test_connection(&self, params: &crate::models::ConnectionParams) -> Result<(), String> { + // Use pool manager directly to avoid URL formatting issues with Windows paths + crate::pool_manager::get_sqlite_pool(params).await?; + Ok(()) } async fn get_databases(&self, params: &crate::models::ConnectionParams) -> Result, String> { diff --git a/src-tauri/src/keychain_utils.rs b/src-tauri/src/keychain_utils.rs index f79f758..5275bce 100644 --- a/src-tauri/src/keychain_utils.rs +++ b/src-tauri/src/keychain_utils.rs @@ -12,8 +12,12 @@ pub fn set_db_password(connection_id: &str, password: &str) -> Result<(), String }) } -pub fn get_db_password(connection_id: &str) -> Result { - println!("[Keychain] Getting DB password for {}", connection_id); +pub fn get_db_password(connection_id: &str, connection_name: &str) -> Result { + if connection_name.is_empty() { + println!("[Keychain] Getting DB password for {}", connection_id); + } else { + println!("[Keychain] Getting DB password for {} ({})", connection_name, connection_id); + } let entry = Entry::new(SERVICE_NAME, &format!("{}:db", connection_id)).map_err(|e| e.to_string())?; match entry.get_password() { @@ -51,8 +55,12 @@ pub fn set_ssh_password(connection_id: &str, password: &str) -> Result<(), Strin }) } -pub fn get_ssh_password(connection_id: &str) -> Result { - println!("[Keychain] Getting SSH password for {}", connection_id); +pub fn get_ssh_password(connection_id: &str, connection_name: &str) -> Result { + if connection_name.is_empty() { + println!("[Keychain] Getting SSH password for {}", connection_id); + } else { + println!("[Keychain] Getting SSH password for {} ({})", connection_name, connection_id); + } let entry = Entry::new(SERVICE_NAME, &format!("{}:ssh", connection_id)).map_err(|e| e.to_string())?; match entry.get_password() { @@ -93,11 +101,12 @@ pub fn set_ssh_key_passphrase(connection_id: &str, passphrase: &str) -> Result<( }) } -pub fn get_ssh_key_passphrase(connection_id: &str) -> Result { - println!( - "[Keychain] Getting SSH key passphrase for {}", - connection_id - ); +pub fn get_ssh_key_passphrase(connection_id: &str, connection_name: &str) -> Result { + if connection_name.is_empty() { + println!("[Keychain] Getting SSH key passphrase for {}", connection_id); + } else { + println!("[Keychain] Getting SSH key passphrase for {} ({})", connection_name, connection_id); + } let entry = Entry::new(SERVICE_NAME, &format!("{}:ssh_passphrase", connection_id)) .map_err(|e| e.to_string())?; match entry.get_password() { diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index bfb252f..a7a62b7 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,5 +1,6 @@ pub mod ai; pub mod commands; +pub mod credential_cache; pub mod config; pub mod dump_commands; // Added pub mod dump_utils; @@ -141,6 +142,7 @@ pub fn run() { .manage(export::ExportCancellationState::default()) .manage(dump_commands::DumpCancellationState::default()) .manage(log_buffer) + .manage(std::sync::Arc::new(credential_cache::CredentialCache::default())) .setup(move |app| { // Read persisted config to know which external plugins are enabled. // `None` means no preference has been saved yet → load all installed plugins. @@ -154,7 +156,7 @@ pub fn run() { drivers::registry::register_driver(drivers::sqlite::SqliteDriver::new()).await; // Load only enabled external plugins (or all if no preference saved). - crate::plugins::manager::load_plugins(active_ext_drivers.as_deref()).await; + crate::plugins::manager::load_plugins(&app.handle(), active_ext_drivers.as_deref()).await; }); // Open devtools automatically in debug mode @@ -181,6 +183,7 @@ pub fn run() { commands::update_connection, commands::duplicate_connection, commands::get_connections, + commands::get_connection_by_id, commands::disconnect_connection, commands::get_data_types, // SSH Connections @@ -189,6 +192,15 @@ pub fn run() { commands::update_ssh_connection, commands::delete_ssh_connection, commands::test_ssh_connection, + // Connection Groups + commands::get_connection_groups, + commands::get_connections_with_groups, + commands::create_connection_group, + commands::update_connection_group, + commands::delete_connection_group, + commands::move_connection_to_group, + commands::reorder_groups, + commands::reorder_connections_in_group, commands::get_schemas, commands::get_available_databases, commands::get_tables, @@ -296,6 +308,8 @@ pub fn run() { plugins::commands::get_installed_plugins, plugins::commands::disable_plugin, plugins::commands::enable_plugin, + plugins::commands::get_plugin_manifest, + plugins::manager::get_plugin_startup_errors, // Task Manager task_manager::get_process_list, task_manager::get_system_stats, diff --git a/src-tauri/src/models.rs b/src-tauri/src/models.rs index 14920c7..7355587 100644 --- a/src-tauri/src/models.rs +++ b/src-tauri/src/models.rs @@ -95,6 +95,7 @@ pub struct ConnectionParams { pub username: Option, pub password: Option, pub database: DatabaseSelection, + pub ssl_mode: Option, // SSH Tunnel pub ssh_enabled: Option, pub ssh_connection_id: Option, @@ -115,6 +116,9 @@ pub struct ConnectionParams { // Connection ID for stable pooling (not persisted, set at runtime) #[serde(skip_serializing_if = "Option::is_none")] pub connection_id: Option, + // Per-connection pool size + #[serde(skip_serializing_if = "Option::is_none")] + pub max_connections: Option, } #[derive(Debug, Deserialize, Serialize, Clone)] @@ -122,6 +126,28 @@ pub struct SavedConnection { pub id: String, pub name: String, pub params: ConnectionParams, + #[serde(skip_serializing_if = "Option::is_none")] + pub group_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub sort_order: Option, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct ConnectionGroup { + pub id: String, + pub name: String, + #[serde(default)] + pub collapsed: bool, + #[serde(default)] + pub sort_order: i32, +} + +#[derive(Debug, Deserialize, Serialize, Clone, Default)] +pub struct ConnectionsFile { + #[serde(default)] + pub groups: Vec, + #[serde(default)] + pub connections: Vec, } #[derive(Debug, Deserialize, Serialize, Clone)] diff --git a/src-tauri/src/persistence.rs b/src-tauri/src/persistence.rs index 3749c36..9a05a45 100644 --- a/src-tauri/src/persistence.rs +++ b/src-tauri/src/persistence.rs @@ -1,40 +1,38 @@ -use crate::keychain_utils; -use crate::models::SavedConnection; +use crate::models::{ConnectionGroup, ConnectionsFile, SavedConnection}; use std::fs; use std::path::Path; -pub fn load_connections(path: &Path) -> Result, String> { +/// Load connections file (raw, no keychain reads). +/// Supports both old format (array of connections) and new format (with groups). +/// Use `load_connections` or `load_connections_with_passwords` when passwords are needed. +pub fn load_connections_file(path: &Path) -> Result { if !path.exists() { - return Ok(Vec::new()); + return Ok(ConnectionsFile::default()); } let content = fs::read_to_string(path).map_err(|e| e.to_string())?; - let mut connections: Vec = serde_json::from_str(&content) - .map_err(|_| "Failed to parse connections file".to_string())?; - // Populate passwords from keychain if needed - for conn in &mut connections { - if conn.params.save_in_keychain.unwrap_or(false) { - match keychain_utils::get_db_password(&conn.id) { - Ok(pwd) => conn.params.password = Some(pwd), - Err(e) => eprintln!( - "[Keyring Error] Failed to get DB password for {}: {}", - conn.id, e - ), - } - if conn.params.ssh_enabled.unwrap_or(false) { - if let Ok(ssh_pwd) = keychain_utils::get_ssh_password(&conn.id) { - if !ssh_pwd.trim().is_empty() { - conn.params.ssh_password = Some(ssh_pwd); - } - } - } - } + // Try parsing as the new format first + if let Ok(file) = serde_json::from_str::(&content) { + return Ok(file); } - Ok(connections) + // Fall back to old format (array of connections) + let connections: Vec = serde_json::from_str(&content) + .map_err(|_| "Failed to parse connections file".to_string())?; + + Ok(ConnectionsFile { + groups: Vec::new(), + connections, + }) } -pub fn save_connections(path: &Path, connections: &[SavedConnection]) -> Result<(), String> { +/// Load connections list (raw, no keychain reads) — for listing UI. +pub fn load_connections(path: &Path) -> Result, String> { + let file = load_connections_file(path)?; + Ok(file.connections) +} + +pub fn save_connections_file(path: &Path, file: &ConnectionsFile) -> Result<(), String> { if let Some(parent) = path.parent() { if !parent.exists() { fs::create_dir_all(parent).map_err(|e| e.to_string())?; @@ -42,17 +40,44 @@ pub fn save_connections(path: &Path, connections: &[SavedConnection]) -> Result< } // Create a copy to sanitize passwords before saving to JSON - let mut to_save = Vec::new(); - for conn in connections { + let mut connections_to_save = Vec::new(); + for conn in &file.connections { let mut c = conn.clone(); if c.params.save_in_keychain.unwrap_or(false) { // Passwords are stored in keychain, remove from JSON c.params.password = None; c.params.ssh_password = None; } - to_save.push(c); + connections_to_save.push(c); } + let to_save = ConnectionsFile { + groups: file.groups.clone(), + connections: connections_to_save, + }; + let json = serde_json::to_string_pretty(&to_save).map_err(|e| e.to_string())?; fs::write(path, json).map_err(|e| e.to_string()) } + +/// Legacy function for backward compatibility - saves using new format +pub fn save_connections(path: &Path, connections: &[SavedConnection]) -> Result<(), String> { + // Load existing groups if any + let existing = load_connections_file(path).unwrap_or_default(); + let file = ConnectionsFile { + groups: existing.groups, + connections: connections.to_vec(), + }; + save_connections_file(path, &file) +} + +pub fn load_groups(path: &Path) -> Result, String> { + let file = load_connections_file(path)?; + Ok(file.groups) +} + +pub fn save_groups(path: &Path, groups: &[ConnectionGroup]) -> Result<(), String> { + let mut file = load_connections_file(path).unwrap_or_default(); + file.groups = groups.to_vec(); + save_connections_file(path, &file) +} diff --git a/src-tauri/src/plugins/commands.rs b/src-tauri/src/plugins/commands.rs index c675537..5b50ea9 100644 --- a/src-tauri/src/plugins/commands.rs +++ b/src-tauri/src/plugins/commands.rs @@ -1,4 +1,8 @@ +use std::fs; + +use crate::drivers::driver_trait::PluginManifest; use crate::plugins::installer::{self, InstalledPluginInfo}; +use crate::plugins::manager::ConfigManifest; use crate::plugins::registry::{ self, RegistryPluginWithStatus, RegistryReleaseWithStatus, }; @@ -95,9 +99,16 @@ pub async fn install_plugin(app: AppHandle, plugin_id: String, version: Option Result<(), String> { /// Loads the plugin from disk and registers its driver, starting the plugin process. #[tauri::command] -pub async fn enable_plugin(plugin_id: String) -> Result<(), String> { +pub async fn enable_plugin(app: AppHandle, plugin_id: String) -> Result<(), String> { + let config = crate::config::load_config_internal(&app); + let plugin_cfg = config.plugins + .as_ref() + .and_then(|m| m.get(&plugin_id)); + let interpreter_override = plugin_cfg.and_then(|c| c.interpreter.clone()); + let settings = plugin_cfg + .map(|c| c.settings.clone()) + .unwrap_or_default(); let plugins_dir = installer::get_plugins_dir()?; let plugin_dir = plugins_dir.join(&plugin_id); if !plugin_dir.exists() { return Err(format!("Plugin '{}' is not installed", plugin_id)); } - crate::plugins::manager::load_plugin_from_dir(&plugin_dir).await?; + crate::plugins::manager::load_plugin_from_dir(&plugin_dir, interpreter_override, settings).await?; Ok(()) } + +/// Reads a plugin's manifest.json from disk and returns a PluginManifest. +/// Useful for retrieving setting definitions for disabled plugins. +#[tauri::command] +pub async fn get_plugin_manifest(plugin_id: String) -> Result { + let plugins_dir = installer::get_plugins_dir()?; + let manifest_path = plugins_dir.join(&plugin_id).join("manifest.json"); + + let manifest_str = fs::read_to_string(&manifest_path) + .map_err(|e| format!("Failed to read manifest for '{}': {}", plugin_id, e))?; + + let config: ConfigManifest = serde_json::from_str(&manifest_str) + .map_err(|e| format!("Failed to parse manifest for '{}': {}", plugin_id, e))?; + + Ok(PluginManifest { + id: config.id, + name: config.name, + version: config.version, + description: config.description, + default_port: config.default_port, + capabilities: config.capabilities, + is_builtin: false, + default_username: config.default_username.unwrap_or_default(), + color: config.color, + icon: config.icon, + settings: config.settings, + }) +} diff --git a/src-tauri/src/plugins/driver.rs b/src-tauri/src/plugins/driver.rs index 4c3fc7b..049aea0 100644 --- a/src-tauri/src/plugins/driver.rs +++ b/src-tauri/src/plugins/driver.rs @@ -24,13 +24,20 @@ pub struct PluginProcess { } impl PluginProcess { - async fn new(executable_path: PathBuf) -> Result { + async fn new(executable_path: PathBuf, interpreter: Option) -> Result { let (tx, rx) = mpsc::channel::<(JsonRpcRequest, oneshot::Sender>)>(100); let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>(); // Spawn the child process directly in the async context so that any // spawn failure is immediately propagated as an error (no silent panic). - let child = Command::new(&executable_path) + let mut cmd = if let Some(ref interp) = interpreter { + let mut c = Command::new(interp); + c.arg(&executable_path); + c + } else { + Command::new(&executable_path) + }; + let child = cmd .stdin(std::process::Stdio::piped()) .stdout(std::process::Stdio::piped()) .stderr(std::process::Stdio::inherit()) @@ -155,10 +162,13 @@ pub struct RpcDriver { } impl RpcDriver { - pub async fn new(manifest: PluginManifest, executable_path: PathBuf, data_types: Vec) -> Result { + pub async fn new(manifest: PluginManifest, executable_path: PathBuf, interpreter: Option, data_types: Vec, settings: HashMap) -> Result { + let process = Arc::new(PluginProcess::new(executable_path, interpreter).await?); + // Send initialize RPC with settings; silently ignore any error or non-response. + let _ = process.call("initialize", json!({ "settings": settings })).await; Ok(Self { manifest, - process: Arc::new(PluginProcess::new(executable_path).await?), + process, data_types, }) } diff --git a/src-tauri/src/plugins/manager.rs b/src-tauri/src/plugins/manager.rs index 3b36b30..b31050c 100644 --- a/src-tauri/src/plugins/manager.rs +++ b/src-tauri/src/plugins/manager.rs @@ -1,15 +1,35 @@ +use std::collections::HashMap; use std::fs; use std::path::Path; +use std::sync::Mutex; use directories::ProjectDirs; +use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; +use tauri::AppHandle; -use crate::drivers::driver_trait::{DriverCapabilities, PluginManifest}; +use crate::drivers::driver_trait::{DriverCapabilities, PluginManifest, PluginSettingDefinition}; use crate::models::DataTypeInfo; use crate::plugins::driver::RpcDriver; +/// Errors that occurred during startup plugin loading, to be fetched by the frontend. +static STARTUP_ERRORS: Lazy>> = + Lazy::new(|| Mutex::new(Vec::new())); + +#[derive(Serialize, Clone)] +pub struct PluginLoadError { + pub plugin_id: String, + pub error: String, +} + +#[tauri::command] +pub fn get_plugin_startup_errors() -> Vec { + let mut guard = STARTUP_ERRORS.lock().unwrap_or_else(|e| e.into_inner()); + std::mem::take(&mut *guard) +} + #[derive(Serialize, Deserialize)] -struct ConfigManifest { +pub struct ConfigManifest { pub id: String, pub name: String, pub version: String, @@ -24,6 +44,10 @@ struct ConfigManifest { pub color: String, #[serde(default)] pub icon: String, + #[serde(default)] + pub interpreter: Option, + #[serde(default)] + pub settings: Vec, } /// Load installed plugins at startup. @@ -31,7 +55,11 @@ struct ConfigManifest { /// `enabled_ids` controls which plugins are started: /// - `None` → load all installed plugins (first-run or no preference saved). /// - `Some(ids)` → load only the plugins whose directory name (= plugin ID) is in `ids`. -pub async fn load_plugins(enabled_ids: Option<&[String]>) { +pub async fn load_plugins(app: &AppHandle, enabled_ids: Option<&[String]>) { + let plugin_configs = crate::config::load_config_internal(app) + .plugins + .unwrap_or_default(); + let proj_dirs = match ProjectDirs::from("com", "debba", "tabularis") { Some(d) => d, None => return, @@ -69,13 +97,31 @@ pub async fn load_plugins(enabled_ids: Option<&[String]>) { } } - if let Err(e) = load_plugin_from_dir(&path).await { + let plugin_config = path + .file_name() + .and_then(|n| n.to_str()) + .and_then(|dir_name| plugin_configs.get(dir_name)); + + let interpreter_override = plugin_config.and_then(|c| c.interpreter.clone()); + let settings = plugin_config + .map(|c| c.settings.clone()) + .unwrap_or_default(); + + if let Err(e) = load_plugin_from_dir(&path, interpreter_override, settings).await { log::error!("Failed to load plugin {:?}: {}", path, e); + let plugin_id = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("unknown") + .to_string(); + if let Ok(mut guard) = STARTUP_ERRORS.lock() { + guard.push(PluginLoadError { plugin_id, error: e }); + } } } } -pub async fn load_plugin_from_dir(path: &Path) -> Result<(), String> { +pub async fn load_plugin_from_dir(path: &Path, interpreter_override: Option, settings: HashMap) -> Result<(), String> { let manifest_path = path.join("manifest.json"); if !manifest_path.exists() { return Err(format!("manifest.json not found in {:?}", path)); @@ -113,9 +159,23 @@ pub async fn load_plugin_from_dir(path: &Path) -> Result<(), String> { default_username: config.default_username.unwrap_or_default(), color: config.color, icon: config.icon, + settings: config.settings, }; - let driver = RpcDriver::new(manifest, exec_path, config.data_types).await?; + let interpreter = interpreter_override + .or(config.interpreter) + .or_else(|| { + if exec_path.extension().map(|e| e == "py").unwrap_or(false) { + #[cfg(windows)] + { Some("python".to_string()) } + #[cfg(not(windows))] + { Some("python3".to_string()) } + } else { + None + } + }); + + let driver = RpcDriver::new(manifest, exec_path, interpreter, config.data_types, settings).await?; crate::drivers::registry::register_driver(driver).await; Ok(()) } diff --git a/src-tauri/src/pool_manager.rs b/src-tauri/src/pool_manager.rs index d17076f..4131e0c 100644 --- a/src-tauri/src/pool_manager.rs +++ b/src-tauri/src/pool_manager.rs @@ -1,6 +1,6 @@ use crate::models::ConnectionParams; use once_cell::sync::Lazy; -use sqlx::{MySql, Pool, Postgres, Sqlite}; +use sqlx::{postgres::PgConnectOptions, sqlite::SqliteConnectOptions, MySql, Pool, Postgres, Sqlite}; use std::collections::HashMap; use std::sync::Arc; use tokio::sync::RwLock; @@ -13,6 +13,8 @@ static POSTGRES_POOLS: Lazy> = Lazy::new(|| Arc::new(RwLock::new(HashMap::new()))); static SQLITE_POOLS: Lazy> = Lazy::new(|| Arc::new(RwLock::new(HashMap::new()))); +const SQLITE_MAX_CONNECTIONS_CAP: u32 = 5; + /// Build a stable connection key that works with SSH tunnels. /// If connection_id is provided (from saved connections), use it for stable pooling. /// Otherwise fall back to host:port:database (for ad-hoc connections). @@ -45,21 +47,25 @@ fn build_mysql_url(params: &ConnectionParams) -> String { ) } -fn build_postgres_url(params: &ConnectionParams) -> String { - let user = encode(params.username.as_deref().unwrap_or_default()); - let pass = encode(params.password.as_deref().unwrap_or_default()); - format!( - "postgres://{}:{}@{}:{}/{}", - user, - pass, - params.host.as_deref().unwrap_or("localhost"), - params.port.unwrap_or(5432), - params.database - ) +fn build_postgres_connectoptions(params: &ConnectionParams) -> PgConnectOptions { + let mut options = PgConnectOptions::new() + .username(params.username.as_deref().unwrap_or_default()) + .password(params.password.as_deref().unwrap_or_default()) + .port(params.port.unwrap_or(5432)) + .host(params.host.as_deref().unwrap_or_default()) + .database(&format!("{}", params.database)); + + if let Some(ssl_mode) = params.ssl_mode.as_deref() { + if let Ok(mode) = ssl_mode.parse() { + options = options.ssl_mode(mode); + } + } + + options } -fn build_sqlite_url(params: &ConnectionParams) -> String { - format!("sqlite://{}", params.database) +fn build_sqlite_connectoptions(params: &ConnectionParams) -> SqliteConnectOptions { + SqliteConnectOptions::new().filename(params.database.to_string()) } pub async fn get_mysql_pool(params: &ConnectionParams) -> Result, String> { @@ -94,7 +100,7 @@ pub async fn get_mysql_pool_with_id( ); let url = build_mysql_url(params); let pool = sqlx::mysql::MySqlPoolOptions::new() - .max_connections(crate::config::get_pool_max_connections()) + .max_connections(params.max_connections.unwrap_or(crate::config::DEFAULT_MAX_CONNECTIONS)) .connect(&url) .await .map_err(|e| { @@ -147,15 +153,16 @@ pub async fn get_postgres_pool_with_id( params.host, key ); - let url = build_postgres_url(params); + let copts = build_postgres_connectoptions(params); let pool = sqlx::postgres::PgPoolOptions::new() - .max_connections(crate::config::get_pool_max_connections()) - .connect(&url) + .max_connections(params.max_connections.unwrap_or(crate::config::DEFAULT_MAX_CONNECTIONS)) + .connect_with(copts) .await .map_err(|e| { log::error!("Failed to create PostgreSQL connection pool: {}", e); e.to_string() })?; + log::info!("Max connections: {}", params.max_connections.unwrap_or(crate::config::DEFAULT_MAX_CONNECTIONS)); log::info!( "PostgreSQL connection pool created successfully for: {} (key: {})", params.database, @@ -201,10 +208,10 @@ pub async fn get_sqlite_pool_with_id( params.database, key ); - let url = build_sqlite_url(params); + let options = build_sqlite_connectoptions(params); let pool = sqlx::sqlite::SqlitePoolOptions::new() - .max_connections(crate::config::get_pool_max_connections()) - .connect(&url) + .max_connections(SQLITE_MAX_CONNECTIONS_CAP) + .connect_with(options) .await .map_err(|e| { log::error!("Failed to create SQLite connection pool: {}", e); diff --git a/src-tauri/src/task_manager.rs b/src-tauri/src/task_manager.rs index 72937b8..17b64ae 100644 --- a/src-tauri/src/task_manager.rs +++ b/src-tauri/src/task_manager.rs @@ -335,19 +335,24 @@ pub async fn kill_plugin_process(plugin_id: String) -> Result<(), String> { } #[tauri::command] -pub async fn restart_plugin_process(plugin_id: String) -> Result<(), String> { +pub async fn restart_plugin_process(app: tauri::AppHandle, plugin_id: String) -> Result<(), String> { registry::unregister_driver(&plugin_id).await; // Give the OS a moment to release process resources before respawning. sleep(Duration::from_millis(500)).await; + let plugin_cfg = crate::config::load_config_internal(&app) + .plugins + .and_then(|mut m| m.remove(&plugin_id)); + let interpreter_override = plugin_cfg.as_ref().and_then(|c| c.interpreter.clone()); + let settings = plugin_cfg.map(|c| c.settings).unwrap_or_default(); let plugins_dir = installer::get_plugins_dir() .map_err(|e| format!("Could not locate plugins directory: {}", e))?; let plugin_dir = plugins_dir.join(&plugin_id); if !plugin_dir.exists() { return Err(format!("Plugin '{}' is not installed", plugin_id)); } - load_plugin_from_dir(&plugin_dir).await + load_plugin_from_dir(&plugin_dir, interpreter_override, settings).await .map_err(|e| format!("Failed to restart plugin '{}': {}", plugin_id, e))?; Ok(()) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index c41fbbc..a2478ae 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "productName": "tabularis", - "version": "0.9.5", + "version": "0.9.8", "identifier": "tabularis", "build": { "frontendDist": "../dist", diff --git a/src-tauri/tests/integration_tests.rs b/src-tauri/tests/integration_tests.rs index d96451f..610779e 100644 --- a/src-tauri/tests/integration_tests.rs +++ b/src-tauri/tests/integration_tests.rs @@ -12,6 +12,7 @@ fn get_mysql_params() -> ConnectionParams { username: Some("root".to_string()), password: Some("password".to_string()), database: DatabaseSelection::Single("testdb".to_string()), + ssl_mode: None, ssh_enabled: None, ssh_connection_id: None, ssh_host: None, @@ -33,6 +34,7 @@ fn get_postgres_params() -> ConnectionParams { username: Some("postgres".to_string()), password: Some("password".to_string()), database: DatabaseSelection::Single("testdb".to_string()), + ssl_mode: None, ssh_enabled: None, ssh_connection_id: None, ssh_host: None, diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index 7915ce2..8b9847c 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from "react"; +import { useState, useEffect, useMemo } from "react"; import { useNavigate, useLocation } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { Plug2, Settings, Cpu, PanelLeft } from "lucide-react"; @@ -13,6 +13,7 @@ import { McpModal } from "../modals/McpModal"; import { NavItem } from "./sidebar/NavItem"; import { OpenConnectionItem } from "./sidebar/OpenConnectionItem"; import { ConnectionGroupItem } from "./sidebar/ConnectionGroupItem"; +import { ConnectionGroupFolder } from "./sidebar/ConnectionGroupFolder"; import { ExplorerSidebar } from "./ExplorerSidebar"; import { PanelDatabaseProvider } from "./PanelDatabaseProvider"; @@ -22,13 +23,22 @@ import { useConnectionManager } from "../../hooks/useConnectionManager"; import { useConnectionLayoutContext } from "../../contexts/useConnectionLayoutContext"; import { isConnectionGrouped } from "../../utils/connectionLayout"; import { useDrivers } from "../../hooks/useDrivers"; +import type { ConnectionStatus } from "../../hooks/useConnectionManager"; import { useKeybindings } from "../../hooks/useKeybindings"; export const Sidebar = () => { const { t } = useTranslation(); const { currentTheme } = useTheme(); const isDarkTheme = !currentTheme?.id?.includes("-light"); - const { activeConnectionId } = useDatabase(); + const { + activeConnectionId, + connectionGroups, + connections, + updateGroup, + deleteGroup, + moveConnectionToGroup, + toggleGroupCollapsed, + } = useDatabase(); const navigate = useNavigate(); const location = useLocation(); @@ -79,6 +89,43 @@ export const Sidebar = () => { const { sidebarWidth, startResize } = useSidebarResize(); + // Organize open connections by group + const { groupedConnections, ungroupedConnections } = useMemo(() => { + const grouped: Record = {}; + const ungrouped: ConnectionStatus[] = []; + + // Get group_id for each open connection from saved connections + const connectionGroupMap = new Map( + connections.map(c => [c.id, c.group_id]) + ); + + for (const conn of openConnections) { + const groupId = connectionGroupMap.get(conn.id); + if (groupId) { + if (!grouped[groupId]) { + grouped[groupId] = []; + } + grouped[groupId].push(conn); + } else { + ungrouped.push(conn); + } + } + + return { groupedConnections: grouped, ungroupedConnections: ungrouped }; + }, [openConnections, connections]); + + // Sort groups by sort_order + const sortedGroups = useMemo( + () => [...connectionGroups].sort((a, b) => a.sort_order - b.sort_order), + [connectionGroups] + ); + + // Filter to only show groups that have open connections + const activeGroups = useMemo( + () => sortedGroups.filter(g => groupedConnections[g.id]?.length > 0), + [sortedGroups, groupedConnections] + ); + const handleSwitchToConnection = (connectionId: string) => { handleSwitch(connectionId); if ( @@ -154,8 +201,37 @@ export const Sidebar = () => { /> )} - {/* Show individual items for non-grouped connections */} - {openConnections + {/* Show grouped connections by folder */} + {activeGroups.map((group) => { + const groupConns = groupedConnections[group.id] || []; + const nonSplitConns = groupConns.filter( + conn => !isConnectionGrouped(conn.id, splitView) + ); + if (nonSplitConns.length === 0) return null; + + return ( + void toggleGroupCollapsed(group.id)} + onRename={(newName) => void updateGroup(group.id, { name: newName })} + onDelete={() => void deleteGroup(group.id)} + onSwitch={handleSwitchOrSetExplorer} + onOpenInEditor={handleOpenInEditor} + onDisconnect={handleDisconnectConnection} + onToggleSelect={toggleSelection} + onActivateSplit={activateSplit} + onDropConnection={(connId) => void moveConnectionToGroup(connId, group.id)} + showShortcutHints={showShortcutHints} + /> + ); + })} + + {/* Show ungrouped connections */} + {ungroupedConnections .filter(conn => !isConnectionGrouped(conn.id, splitView)) .map((conn, idx) => ( ; + onToggleCollapsed: () => void; + onRename: (newName: string) => void; + onDelete: () => void; + onSwitch: (connectionId: string) => void; + onOpenInEditor: (connectionId: string) => void; + onDisconnect: (connectionId: string) => void; + onToggleSelect: (connectionId: string, isCtrlHeld: boolean) => void; + onActivateSplit: (mode: 'vertical' | 'horizontal') => void; + onDropConnection?: (connectionId: string, groupId: string) => void; + showShortcutHints?: boolean; + startIndex?: number; +} + +export const ConnectionGroupFolder = ({ + group, + connections, + allDrivers, + selectedConnectionIds, + onToggleCollapsed, + onRename, + onDelete, + onSwitch, + onOpenInEditor, + onDisconnect, + onToggleSelect, + onActivateSplit, + onDropConnection, + showShortcutHints = false, + startIndex = 1, +}: Props) => { + const { t } = useTranslation(); + const [contextMenu, setContextMenu] = useState<{ x: number; y: number } | null>(null); + const [isEditing, setIsEditing] = useState(false); + const [editName, setEditName] = useState(group.name); + const [isDragOver, setIsDragOver] = useState(false); + const inputRef = useRef(null); + const isRenameCancelledRef = useRef(false); + + const handleContextMenu = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + setContextMenu({ x: e.clientX, y: e.clientY }); + }; + + const handleStartRename = () => { + setIsEditing(true); + setEditName(group.name); + setContextMenu(null); + setTimeout(() => inputRef.current?.focus(), 0); + }; + + const handleRenameSubmit = () => { + if (editName.trim() && editName !== group.name) { + onRename(editName.trim()); + } + setIsEditing(false); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter") { + handleRenameSubmit(); + } else if (e.key === "Escape") { + isRenameCancelledRef.current = true; + setIsEditing(false); + setEditName(group.name); + } + }; + + const handleDragOver = (e: React.DragEvent) => { + e.preventDefault(); + setIsDragOver(true); + }; + + const handleDragLeave = () => { + setIsDragOver(false); + }; + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + setIsDragOver(false); + const connectionId = e.dataTransfer.getData("connectionId"); + if (connectionId && onDropConnection) { + onDropConnection(connectionId, group.id); + } + }; + + const menuItems = [ + { + label: t("groups.rename"), + icon: Edit2, + action: handleStartRename, + }, + { separator: true as const }, + { + label: t("groups.delete"), + icon: Trash2, + action: onDelete, + danger: true, + }, + ]; + + const connectedCount = connections.filter(c => c.isConnected).length; + + return ( +
+ {/* Group header */} +
+ + + {/* Tooltip */} +
+ {isEditing ? ( + setEditName(e.target.value)} + onBlur={() => { + if (!isRenameCancelledRef.current) { + handleRenameSubmit(); + } + isRenameCancelledRef.current = false; + }} + onKeyDown={handleKeyDown} + className="bg-surface-primary border border-strong rounded px-1.5 py-0.5 text-xs text-primary w-32 focus:outline-none focus:border-blue-500" + onClick={(e) => e.stopPropagation()} + /> + ) : ( + <> +
{group.name}
+
+ {connections.length} {connections.length === 1 ? t("groups.connection") : t("groups.connections")} + {connectedCount > 0 && ` (${connectedCount} open)`} +
+ + )} +
+
+ + {/* Expanded connections */} + {!group.collapsed && connections.length > 0 && ( +
+ {connections.map((conn, idx) => ( + d.id === conn.driver)} + isSelected={selectedConnectionIds.has(conn.id)} + onSwitch={() => onSwitch(conn.id)} + onOpenInEditor={() => onOpenInEditor(conn.id)} + onDisconnect={() => onDisconnect(conn.id)} + onToggleSelect={(isCtrlHeld) => onToggleSelect(conn.id, isCtrlHeld)} + selectedConnectionIds={selectedConnectionIds} + onActivateSplit={onActivateSplit} + shortcutIndex={startIndex + idx} + showShortcutHint={showShortcutHints && startIndex + idx <= 9} + /> + ))} +
+ )} + + {contextMenu && ( + setContextMenu(null)} + /> + )} +
+ ); +}; diff --git a/src/components/layout/sidebar/SidebarTableItem.tsx b/src/components/layout/sidebar/SidebarTableItem.tsx index 5aa05f6..0084af6 100644 --- a/src/components/layout/sidebar/SidebarTableItem.tsx +++ b/src/components/layout/sidebar/SidebarTableItem.tsx @@ -13,6 +13,7 @@ import { } from "lucide-react"; import clsx from "clsx"; import { SidebarColumnItem } from "./SidebarColumnItem"; +import { dragState } from "../../../utils/dragState"; import type { TableColumn, ForeignKey, Index } from "../../../types/schema"; import type { ContextMenuData } from "../../../types/sidebar"; @@ -150,10 +151,27 @@ export const SidebarTableItem = ({ return (
{ - e.dataTransfer.setData("application/reactflow", table.name); - e.dataTransfer.effectAllowed = "move"; + onPointerDown={(e) => { + dragState.start(table.name); + const ghost = document.createElement('div'); + ghost.id = '__drag-ghost__'; + ghost.textContent = table.name; + ghost.style.cssText = 'position:fixed;pointer-events:none;background:#1e40af;color:#fff;padding:4px 10px;border-radius:6px;font-size:12px;font-weight:500;z-index:9999;box-shadow:0 4px 12px rgba(0,0,0,0.5);'; + ghost.style.left = e.clientX + 12 + 'px'; + ghost.style.top = e.clientY + 12 + 'px'; + document.body.appendChild(ghost); + const move = (ev: PointerEvent) => { + ghost.style.left = ev.clientX + 12 + 'px'; + ghost.style.top = ev.clientY + 12 + 'px'; + }; + const up = () => { + ghost.remove(); + dragState.clear(); + document.removeEventListener('pointermove', move); + document.removeEventListener('pointerup', up); + }; + document.addEventListener('pointermove', move); + document.addEventListener('pointerup', up); }} onClick={() => onTableClick(table.name)} onDoubleClick={() => onTableDoubleClick(table.name)} diff --git a/src/components/modals/ConfirmModal.tsx b/src/components/modals/ConfirmModal.tsx new file mode 100644 index 0000000..221cce9 --- /dev/null +++ b/src/components/modals/ConfirmModal.tsx @@ -0,0 +1,62 @@ +import { useTranslation } from "react-i18next"; +import { AlertTriangle, X } from "lucide-react"; +import { Modal } from "../ui/Modal"; + +interface ConfirmModalProps { + isOpen: boolean; + onClose: () => void; + title: string; + message: string; + confirmLabel?: string; + confirmClassName?: string; + onConfirm: () => void; +} + +export const ConfirmModal = ({ + isOpen, + onClose, + title, + message, + confirmLabel, + confirmClassName = "px-4 py-2 bg-red-600 hover:bg-red-500 text-white rounded-lg text-sm font-medium transition-colors", + onConfirm, +}: ConfirmModalProps) => { + const { t } = useTranslation(); + + return ( + +
+ {/* Header */} +
+
+
+ +
+

{title}

+
+ +
+ + {/* Content */} +
+

{message}

+
+ + {/* Footer */} +
+ + +
+
+
+ ); +}; diff --git a/src/components/modals/PluginRemoveModal.tsx b/src/components/modals/PluginRemoveModal.tsx new file mode 100644 index 0000000..6eae525 --- /dev/null +++ b/src/components/modals/PluginRemoveModal.tsx @@ -0,0 +1,29 @@ +import { useTranslation } from "react-i18next"; +import { ConfirmModal } from "./ConfirmModal"; + +interface PluginRemoveModalProps { + isOpen: boolean; + onClose: () => void; + pluginName: string; + onConfirm: () => void; +} + +export const PluginRemoveModal = ({ + isOpen, + onClose, + pluginName, + onConfirm, +}: PluginRemoveModalProps) => { + const { t } = useTranslation(); + + return ( + + ); +}; diff --git a/src/components/modals/PluginSettingsModal.tsx b/src/components/modals/PluginSettingsModal.tsx new file mode 100644 index 0000000..23ce677 --- /dev/null +++ b/src/components/modals/PluginSettingsModal.tsx @@ -0,0 +1,209 @@ +import { useState, useCallback } from "react"; +import { useTranslation } from "react-i18next"; +import { Settings, X, FolderOpen } from "lucide-react"; +import { open } from "@tauri-apps/plugin-dialog"; +import { Modal } from "../ui/Modal"; +import { Select } from "../ui/Select"; +import { resolvePluginConfig, getDisplayInterpreter, resolveSettingsWithDefaults, validateSettings } from "../../utils/pluginConfig"; +import type { PluginConfig } from "../../contexts/SettingsContext"; +import type { PluginManifest, PluginSettingDefinition } from "../../types/plugins"; + +interface PluginSettingsModalProps { + isOpen: boolean; + onClose: () => void; + pluginId: string; + pluginName: string; + currentConfig?: PluginConfig; + manifest?: PluginManifest; + onSave: (config: PluginConfig) => void; +} + +export const PluginSettingsModal = ({ + isOpen, + onClose, + pluginId, + currentConfig, + manifest, + onSave, +}: PluginSettingsModalProps) => { + const { t } = useTranslation(); + const [interpreter, setInterpreter] = useState(getDisplayInterpreter(currentConfig)); + + const definitions = manifest?.settings ?? []; + + const [dynamicValues, setDynamicValues] = useState>(() => + resolveSettingsWithDefaults(definitions, currentConfig?.settings), + ); + const [errors, setErrors] = useState>({}); + + const handleBrowse = async () => { + const selected = await open({ multiple: false, directory: false }); + if (selected) setInterpreter(selected); + }; + + const handleDynamicChange = useCallback((key: string, value: unknown) => { + setDynamicValues((prev) => ({ ...prev, [key]: value })); + setErrors((prev) => { + if (!prev[key]) return prev; + const next = { ...prev }; + delete next[key]; + return next; + }); + }, []); + + const handleSave = () => { + const validationErrors = validateSettings(definitions, dynamicValues); + if (Object.keys(validationErrors).length > 0) { + const errorMessages: Record = {}; + for (const [key, label] of Object.entries(validationErrors)) { + errorMessages[key] = t("settings.plugins.pluginSettings.fieldRequired", { label }); + } + setErrors(errorMessages); + return; + } + + const baseConfig = resolvePluginConfig(currentConfig, interpreter); + const mergedSettings = + definitions.length > 0 + ? { ...(baseConfig.settings ?? {}), ...dynamicValues } + : baseConfig.settings; + + onSave({ ...baseConfig, settings: mergedSettings }); + onClose(); + }; + + const renderField = (def: PluginSettingDefinition) => { + const value = dynamicValues[def.key]; + const inputClass = + "bg-base border-default text-primary placeholder:text-muted focus:border-blue-500/50 focus:outline-none"; + + if (def.type === "boolean") { + return ( + handleDynamicChange(def.key, e.target.checked)} + className="w-4 h-4 accent-blue-500" + /> + ); + } + + if (def.type === "select" && def.options && def.options.length > 0) { + return ( + handleDynamicChange(def.key, e.target.value === "" ? undefined : Number(e.target.value))} + className={`w-full border rounded-lg px-3 py-2 text-sm ${inputClass}`} + /> + ); + } + + return ( + handleDynamicChange(def.key, e.target.value)} + className={`w-full border rounded-lg px-3 py-2 text-sm ${inputClass}`} + /> + ); + }; + + return ( + +
+ {/* Header */} +
+
+
+ +
+
+

+ {t("settings.plugins.pluginSettings.title")} +

+

{pluginId}

+
+
+ +
+ + {/* Content */} +
+ {/* Interpreter */} +
+ +

+ {t("settings.plugins.pluginSettings.interpreterDesc")} +

+
+ setInterpreter(e.target.value)} + className="flex-1 bg-base border border-default rounded-lg px-3 py-2 text-sm text-primary placeholder:text-muted focus:outline-none focus:border-blue-500/50" + autoFocus + /> + +
+
+ + {/* Dynamic plugin settings */} + {definitions.map((def) => ( +
+ + {def.description && ( +

{def.description}

+ )} + {renderField(def)} + {errors[def.key] && ( +

{errors[def.key]}

+ )} +
+ ))} +
+ + {/* Footer */} +
+ + +
+
+
+ ); +}; diff --git a/src/components/modals/PluginStartErrorModal.tsx b/src/components/modals/PluginStartErrorModal.tsx new file mode 100644 index 0000000..25c32ef --- /dev/null +++ b/src/components/modals/PluginStartErrorModal.tsx @@ -0,0 +1,120 @@ +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { AlertTriangle, X, Copy, Check, Settings } from "lucide-react"; +import { Modal } from "../ui/Modal"; + +interface PluginStartErrorModalProps { + isOpen: boolean; + onClose: () => void; + pluginId: string; + error: string; + onConfigureInterpreter?: () => void; +} + +export const PluginStartErrorModal = ({ + isOpen, + onClose, + pluginId, + error, + onConfigureInterpreter, +}: PluginStartErrorModalProps) => { + const { t } = useTranslation(); + const [copied, setCopied] = useState(false); + + const handleCopy = () => { + navigator.clipboard.writeText(error); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + const handleConfigure = () => { + onClose(); + onConfigureInterpreter?.(); + }; + + return ( + +
+ {/* Header */} +
+
+
+ +
+
+

+ {t("settings.plugins.startError.title")} +

+

{pluginId}

+
+
+ +
+ + {/* Content */} +
+

+ {t("settings.plugins.startError.subtitle")} +

+ + {onConfigureInterpreter && ( +
+ +

+ {t("settings.plugins.startError.interpreterHint")} +

+
+ )} + +
+
+ + {t("settings.plugins.startError.details")} + + +
+
+              {error}
+            
+
+
+ + {/* Footer */} +
+ + {onConfigureInterpreter && ( + + )} +
+
+
+ ); +}; diff --git a/src/components/modals/SshConnectionsModal.tsx b/src/components/modals/SshConnectionsModal.tsx index da26940..5c36eb9 100644 --- a/src/components/modals/SshConnectionsModal.tsx +++ b/src/components/modals/SshConnectionsModal.tsx @@ -243,12 +243,8 @@ export function SshConnectionsModal({ conn.auth_type || (conn.key_file && conn.key_file.trim() !== "" ? "ssh_key" : "password"); - // Don't load password/key_passphrase into form when editing - // They will be retrieved from keychain by the backend when needed setFormData({ ...conn, - password: undefined, - key_passphrase: undefined, auth_type, }); setPasswordDirty(false); diff --git a/src/components/ui/NewConnectionModal.tsx b/src/components/ui/NewConnectionModal.tsx index 10c06d5..7b70abd 100644 --- a/src/components/ui/NewConnectionModal.tsx +++ b/src/components/ui/NewConnectionModal.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from "react"; +import { useState, useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; import { X, @@ -12,18 +12,25 @@ import { CheckSquare, Square, Plug, + Info, } from "lucide-react"; import { invoke } from "@tauri-apps/api/core"; import { open } from "@tauri-apps/plugin-dialog"; import clsx from "clsx"; import { SshConnectionsModal } from "../modals/SshConnectionsModal"; -import { SearchableSelect } from "./SearchableSelect"; +import { Select } from "./Select"; import { useDrivers } from "../../hooks/useDrivers"; import { Modal } from "./Modal"; import type { PluginManifest } from "../../types/plugins"; import { loadSshConnections, type SshConnection } from "../../utils/ssh"; import { isMultiDatabaseCapable } from "../../utils/database"; +import { fetchConnectionWithCredentials } from "../../utils/credentials"; import { getDriverIcon, getDriverColorStyle } from "../../utils/driverUI"; +import { + looksLikeConnectionString, + parseConnectionString, + toConnectionParams, +} from "../../utils/connectionStringParser"; interface ConnectionParams { driver: string; @@ -32,6 +39,7 @@ interface ConnectionParams { username?: string; password?: string; database: string | string[]; + ssl_mode?: string; // SSH ssh_enabled?: boolean; ssh_connection_id?: string; @@ -43,6 +51,7 @@ interface ConnectionParams { ssh_key_file?: string; ssh_key_passphrase?: string; save_in_keychain?: boolean; + max_connections?: number; } interface SavedConnection { @@ -89,12 +98,11 @@ const FieldInput = ({ autoCapitalize="off" autoComplete="off" spellCheck={false} - className="w-full px-2.5 py-1.5 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" + className="w-full px-3 py-2 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" />
); - export const NewConnectionModal = ({ isOpen, onClose, @@ -113,16 +121,29 @@ export const NewConnectionModal = ({ port: 3306, username: "", database: "", + ssl_mode: "", ssh_enabled: false, ssh_port: 22, }); - const [selectedDatabasesState, setSelectedDatabasesState] = useState([]); + // Stores form data per driver so switching tabs preserves per-driver values + const driverFormDataRef = useRef>>( + {}, + ); + const [selectedDatabasesState, setSelectedDatabasesState] = useState< + string[] + >([]); const [dbSearchQuery, setDbSearchQuery] = useState(""); const [passwordDirty, setPasswordDirty] = useState(false); const [sshPasswordDirty, setSshPasswordDirty] = useState(false); + const [connectionString, setConnectionString] = useState(""); + const [connectionStringError, setConnectionStringError] = useState< + string | null + >(null); // ── tab ── - const [activeTab, setActiveTab] = useState<"general" | "databases" | "ssh">("general"); + const [activeTab, setActiveTab] = useState<"general" | "databases" | "ssh">( + "general", + ); // ── SSH ── const [sshConnections, setSshConnections] = useState([]); @@ -132,17 +153,36 @@ export const NewConnectionModal = ({ // ── databases ── const [availableDatabases, setAvailableDatabases] = useState([]); const [loadingDatabases, setLoadingDatabases] = useState(false); - const [databaseLoadError, setDatabaseLoadError] = useState(null); + const [databaseLoadError, setDatabaseLoadError] = useState( + null, + ); // ── connection test ── - const [status, setStatus] = useState<"idle" | "testing" | "saving" | "success" | "error">("idle"); + const [status, setStatus] = useState< + "idle" | "testing" | "saving" | "success" | "error" + >("idle"); const [message, setMessage] = useState(""); - const [testResult, setTestResult] = useState<"success" | "error" | null>(null); + const [testResult, setTestResult] = useState<"success" | "error" | null>( + null, + ); // ── capabilities ── + const noConnectionRequired = + activeDriver?.capabilities?.no_connection_required === true; const isNetworkDriver = + !noConnectionRequired && activeDriver?.capabilities?.file_based === false && !activeDriver?.capabilities?.folder_based; + const connectionStringEnabled = + activeDriver?.capabilities?.connection_string ?? + activeDriver?.capabilities?.connectionString ?? + true; + const connectionStringPlaceholder = + activeDriver?.capabilities?.connection_string_example?.trim() || + activeDriver?.capabilities?.connectionStringExample?.trim() || + t("newConnection.connectionStringPlaceholder", { + defaultValue: "e.g. mysql://user:pass@localhost:3306/db", + }); const isMultiDb = isMultiDatabaseCapable(activeDriver?.capabilities); // ── helpers ── @@ -151,31 +191,64 @@ export const NewConnectionModal = ({ setSshConnections(result); }; - const updateField = (field: keyof ConnectionParams, value: string | number | boolean | undefined) => { + const updateField = ( + field: keyof ConnectionParams, + value: string | number | boolean | undefined, + ) => { setFormData((prev) => ({ ...prev, [field]: value })); }; - const loadDatabases = async () => { - if (activeDriver?.capabilities?.file_based === true) return; + const loadDatabases = async (overrides?: Partial) => { + const effectiveDriver = overrides?.driver ?? driver; + const targetDriver = drivers.find((d) => d.id === effectiveDriver); + + if ( + targetDriver?.capabilities?.file_based === true || + targetDriver?.capabilities?.folder_based === true + ) { + return; + } + setLoadingDatabases(true); setDatabaseLoadError(null); try { const listParams: Partial = { - driver, ...formData, - port: formData.port != null ? Number(formData.port) : undefined, + ...overrides, + driver: effectiveDriver, + port: + overrides?.port != null + ? Number(overrides.port) + : formData.port != null + ? Number(formData.port) + : undefined, }; - if (initialConnection) { - if (!passwordDirty) delete listParams.password; - if (!sshPasswordDirty) delete listParams.ssh_password; - } const databases = await invoke("list_databases", { - request: { params: { ...listParams }, connection_id: initialConnection?.id }, + request: { + params: { ...listParams }, + connection_id: initialConnection?.id, + }, }); setAvailableDatabases(databases); + if (initialConnection) { + // Pre-select databases already associated with the connection + const existing = Array.isArray(initialConnection.params.database) + ? initialConnection.params.database + : initialConnection.params.database + ? [initialConnection.params.database as string] + : []; + setSelectedDatabasesState((prev) => { + const merged = Array.from(new Set([...existing, ...prev])); + return merged.filter((db) => databases.includes(db)); + }); + } } catch (err) { const errorMsg = - typeof err === "string" ? err : err instanceof Error ? err.message : t("newConnection.failLoadDatabases"); + typeof err === "string" + ? err + : err instanceof Error + ? err.message + : t("newConnection.failLoadDatabases"); setDatabaseLoadError(errorMsg); setAvailableDatabases([]); } finally { @@ -187,54 +260,91 @@ export const NewConnectionModal = ({ useEffect(() => { if (!isOpen) return; const init = async () => { + // Reset common state first so it's always clean even if async calls below fail + setStatus("idle"); + setMessage(""); + setTestResult(null); + setActiveTab("general"); + setAvailableDatabases([]); + setDatabaseLoadError(null); + setPasswordDirty(false); + setSshPasswordDirty(false); + setDbSearchQuery(""); + setConnectionString(""); + setConnectionStringError(null); + if (initialConnection) { setName(initialConnection.name); setDriver(initialConnection.params.driver); const db = initialConnection.params.database; + setSshMode( + initialConnection.params.ssh_connection_id ? "existing" : "inline", + ); + + let params = initialConnection.params; + try { + const fullConn = await fetchConnectionWithCredentials( + initialConnection.id, + ); + params = fullConn.params; + } catch { + // fallback: use params without secrets (backend will retrieve from keychain) + } + if (Array.isArray(db)) { setSelectedDatabasesState(db); - setFormData({ ...initialConnection.params, database: db[0] ?? "" }); + setFormData({ ...params, database: db[0] ?? "" }); } else { setSelectedDatabasesState([]); - setFormData({ ...initialConnection.params }); + setFormData({ ...params }); } - setPasswordDirty(false); - setSshPasswordDirty(false); - setDbSearchQuery(""); - setSshMode(initialConnection.params.ssh_connection_id ? "existing" : "inline"); } else { setName(""); setDriver("mysql"); - setFormData({ host: "localhost", port: 3306, username: "", database: "", ssh_enabled: false, ssh_port: 22 }); + setFormData({ + host: "localhost", + port: 3306, + username: "", + database: "", + ssh_enabled: false, + ssh_port: 22, + }); setSelectedDatabasesState([]); - setDbSearchQuery(""); - setPasswordDirty(false); - setSshPasswordDirty(false); setSshMode("existing"); } - setStatus("idle"); - setMessage(""); - setTestResult(null); - setActiveTab("general"); - setAvailableDatabases([]); - setDatabaseLoadError(null); + await loadSshConnectionsList(); }; void init(); }, [isOpen, initialConnection]); const handleDriverChange = (newDriver: string) => { + // Save current driver's form data before switching + driverFormDataRef.current[driver] = formData; + + const saved = driverFormDataRef.current[newDriver]; + if (saved) { + setFormData(saved); + } else { + setFormData((prev) => ({ + ...prev, + driver: newDriver, + port: + drivers.find((d) => d.id === newDriver)?.default_port ?? undefined, + username: + drivers.find((d) => d.id === newDriver)?.default_username ?? "", + max_connections: undefined, + })); + } setDriver(newDriver); - setFormData((prev) => ({ - ...prev, - driver: newDriver, - port: drivers.find((d) => d.id === newDriver)?.default_port ?? undefined, - username: drivers.find((d) => d.id === newDriver)?.default_username ?? "", - })); + setAvailableDatabases([]); setDatabaseLoadError(null); setStatus("idle"); setMessage(""); + setActiveTab("general"); + setConnectionString(""); + setConnectionStringError(null); }; const testConnection = async () => { @@ -247,55 +357,89 @@ export const NewConnectionModal = ({ ...formData, port: formData.port != null ? Number(formData.port) : undefined, database: isMultiDb - ? (selectedDatabasesState[0] ?? (typeof formData.database === "string" ? formData.database : "")) + ? (selectedDatabasesState[0] ?? + (typeof formData.database === "string" ? formData.database : "")) : formData.database, }; - if (initialConnection) { - if (!passwordDirty) delete testParams.password; - if (!sshPasswordDirty) delete testParams.ssh_password; - } const result = await invoke("test_connection", { - request: { params: { ...testParams }, connection_id: initialConnection?.id }, + request: { + params: { ...testParams }, + connection_id: initialConnection?.id, + }, }); setStatus("success"); setMessage(result); setTestResult("success"); - setTimeout(() => { setTestResult(null); setStatus("idle"); setMessage(""); }, 3000); + setTimeout(() => { + setTestResult(null); + setStatus("idle"); + setMessage(""); + }, 3000); return true; } catch (err) { setStatus("error"); - const msg = typeof err === "string" ? err : err instanceof Error ? err.message : JSON.stringify(err); + const msg = + typeof err === "string" + ? err + : err instanceof Error + ? err.message + : JSON.stringify(err); setMessage(msg); setTestResult("error"); - setTimeout(() => { setTestResult(null); setStatus("idle"); }, 3000); + setTimeout(() => { + setTestResult(null); + setStatus("idle"); + }, 3000); return false; } }; const saveConnection = async () => { if (!name.trim()) { - setStatus("error"); setMessage(t("newConnection.nameRequired")); setTestResult("error"); return; + setStatus("error"); + setMessage(t("newConnection.nameRequired")); + setTestResult("error"); + return; } if (isMultiDb) { if (selectedDatabasesState.length === 0) { - setStatus("error"); setMessage(t("newConnection.noDatabasesSelected")); setTestResult("error"); return; + setStatus("error"); + setMessage(t("newConnection.noDatabasesSelected")); + setTestResult("error"); + return; } - } else if (!formData.database || (typeof formData.database === "string" && !formData.database.trim())) { - setStatus("error"); setMessage(t("newConnection.dbNameRequired")); setTestResult("error"); return; + } else if ( + !noConnectionRequired && + (!formData.database || + (typeof formData.database === "string" && !formData.database.trim())) + ) { + setStatus("error"); + setMessage(t("newConnection.dbNameRequired")); + setTestResult("error"); + return; } - setStatus("saving"); setMessage(""); setTestResult(null); + setStatus("saving"); + setMessage(""); + setTestResult(null); try { const params: Partial = { - driver, ...formData, + driver, + ...formData, port: formData.port != null ? Number(formData.port) : undefined, database: isMultiDb - ? (selectedDatabasesState.length === 1 ? selectedDatabasesState[0] : selectedDatabasesState) + ? selectedDatabasesState.length === 1 + ? selectedDatabasesState[0] + : selectedDatabasesState : formData.database, }; if (initialConnection) { if (!params.password?.trim()) delete params.password; if (!params.ssh_password?.trim()) delete params.ssh_password; - await invoke("update_connection", { id: initialConnection.id, name, params }); + await invoke("update_connection", { + id: initialConnection.id, + name, + params, + }); } else { await invoke("save_connection", { name, params }); } @@ -308,35 +452,119 @@ export const NewConnectionModal = ({ } }; + // ── connection string import ── + const handleConnectionStringChange = (value: string) => { + setConnectionString(value); + setConnectionStringError(null); + + if (!value.trim()) { + return; + } + + const parserDrivers = drivers.map((item) => ({ + id: item.id, + capabilities: item.capabilities, + })); + + if (looksLikeConnectionString(value, parserDrivers)) { + const result = parseConnectionString(value, parserDrivers); + if (result.success) { + const parsed = toConnectionParams(result.params); + const newDriver = parsed.driver || driver; + const parsedDriver = drivers.find((item) => item.id === newDriver); + const parsedIsMultiDb = isMultiDatabaseCapable( + parsedDriver?.capabilities, + ); + + const parsedFields: Partial = { + driver: newDriver, + host: parsed.host || "localhost", + port: parsed.port, + username: parsed.username || "", + password: parsed.password || "", + database: parsed.database || "", + }; + + if (parsedIsMultiDb && parsed.database) { + setSelectedDatabasesState([parsed.database]); + setActiveTab("databases"); + } + + if (newDriver !== driver) { + setDriver(newDriver); + } + + setFormData((prev) => ({ + ...prev, + ...parsedFields, + })); + + void loadDatabases(parsedFields); + } else { + setConnectionStringError(result.error); + } + } + }; + + const handleClearConnectionString = () => { + setConnectionString(""); + setConnectionStringError(null); + }; + // ── rendered general tab content ── const generalTabContent = (
- {/* File / folder based */} - {activeDriver?.capabilities?.file_based === true || activeDriver?.capabilities?.folder_based === true ? ( + {/* API-based: no connection form needed */} + {noConnectionRequired ? ( +
+ +

+ {t("newConnection.noGeneralSettings", { + defaultValue: "No general settings available for this driver.", + })} +

+
+ ) : activeDriver?.capabilities?.file_based === true || + activeDriver?.capabilities?.folder_based === true ? (
updateField("database", e.target.value)} autoCorrect="off" autoCapitalize="off" autoComplete="off" spellCheck={false} - className="flex-1 px-2.5 py-1.5 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" - placeholder={activeDriver.capabilities.folder_based ? t("newConnection.folderPathPlaceholder") : t("newConnection.filePathPlaceholder")} + className="flex-1 px-3 py-2 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" + placeholder={ + activeDriver.capabilities.folder_based + ? t("newConnection.folderPathPlaceholder") + : t("newConnection.filePathPlaceholder") + } /> @@ -344,8 +572,60 @@ export const NewConnectionModal = ({
) : ( <> + {connectionStringEnabled && ( +
+
+ + {connectionString && ( + + )} +
+
+ handleConnectionStringChange(e.target.value)} + autoCorrect="off" + autoCapitalize="off" + autoComplete="off" + spellCheck={false} + className={clsx( + "flex-1 px-3 py-2 bg-base border rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors", + connectionStringError ? "border-red-500" : "border-strong", + )} + placeholder={connectionStringPlaceholder} + /> + {connectionString && !connectionStringError && ( +
+ +
+ )} +
+ {connectionStringError && ( +
+ {connectionStringError} +
+ )} +
+ )} + {/* Host + Port */} -
+
+ {driver === "postgres" && ( +
+ + updateField("database", e.target.value)} autoCorrect="off" autoCapitalize="off" autoComplete="off" spellCheck={false} - className="w-full px-2.5 py-1.5 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" + className="w-full px-3 py-2 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" placeholder={t("newConnection.dbNamePlaceholder")} /> )} @@ -432,15 +756,40 @@ export const NewConnectionModal = ({ type="checkbox" checked={!!formData.save_in_keychain} onChange={(e) => { - updateField("password", ""); - setPasswordDirty(true); - setSshPasswordDirty(true); updateField("save_in_keychain", e.target.checked); }} className="accent-blue-500 w-3.5 h-3.5 rounded" /> - {t("newConnection.saveKeychain")} + + {t("newConnection.saveKeychain")} + + + {/* Max connections */} +
+ +

+ {t("newConnection.maxConnectionsDesc")} +

+ { + const val = parseInt(e.target.value); + updateField("max_connections", isNaN(val) ? undefined : val); + }} + min="1" + max="100" + placeholder="10" + autoCorrect="off" + autoCapitalize="off" + autoComplete="off" + spellCheck={false} + className="w-32 px-2.5 py-1.5 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" + /> +
)}
@@ -450,15 +799,27 @@ export const NewConnectionModal = ({ const databasesTabContent = (
-

{t("newConnection.selectDatabasesHint", { defaultValue: "Select the databases to include in this connection." })}

+

+ {t("newConnection.selectDatabasesHint", { + defaultValue: "Select the databases to include in this connection.", + })} +

{databaseLoadError && ( @@ -484,19 +845,27 @@ export const NewConnectionModal = ({ type="button" onClick={() => { const filteredDbs = availableDatabases.filter((db) => - db.toLowerCase().includes(dbSearchQuery.toLowerCase()) + db.toLowerCase().includes(dbSearchQuery.toLowerCase()), + ); + const allSel = filteredDbs.every((db) => + selectedDatabasesState.includes(db), ); - const allSel = filteredDbs.every((db) => selectedDatabasesState.includes(db)); if (allSel) { - setSelectedDatabasesState((prev) => prev.filter((db) => !filteredDbs.includes(db))); + setSelectedDatabasesState((prev) => + prev.filter((db) => !filteredDbs.includes(db)), + ); } else { - setSelectedDatabasesState((prev) => Array.from(new Set([...prev, ...filteredDbs]))); + setSelectedDatabasesState((prev) => + Array.from(new Set([...prev, ...filteredDbs])), + ); } }} className="text-xs text-blue-400 hover:text-blue-300 whitespace-nowrap shrink-0" > {availableDatabases - .filter((db) => db.toLowerCase().includes(dbSearchQuery.toLowerCase())) + .filter((db) => + db.toLowerCase().includes(dbSearchQuery.toLowerCase()), + ) .every((db) => selectedDatabasesState.includes(db)) ? t("sidebar.deselectAll") : t("sidebar.selectAll")} @@ -504,7 +873,9 @@ export const NewConnectionModal = ({
{availableDatabases - .filter((db) => db.toLowerCase().includes(dbSearchQuery.toLowerCase())) + .filter((db) => + db.toLowerCase().includes(dbSearchQuery.toLowerCase()), + ) .map((db) => { const sel = selectedDatabasesState.includes(db); return ( @@ -512,15 +883,20 @@ export const NewConnectionModal = ({ key={db} onClick={() => setSelectedDatabasesState((prev) => - sel ? prev.filter((d) => d !== db) : [...prev, db] + sel ? prev.filter((d) => d !== db) : [...prev, db], ) } className={clsx( "flex items-center gap-2 px-2.5 py-1.5 cursor-pointer text-sm transition-colors hover:bg-surface-secondary select-none", - sel ? "text-primary" : "text-muted" + sel ? "text-primary" : "text-muted", )} > - + {sel ? : } {db} @@ -530,14 +906,21 @@ export const NewConnectionModal = ({
{selectedDatabasesState.length > 0 - ? t("newConnection.selectedDatabases", { count: selectedDatabasesState.length }) + ? t("newConnection.selectedDatabases", { + count: selectedDatabasesState.length, + }) : t("newConnection.noDatabasesSelected")}
) : (
-

{t("newConnection.loadDatabasesHint", { defaultValue: "Click Load Databases to fetch available databases." })}

+

+ {t("newConnection.loadDatabasesHint", { + defaultValue: + "Click Load Databases to fetch available databases.", + })} +

)}
@@ -545,7 +928,11 @@ export const NewConnectionModal = ({ // ── rendered SSH tab content ── const sshTabContent = !isNetworkDriver ? ( -

{t("newConnection.sshNotAvailable", { defaultValue: "SSH is not available for this driver." })}

+

+ {t("newConnection.sshNotAvailable", { + defaultValue: "SSH is not available for this driver.", + })} +

) : (
{/* Enable toggle */} @@ -561,7 +948,9 @@ export const NewConnectionModal = ({ }} className="accent-blue-500 w-3.5 h-3.5 rounded" /> - {t("newConnection.useSsh")} + + {t("newConnection.useSsh")} + {formData.ssh_enabled && ( @@ -587,10 +976,14 @@ export const NewConnectionModal = ({ }} className={clsx( "px-3 py-1.5 text-xs font-medium transition-colors", - sshMode === mode ? "bg-blue-600 text-white" : "bg-elevated text-secondary hover:text-primary" + sshMode === mode + ? "bg-blue-600 text-white" + : "bg-elevated text-secondary hover:text-primary", )} > - {mode === "existing" ? t("newConnection.useSshConnection") : t("newConnection.createInlineSsh")} + {mode === "existing" + ? t("newConnection.useSshConnection") + : t("newConnection.createInlineSsh")} ))}
@@ -604,8 +997,10 @@ export const NewConnectionModal = ({ { setSshPasswordDirty(true); updateField("ssh_password", e.target.value); }} - placeholder={initialConnection && !sshPasswordDirty && !formData.ssh_password ? "••••••••" : t("newConnection.sshPasswordPlaceholder")} + onChange={(e) => { + setSshPasswordDirty(true); + updateField("ssh_password", e.target.value); + }} + placeholder={ + initialConnection && + !sshPasswordDirty && + !formData.ssh_password + ? "••••••••" + : t("newConnection.sshPasswordPlaceholder") + } autoCorrect="off" autoCapitalize="off" autoComplete="off" spellCheck={false} - className="w-full px-2.5 py-1.5 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" + className="w-full px-3 py-2 bg-base border border-strong rounded-md text-sm text-primary placeholder:text-muted focus:border-blue-500 focus:outline-none transition-colors" /> - {formData.save_in_keychain && sshPasswordDirty && !formData.ssh_password && ( -

- {t("newConnection.sshPasswordMissing")} -

- )} + {formData.save_in_keychain && + sshPasswordDirty && + !formData.ssh_password && ( +

+ {" "} + {t("newConnection.sshPasswordMissing")} +

+ )}
+
- {/* ── Top bar: name + close ── */}
-
+
- {/* Left: driver list */}
{(() => { @@ -739,7 +1151,9 @@ export const NewConnectionModal = ({ const bBuiltin = b.is_builtin === true ? 0 : 1; return aBuiltin - bBuiltin; }); - const firstExternalIdx = sortedDrivers.findIndex(d => !d.is_builtin); + const firstExternalIdx = sortedDrivers.findIndex( + (d) => !d.is_builtin, + ); return ( <>

@@ -765,7 +1179,7 @@ export const NewConnectionModal = ({ "flex items-center gap-2.5 px-3 py-2 text-sm font-medium transition-colors text-left w-full", driver === d.id ? "bg-blue-500/15 text-primary border-r-2 border-blue-500" - : "text-secondary hover:bg-surface-secondary hover:text-primary border-r-2 border-transparent" + : "text-secondary hover:bg-surface-secondary hover:text-primary border-r-2 border-transparent", )} > {/* Tab bar */}

- {([ - { id: "general", label: t("newConnection.general", { defaultValue: "General" }) }, - ...(isMultiDb ? [{ id: "databases", label: t("newConnection.selectDatabases") }] : []), - { id: "ssh", label: "SSH" }, - ] as { id: "general" | "databases" | "ssh"; label: string }[]).map((tab) => ( + {( + [ + { + id: "general", + label: t("newConnection.general", { + defaultValue: "General", + }), + }, + ...(isMultiDb + ? [ + { + id: "databases", + label: t("newConnection.selectDatabases"), + }, + ] + : []), + ...(isNetworkDriver ? [{ id: "ssh", label: "SSH" }] : []), + ] as { id: "general" | "databases" | "ssh"; label: string }[] + ).map((tab) => ( ))}
{/* Tab content */}
- {activeTab === "general" ? generalTabContent - : activeTab === "databases" ? databasesTabContent - : sshTabContent} + {activeTab === "general" + ? generalTabContent + : activeTab === "databases" + ? databasesTabContent + : sshTabContent}
@@ -833,7 +1264,7 @@ export const NewConnectionModal = ({ ? "border-green-600/50 bg-green-900/20 text-green-400" : testResult === "error" ? "border-red-600/50 bg-red-900/20 text-red-400" - : "border-strong bg-elevated text-secondary hover:text-primary hover:bg-surface-secondary" + : "border-strong bg-elevated text-secondary hover:text-primary hover:bg-surface-secondary", )} > {status === "testing" ? ( @@ -850,10 +1281,12 @@ export const NewConnectionModal = ({ {/* Status message */} {message && ( -

+

{message}

)} @@ -872,7 +1305,9 @@ export const NewConnectionModal = ({ disabled={status === "saving"} className="flex items-center gap-1.5 px-4 py-1.5 bg-blue-600 hover:bg-blue-500 disabled:opacity-50 text-white rounded-md text-sm font-medium transition-colors" > - {status === "saving" && } + {status === "saving" && ( + + )} {t("newConnection.save")}
@@ -882,7 +1317,10 @@ export const NewConnectionModal = ({ {/* SSH Management Modal */} { setIsSshModalOpen(false); await loadSshConnectionsList(); }} + onClose={async () => { + setIsSshModalOpen(false); + await loadSshConnectionsList(); + }} /> ); diff --git a/src/components/ui/SearchableSelect.tsx b/src/components/ui/SearchableSelect.tsx index 7123c3c..8d9d0c0 100644 --- a/src/components/ui/SearchableSelect.tsx +++ b/src/components/ui/SearchableSelect.tsx @@ -178,7 +178,7 @@ export const SearchableSelect = ({ onClick={handleToggle} disabled={disabled} className={clsx( - "w-full bg-base border rounded px-3 py-2 text-primary flex items-center justify-between transition-colors", + "w-full bg-base border rounded px-3 py-2 text-sm text-primary flex items-center justify-between transition-colors", disabled ? "opacity-50 cursor-not-allowed border-default" : hasError diff --git a/src/components/ui/Select.tsx b/src/components/ui/Select.tsx new file mode 100644 index 0000000..fe17a05 --- /dev/null +++ b/src/components/ui/Select.tsx @@ -0,0 +1,192 @@ +import { useState, useRef, useEffect, useCallback } from "react"; +import { createPortal } from "react-dom"; +import { Search, ChevronDown, X } from "lucide-react"; +import clsx from "clsx"; + +interface SelectProps { + value: string | null; + options: string[]; + onChange: (value: string) => void; + placeholder?: string; + searchPlaceholder?: string; + noResultsLabel?: string; + disabled?: boolean; + className?: string; + hasError?: boolean; + searchable?: boolean; + labels?: Record; +} + +export const Select = ({ + value, + options, + onChange, + placeholder = "Select option", + searchPlaceholder = "Search...", + noResultsLabel = "No results found", + disabled = false, + className, + hasError = false, + searchable = true, + labels, +}: SelectProps) => { + const [isOpen, setIsOpen] = useState(false); + const [searchQuery, setSearchQuery] = useState(""); + const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0, width: 0 }); + const containerRef = useRef(null); + const buttonRef = useRef(null); + const searchInputRef = useRef(null); + const dropdownRef = useRef(null); + + const getLabel = (val: string) => labels?.[val] ?? val; + + const updatePosition = useCallback(() => { + if (buttonRef.current) { + const rect = buttonRef.current.getBoundingClientRect(); + setDropdownPosition({ + top: rect.bottom + 4, + left: rect.left, + width: rect.width, + }); + } + }, []); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + containerRef.current && + !containerRef.current.contains(event.target as Node) && + dropdownRef.current && + !dropdownRef.current.contains(event.target as Node) + ) { + setIsOpen(false); + } + }; + document.addEventListener("mousedown", handleClickOutside); + return () => document.removeEventListener("mousedown", handleClickOutside); + }, []); + + useEffect(() => { + if (isOpen) { + updatePosition(); + const handleScroll = () => updatePosition(); + window.addEventListener("scroll", handleScroll, true); + window.addEventListener("resize", handleScroll); + return () => { + window.removeEventListener("scroll", handleScroll, true); + window.removeEventListener("resize", handleScroll); + }; + } + }, [isOpen, updatePosition]); + + useEffect(() => { + if (isOpen && searchable && searchInputRef.current) { + setTimeout(() => searchInputRef.current?.focus(), 50); + } + }, [isOpen, searchable]); + + const filteredOptions = searchable + ? options.filter((option) => getLabel(option).toLowerCase().includes(searchQuery.toLowerCase())) + : options; + + const handleSelect = (option: string) => { + onChange(option); + setIsOpen(false); + setSearchQuery(""); + }; + + const handleToggle = () => { + if (!disabled) { + if (!isOpen) updatePosition(); + setIsOpen(!isOpen); + } + }; + + const dropdown = isOpen && !disabled && ( +
+ {searchable && ( +
+
+ + setSearchQuery(e.target.value)} + className="w-full bg-transparent border-none text-sm text-primary focus:outline-none placeholder:text-muted" + onKeyDown={(e) => { + if (e.key === "Enter" && filteredOptions.length > 0) handleSelect(filteredOptions[0]); + if (e.key === "Escape") setIsOpen(false); + }} + /> + {searchQuery && ( + + )} +
+
+ )} + +
+ {filteredOptions.length === 0 ? ( +
{noResultsLabel}
+ ) : ( + filteredOptions.map((option) => ( + + )) + )} +
+
+ ); + + return ( +
+ + + {dropdown && createPortal(dropdown, document.body)} +
+ ); +}; + +/** @deprecated Use `Select` instead */ +export const SearchableSelect = Select; diff --git a/src/components/ui/VisualQueryBuilder.tsx b/src/components/ui/VisualQueryBuilder.tsx index 6bf177b..0d728eb 100644 --- a/src/components/ui/VisualQueryBuilder.tsx +++ b/src/components/ui/VisualQueryBuilder.tsx @@ -18,6 +18,7 @@ import { TableNodeComponent, type TableNodeData, type ColumnAggregation } from ' import { JoinEdge } from './JoinEdge'; import { useDatabase } from '../../hooks/useDatabase'; import { invoke } from '@tauri-apps/api/core'; +import { dragState } from '../../utils/dragState'; import { useEditor } from '../../hooks/useEditor'; import { Filter, SortAsc, Group, Hash, X, Plus } from 'lucide-react'; import { generateVisualQuerySQL, type WhereCondition, type OrderByClause } from '../../utils/visualQuery'; @@ -185,16 +186,9 @@ const VisualQueryBuilderContent = () => { [setEdges], ); - const onDragOver = useCallback((event: React.DragEvent) => { - event.preventDefault(); - event.dataTransfer.dropEffect = 'move'; - }, []); - - const onDrop = useCallback( - async (event: React.DragEvent) => { - event.preventDefault(); - - const tableName = event.dataTransfer.getData('application/reactflow'); + const onPointerUp = useCallback( + async (event: React.PointerEvent) => { + const tableName = dragState.table; if (!tableName || !activeConnectionId) return; const position = screenToFlowPosition({ @@ -205,13 +199,13 @@ const VisualQueryBuilderContent = () => { try { const columns = await invoke("get_columns", { connectionId: activeConnectionId, tableName, ...(activeSchema ? { schema: activeSchema } : {}) }); const newNodeId = `${tableName}-${Date.now()}`; - + const newNode: Node = { id: newNodeId, type: 'table', position, - data: { - label: tableName, + data: { + label: tableName, columns: columns.map(c => ({ name: c.name, type: c.data_type })), selectedColumns: {}, columnAggregations: {}, @@ -246,15 +240,14 @@ const VisualQueryBuilderContent = () => { return (
-
+
; connections: SavedConnection[]; + connectionGroups: ConnectionGroup[]; loadConnections: () => Promise; isLoadingConnections: boolean; connect: (connectionId: string) => Promise; @@ -104,6 +119,14 @@ export interface DatabaseContextType { setSelectedDatabases: (databases: string[], connectionId?: string) => void; getConnectionData: (connectionId: string) => ConnectionData | undefined; isConnectionOpen: (connectionId: string) => boolean; + // Connection Group methods + createGroup: (name: string) => Promise; + updateGroup: (id: string, updates: { name?: string; collapsed?: boolean; sort_order?: number }) => Promise; + deleteGroup: (id: string) => Promise; + moveConnectionToGroup: (connectionId: string, groupId: string | null) => Promise; + reorderGroups: (groupOrders: Array<[string, number]>) => Promise; + reorderConnectionsInGroup: (connectionOrders: Array<[string, number]>) => Promise; + toggleGroupCollapsed: (groupId: string) => Promise; } export const DatabaseContext = createContext(undefined); diff --git a/src/contexts/DatabaseProvider.tsx b/src/contexts/DatabaseProvider.tsx index 0eb9470..13c3f03 100644 --- a/src/contexts/DatabaseProvider.tsx +++ b/src/contexts/DatabaseProvider.tsx @@ -6,7 +6,9 @@ import { type ViewInfo, type RoutineInfo, type SavedConnection, - type ConnectionData + type ConnectionData, + type ConnectionGroup, + type ConnectionsFile, } from './DatabaseContext'; import type { ReactNode } from 'react'; import type { PluginManifest } from '../types/plugins'; @@ -45,6 +47,7 @@ export const DatabaseProvider = ({ children }: { children: ReactNode }) => { const [connectionDataMap, setConnectionDataMap] = useState>({}); const [activeTable, setActiveTable] = useState(null); const [connections, setConnections] = useState([]); + const [connectionGroups, setConnectionGroups] = useState([]); const [isLoadingConnections, setIsLoadingConnections] = useState(false); // Refs used in the plugin-disable effect to avoid stale closures @@ -685,8 +688,9 @@ export const DatabaseProvider = ({ children }: { children: ReactNode }) => { const loadConnections = useCallback(async () => { setIsLoadingConnections(true); try { - const result = await invoke('get_connections'); - setConnections(result); + const result = await invoke('get_connections_with_groups'); + setConnections(result.connections); + setConnectionGroups(result.groups); } catch (e) { console.error('Failed to load connections:', e); } finally { @@ -723,6 +727,75 @@ export const DatabaseProvider = ({ children }: { children: ReactNode }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [settings.activeExternalDrivers]); + // Connection Group methods + const createGroup = useCallback(async (name: string): Promise => { + const group = await invoke('create_connection_group', { name }); + setConnectionGroups(prev => [...prev, group]); + return group; + }, []); + + const updateGroup = useCallback(async ( + id: string, + updates: { name?: string; collapsed?: boolean; sort_order?: number } + ): Promise => { + await invoke('update_connection_group', { id, ...updates }); + setConnectionGroups(prev => + prev.map(g => (g.id === id ? { ...g, ...updates } : g)) + ); + }, []); + + const deleteGroup = useCallback(async (id: string): Promise => { + await invoke('delete_connection_group', { id }); + setConnectionGroups(prev => prev.filter(g => g.id !== id)); + // Update connections that were in this group + setConnections(prev => + prev.map(c => (c.group_id === id ? { ...c, group_id: undefined } : c)) + ); + }, []); + + const moveConnectionToGroup = useCallback(async ( + connectionId: string, + groupId: string | null + ): Promise => { + await invoke('move_connection_to_group', { connectionId, groupId }); + setConnections(prev => + prev.map(c => (c.id === connectionId ? { ...c, group_id: groupId ?? undefined } : c)) + ); + }, []); + + const reorderGroups = useCallback(async ( + groupOrders: Array<[string, number]> + ): Promise => { + await invoke('reorder_groups', { groupOrders }); + setConnectionGroups(prev => { + const orderMap = new Map(groupOrders); + return prev.map(g => ({ + ...g, + sort_order: orderMap.get(g.id) ?? g.sort_order, + })).sort((a, b) => a.sort_order - b.sort_order); + }); + }, []); + + const reorderConnectionsInGroup = useCallback(async ( + connectionOrders: Array<[string, number]> + ): Promise => { + await invoke('reorder_connections_in_group', { connectionOrders }); + setConnections(prev => { + const orderMap = new Map(connectionOrders); + return prev.map(c => ({ + ...c, + sort_order: orderMap.get(c.id) ?? c.sort_order, + })); + }); + }, []); + + const toggleGroupCollapsed = useCallback(async (groupId: string): Promise => { + const group = connectionGroups.find(g => g.id === groupId); + if (group) { + await updateGroup(groupId, { collapsed: !group.collapsed }); + } + }, [connectionGroups, updateGroup]); + return ( { selectedDatabases, databaseDataMap, connections, + connectionGroups, loadConnections, isLoadingConnections, connect, @@ -765,6 +839,13 @@ export const DatabaseProvider = ({ children }: { children: ReactNode }) => { setSelectedDatabases, getConnectionData, isConnectionOpen, + createGroup, + updateGroup, + deleteGroup, + moveConnectionToGroup, + reorderGroups, + reorderConnectionsInGroup, + toggleGroupCollapsed, }}> {children} diff --git a/src/contexts/EditorProvider.tsx b/src/contexts/EditorProvider.tsx index 9d46a53..ddd0867 100644 --- a/src/contexts/EditorProvider.tsx +++ b/src/contexts/EditorProvider.tsx @@ -52,17 +52,22 @@ export const EditorProvider = ({ children }: { children: ReactNode }) => { const loadedActiveTabId = await loadActiveTabId(activeConnectionId); if (loadedTabs.length > 0) { - setTabs(loadedTabs); - if (loadedActiveTabId) { - setActiveTabIds((prev) => ({ - ...prev, - [activeConnectionId]: loadedActiveTabId, - })); - } + // Merge loaded tabs with tabs from other connections + setTabs((prev) => { + const tabsFromOtherConnections = prev.filter(t => t.connectionId !== activeConnectionId); + return [...tabsFromOtherConnections, ...loadedTabs]; + }); + setActiveTabIds((prev) => ({ + ...prev, + [activeConnectionId]: loadedActiveTabId || loadedTabs[0].id, + })); } else { - // Create initial tab if no tabs exist + // Create initial tab if no tabs exist, preserving other connections' tabs const initialTab = createInitialTabState(activeConnectionId); - setTabs([initialTab]); + setTabs((prev) => { + const tabsFromOtherConnections = prev.filter(t => t.connectionId !== activeConnectionId); + return [...tabsFromOtherConnections, initialTab]; + }); setActiveTabIds((prev) => ({ ...prev, [activeConnectionId]: initialTab.id, @@ -70,9 +75,12 @@ export const EditorProvider = ({ children }: { children: ReactNode }) => { } } catch (e) { console.error("Failed to load preferences:", e); - // Fallback: create initial tab + // Fallback: create initial tab, preserving other connections' tabs const initialTab = createInitialTabState(activeConnectionId); - setTabs([initialTab]); + setTabs((prev) => { + const tabsFromOtherConnections = prev.filter(t => t.connectionId !== activeConnectionId); + return [...tabsFromOtherConnections, initialTab]; + }); setActiveTabIds((prev) => ({ ...prev, [activeConnectionId]: initialTab.id, diff --git a/src/contexts/SettingsContext.ts b/src/contexts/SettingsContext.ts index 1c7b964..7a6325d 100644 --- a/src/contexts/SettingsContext.ts +++ b/src/contexts/SettingsContext.ts @@ -9,6 +9,11 @@ export type AiProvider = | "custom-openai"; export type ERDiagramLayout = "LR" | "TB"; +export interface PluginConfig { + interpreter?: string; + settings?: Record; +} + export interface Settings { resultPageSize: number; // Changed from queryLimit to match backend config language: AppLanguage; @@ -26,7 +31,7 @@ export interface Settings { maxLogEntries?: number; erDiagramDefaultLayout?: ERDiagramLayout; activeExternalDrivers?: string[]; - maxConnections?: number; + plugins?: Record; } export interface SettingsContextType { @@ -54,5 +59,4 @@ export const DEFAULT_SETTINGS: Settings = { loggingEnabled: true, maxLogEntries: 1000, erDiagramDefaultLayout: "LR", - maxConnections: 1, }; diff --git a/src/hooks/useDrivers.ts b/src/hooks/useDrivers.ts index e016251..d43dd73 100644 --- a/src/hooks/useDrivers.ts +++ b/src/hooks/useDrivers.ts @@ -21,6 +21,8 @@ const FALLBACK_DRIVERS: PluginManifest[] = [ routines: true, file_based: false, folder_based: false, + connection_string: true, + connection_string_example: "postgres://user:pass@localhost:5432/db", identifier_quote: '"', alter_primary_key: true, auto_increment_keyword: "", @@ -46,6 +48,8 @@ const FALLBACK_DRIVERS: PluginManifest[] = [ routines: true, file_based: false, folder_based: false, + connection_string: true, + connection_string_example: "mysql://user:pass@localhost:3306/db", identifier_quote: "`", alter_primary_key: true, auto_increment_keyword: "AUTO_INCREMENT", @@ -71,6 +75,7 @@ const FALLBACK_DRIVERS: PluginManifest[] = [ routines: false, file_based: true, folder_based: false, + connection_string: false, identifier_quote: '"', alter_primary_key: true, auto_increment_keyword: "AUTOINCREMENT", diff --git a/src/i18n/config.ts b/src/i18n/config.ts index f21a397..fdba9d1 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -1,10 +1,10 @@ -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; +import LanguageDetector from "i18next-browser-languagedetector"; -import en from './locales/en.json'; -import it from './locales/it.json'; -import es from './locales/es.json'; +import en from "./locales/en.json"; +import it from "./locales/it.json"; +import es from "./locales/es.json"; i18n .use(LanguageDetector) @@ -15,13 +15,21 @@ i18n it: { translation: it }, es: { translation: es }, }, - fallbackLng: 'en', + fallbackLng: "en", interpolation: { escapeValue: false, }, detection: { - order: ['querystring', 'cookie', 'localStorage', 'navigator', 'htmlTag', 'path', 'subdomain'], - caches: ['localStorage', 'cookie'], + order: [ + "querystring", + "cookie", + "localStorage", + "navigator", + "htmlTag", + "path", + "subdomain", + ], + caches: ["localStorage", "cookie"], }, }); diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 40acf21..e4d7902 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -180,8 +180,6 @@ "pageSize": "Result Page Size (Limit)", "pageSizeDesc": "Limits the number of rows fetched per query to prevent performance issues. Set to 0 to disable (not recommended).", "rows": "rows", - "maxConnections": "Connection Pool Size", - "maxConnectionsDesc": "Maximum number of concurrent database connections per pool. Takes effect when a new connection pool is created. Restart connections to apply changes.", "connections": "connections", "appearance": "Appearance", "localization": "Localization", @@ -325,6 +323,23 @@ "details": "Error Details", "copy": "Copy", "copied": "Copied!" + }, + "startError": { + "title": "Plugin Failed to Start", + "subtitle": "The plugin process could not be launched. Check the error details below.", + "interpreterHint": "This plugin may require an interpreter (e.g. Python). Use Plugin Settings to configure the interpreter path.", + "details": "Error Details", + "copy": "Copy", + "copied": "Copied!", + "configure": "Configure Interpreter" + }, + "pluginSettings": { + "title": "Plugin Settings", + "interpreter": "Interpreter", + "interpreterDesc": "Optional. Specify the executable used to run this plugin (e.g. python3 on macOS/Linux, python or a full path on Windows). Leave blank to use the default.", + "interpreterPlaceholder": "e.g. python3", + "browse": "Browse...", + "fieldRequired": "{{label}} is required" } }, "shortcuts": { @@ -431,6 +446,8 @@ "sshKeyPassphrase": "SSH Key Passphrase (Optional)", "sshKeyPassphrasePlaceholder": "Enter key passphrase if encrypted", "saveKeychain": "Save passwords in Keychain", + "maxConnections": "Connection Pool Size", + "maxConnectionsDesc": "Maximum number of concurrent connections for this pool. Leave empty to use the default (10).", "testConnection": "Test Connection", "save": "Save", "failSave": "Failed to save connection", @@ -438,7 +455,14 @@ "useSshConnection": "Use Existing SSH Connection", "createInlineSsh": "Configure SSH Inline", "manageSshConnections": "Manage SSH Connections", - "noSshConnections": "No SSH connections available" + "noSshConnections": "No SSH connections available", + "sslMode": "SSL Mode", + "sslModes": { + "disable": "Disable", + "allow": "Allow", + "prefer": "Prefer", + "require": "Require" + } }, "sshConnections": { "title": "SSH Connections", @@ -823,5 +847,24 @@ "unknown": "unknown" } } + }, + "groups": { + "title": "Groups", + "newGroup": "New Group", + "createGroup": "Create Group", + "rename": "Rename", + "delete": "Delete", + "deleteConfirm": "Are you sure you want to delete group \"{{name}}\"? Connections in this group will be moved to ungrouped.", + "deleteTitle": "Delete Group", + "connection": "connection", + "connections": "connections", + "ungrouped": "Ungrouped", + "moveToGroup": "Move to Group", + "removeFromGroup": "Remove from Group", + "noGroups": "No groups yet", + "createFirst": "Create your first group to organize connections", + "groupName": "Group name", + "dragHint": "Drag connections here", + "createError": "Failed to create group" } } diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index cf263e0..b569157 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -180,8 +180,6 @@ "pageSize": "Tamaño de Página de Resultados (Límite)", "pageSizeDesc": "Limita el número de filas obtenidas por consulta para prevenir problemas de rendimiento. Establece en 0 para desactivar (no recomendado).", "rows": "filas", - "maxConnections": "Tamaño del Pool de Conexiones", - "maxConnectionsDesc": "Número máximo de conexiones simultáneas a la base de datos por pool. Tiene efecto cuando se crea un nuevo pool de conexiones. Reinicia las conexiones para aplicar los cambios.", "connections": "conexiones", "appearance": "Apariencia", "localization": "Localización", @@ -325,6 +323,23 @@ "details": "Detalles del error", "copy": "Copiar", "copied": "¡Copiado!" + }, + "startError": { + "title": "El Plugin no se pudo iniciar", + "subtitle": "No se pudo lanzar el proceso del plugin. Revisa los detalles del error.", + "interpreterHint": "Este plugin puede requerir un intérprete (p.ej. Python). Usa Configuración del Plugin para establecer la ruta del intérprete.", + "details": "Detalles del Error", + "copy": "Copiar", + "copied": "¡Copiado!", + "configure": "Configurar Intérprete" + }, + "pluginSettings": { + "title": "Configuración del Plugin", + "interpreter": "Intérprete", + "interpreterDesc": "Opcional. Especifica el ejecutable para iniciar este plugin (p.ej. python3 en macOS/Linux, python o ruta completa en Windows). Deja en blanco para usar el valor predeterminado.", + "interpreterPlaceholder": "p.ej. python3", + "browse": "Explorar...", + "fieldRequired": "{{label}} es obligatorio" } }, "shortcuts": { @@ -431,6 +446,8 @@ "sshKeyPassphrase": "Frase de Paso de Clave SSH (Opcional)", "sshKeyPassphrasePlaceholder": "Ingresa la frase de paso si la clave está cifrada", "saveKeychain": "Guardar contraseñas en el Llavero", + "maxConnections": "Tamaño del Pool de Conexiones", + "maxConnectionsDesc": "Número máximo de conexiones simultáneas para este pool. Dejar vacío para usar el valor predeterminado (10).", "testConnection": "Probar Conexión", "save": "Guardar", "failSave": "Error al guardar la conexión", @@ -438,7 +455,14 @@ "useSshConnection": "Usar Conexión SSH Existente", "createInlineSsh": "Configurar SSH en Línea", "manageSshConnections": "Gestionar Conexiones SSH", - "noSshConnections": "No hay conexiones SSH disponibles" + "noSshConnections": "No hay conexiones SSH disponibles", + "sslMode": "Modo SSL", + "sslModes": { + "disable": "Desactivado", + "allow": "Permitir", + "prefer": "Preferido", + "require": "Requerido" + } }, "sshConnections": { "title": "Conexiones SSH", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index b2c78d6..3a71e7c 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -180,8 +180,6 @@ "pageSize": "Dimensione Pagina Risultati (Limite)", "pageSizeDesc": "Limita il numero di righe caricate per query per prevenire problemi di performance. Imposta a 0 per disabilitare (non consigliato).", "rows": "righe", - "maxConnections": "Dimensione Pool di Connessioni", - "maxConnectionsDesc": "Numero massimo di connessioni simultanee al database per pool. Ha effetto quando viene creato un nuovo pool di connessioni. Riavvia le connessioni per applicare le modifiche.", "connections": "connessioni", "appearance": "Aspetto", "localization": "Localizzazione", @@ -325,6 +323,23 @@ "details": "Dettagli errore", "copy": "Copia", "copied": "Copiato!" + }, + "startError": { + "title": "Plugin non avviato", + "subtitle": "Impossibile avviare il processo del plugin. Controlla i dettagli dell'errore.", + "interpreterHint": "Questo plugin potrebbe richiedere un interprete (es. Python). Usa le Impostazioni Plugin per configurare il percorso dell'interprete.", + "details": "Dettagli Errore", + "copy": "Copia", + "copied": "Copiato!", + "configure": "Configura Interprete" + }, + "pluginSettings": { + "title": "Impostazioni Plugin", + "interpreter": "Interprete", + "interpreterDesc": "Opzionale. Specifica l'eseguibile usato per avviare questo plugin (es. python3 su macOS/Linux, python o percorso completo su Windows). Lascia vuoto per usare il valore predefinito.", + "interpreterPlaceholder": "es. python3", + "browse": "Sfoglia...", + "fieldRequired": "{{label}} è obbligatorio" } }, "shortcuts": { @@ -431,6 +446,8 @@ "sshKeyPassphrase": "Passphrase Chiave SSH (Opzionale)", "sshKeyPassphrasePlaceholder": "Inserisci passphrase se la chiave è cifrata", "saveKeychain": "Salva password nel Portachiavi", + "maxConnections": "Dimensione Pool di Connessioni", + "maxConnectionsDesc": "Numero massimo di connessioni simultanee per questo pool. Lascia vuoto per usare il valore predefinito (10).", "testConnection": "Testa Connessione", "save": "Salva", "failSave": "Salvataggio connessione fallito", @@ -438,7 +455,14 @@ "useSshConnection": "Usa Connessione SSH Esistente", "createInlineSsh": "Configura SSH Inline", "manageSshConnections": "Gestisci Connessioni SSH", - "noSshConnections": "Nessuna connessione SSH disponibile" + "noSshConnections": "Nessuna connessione SSH disponibile", + "sslMode": "Modalità SSL", + "sslModes": { + "disable": "Disabilitato", + "allow": "Permetti", + "prefer": "Preferito", + "require": "Richiesto" + } }, "sshConnections": { "title": "Connessioni SSH", diff --git a/src/i18n/locales/pt-br.json b/src/i18n/locales/pt-br.json new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Connections.tsx b/src/pages/Connections.tsx index a3dc621..3f07819 100644 --- a/src/pages/Connections.tsx +++ b/src/pages/Connections.tsx @@ -1,9 +1,9 @@ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useMemo, useRef } from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { NewConnectionModal } from '../components/ui/NewConnectionModal'; +import { ConfirmModal } from '../components/modals/ConfirmModal'; import { invoke } from '@tauri-apps/api/core'; -import { ask } from '@tauri-apps/plugin-dialog'; import { Database, Plus, @@ -19,12 +19,18 @@ import { X, LayoutGrid, List, + FolderPlus, + Folder, + FolderOpen, + ChevronRight, + MoreVertical, } from 'lucide-react'; import { getDriverColor, getDriverIcon } from '../utils/driverUI'; import { useDatabase } from '../hooks/useDatabase'; import { useDrivers } from '../hooks/useDrivers'; import clsx from 'clsx'; import { isLocalDriver, getCapabilitiesForDriver } from '../utils/driverCapabilities'; +import { ContextMenu } from '../components/ui/ContextMenu'; interface SavedConnection { id: string; @@ -43,6 +49,8 @@ interface SavedConnection { ssh_password?: string; ssh_key_file?: string; }; + group_id?: string; + sort_order?: number; } function connectionSubtitle(conn: SavedConnection, capabilities: ReturnType): string { @@ -121,26 +129,142 @@ export const Connections = () => { const { t } = useTranslation(); const navigate = useNavigate(); const location = useLocation(); - const { connect, activeConnectionId, disconnect, isConnectionOpen, switchConnection } = useDatabase(); + const { + connect, + activeConnectionId, + disconnect, + isConnectionOpen, + switchConnection, + connectionGroups, + createGroup, + updateGroup, + deleteGroup, + moveConnectionToGroup, + toggleGroupCollapsed, + loadConnections, + connections: contextConnections, + } = useDatabase(); const { drivers, allDrivers } = useDrivers(); const [isModalOpen, setIsModalOpen] = useState(false); const [editingConnection, setEditingConnection] = useState(null); - const [connections, setConnections] = useState([]); + // Use connections from context, cast to local SavedConnection type for SSH fields + const connections = contextConnections as SavedConnection[]; const [error, setError] = useState(null); const [connectingId, setConnectingId] = useState(null); const [search, setSearch] = useState(''); const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid'); + const [isCreatingGroup, setIsCreatingGroup] = useState(false); + const [newGroupName, setNewGroupName] = useState(''); + const [collapsedGroups, setCollapsedGroups] = useState>(new Set()); + const [groupContextMenu, setGroupContextMenu] = useState<{ x: number; y: number; groupId: string } | null>(null); + const [connectionContextMenu, setConnectionContextMenu] = useState<{ x: number; y: number; connId: string } | null>(null); + const [editingGroupId, setEditingGroupId] = useState(null); + const [editGroupName, setEditGroupName] = useState(''); + const [confirmModal, setConfirmModal] = useState<{ title: string; message: string; onConfirm: () => void } | null>(null); + const isRenameCancelledRef = useRef(false); + + useEffect(() => { void loadConnections(); }, [loadConnections]); + + // Initialize collapsed groups from saved state + useEffect(() => { + const collapsed = new Set(connectionGroups.filter(g => g.collapsed).map(g => g.id)); + setCollapsedGroups(collapsed); + }, [connectionGroups]); + + // Sort groups by sort_order + const sortedGroups = useMemo( + () => [...connectionGroups].sort((a, b) => a.sort_order - b.sort_order), + [connectionGroups] + ); + + // Organize connections by group + const { groupedConnections, ungroupedConnections } = useMemo(() => { + const grouped: Record = {}; + const ungrouped: SavedConnection[] = []; + + for (const conn of connections) { + if (conn.group_id) { + if (!grouped[conn.group_id]) { + grouped[conn.group_id] = []; + } + grouped[conn.group_id].push(conn); + } else { + ungrouped.push(conn); + } + } + + // Sort connections within each group by sort_order + for (const groupId in grouped) { + grouped[groupId].sort((a, b) => (a.sort_order ?? 0) - (b.sort_order ?? 0)); + } + ungrouped.sort((a, b) => (a.sort_order ?? 0) - (b.sort_order ?? 0)); - const loadConnections = async () => { + return { groupedConnections: grouped, ungroupedConnections: ungrouped }; + }, [connections]); + + // Group management functions + const handleCreateGroup = async () => { + if (!newGroupName.trim()) return; try { - const result = await invoke('get_connections'); - setConnections(result); + await createGroup(newGroupName.trim()); + setNewGroupName(''); + setIsCreatingGroup(false); + await loadConnections(); } catch (e) { - console.error('Failed to load connections:', e); + console.error('Failed to create group:', e); + setError(t('groups.createError')); } }; - useEffect(() => { void loadConnections(); }, []); + const handleToggleGroupCollapsed = async (groupId: string) => { + setCollapsedGroups(prev => { + const next = new Set(prev); + if (next.has(groupId)) { + next.delete(groupId); + } else { + next.add(groupId); + } + return next; + }); + await toggleGroupCollapsed(groupId); + }; + + const handleRenameGroup = async (groupId: string) => { + if (!editGroupName.trim()) return; + try { + await updateGroup(groupId, { name: editGroupName.trim() }); + setEditingGroupId(null); + await loadConnections(); + } catch (e) { + console.error('Failed to rename group:', e); + } + }; + + const handleDeleteGroup = (groupId: string) => { + const group = connectionGroups.find(g => g.id === groupId); + setConfirmModal({ + title: t('groups.deleteTitle'), + message: t('groups.deleteConfirm', { name: group?.name }), + onConfirm: async () => { + setConfirmModal(null); + try { + await deleteGroup(groupId); + await loadConnections(); + } catch (e) { + console.error('Failed to delete group:', e); + } + }, + }); + }; + + const handleMoveToGroup = async (connectionId: string, groupId: string | null) => { + try { + await moveConnectionToGroup(connectionId, groupId); + await loadConnections(); + } catch (e) { + console.error('Failed to move connection:', e); + } + }; useEffect(() => { if ((location.state as { openNew?: boolean } | null)?.openNew) { @@ -150,7 +274,7 @@ export const Connections = () => { }, [location.state]); const handleSave = () => { - loadConnections(); + void loadConnections(); setIsModalOpen(false); setEditingConnection(null); }; @@ -184,20 +308,21 @@ export const Connections = () => { } }; - const handleDelete = async (id: string) => { - const confirmed = await ask(t('connections.confirmDelete'), { + const handleDelete = (id: string) => { + setConfirmModal({ title: t('connections.deleteTitle'), - kind: 'warning', + message: t('connections.confirmDelete'), + onConfirm: async () => { + setConfirmModal(null); + try { + if (isConnectionOpen(id)) await disconnect(id); + await invoke('delete_connection', { id }); + void loadConnections(); + } catch (e) { + console.error(e); + } + }, }); - if (confirmed) { - try { - if (isConnectionOpen(id)) await disconnect(id); - await invoke('delete_connection', { id }); - loadConnections(); - } catch (e) { - console.error(e); - } - } }; const openEdit = async (conn: SavedConnection) => { @@ -212,7 +337,7 @@ export const Connections = () => { try { const newConn = await invoke('duplicate_connection', { id }); await loadConnections(); - openEdit(newConn); + void openEdit(newConn); } catch (e) { console.error(e); setError(t('connections.failDuplicate')); @@ -226,6 +351,30 @@ export const Connections = () => { ) : connections; + // Filter grouped/ungrouped based on search + const filteredGroupedConnections = useMemo(() => { + if (!search.trim()) return groupedConnections; + const result: Record = {}; + for (const groupId in groupedConnections) { + const filteredConns = groupedConnections[groupId].filter(c => + c.name.toLowerCase().includes(search.toLowerCase()) || + c.params.driver.toLowerCase().includes(search.toLowerCase()) + ); + if (filteredConns.length > 0) { + result[groupId] = filteredConns; + } + } + return result; + }, [groupedConnections, search]); + + const filteredUngroupedConnections = useMemo(() => { + if (!search.trim()) return ungroupedConnections; + return ungroupedConnections.filter(c => + c.name.toLowerCase().includes(search.toLowerCase()) || + c.params.driver.toLowerCase().includes(search.toLowerCase()) + ); + }, [ungroupedConnections, search]); + const openCount = connections.filter(c => isConnectionOpen(c.id)).length; // ── Status badge ──────────────────────────────────────────────────────────── @@ -339,7 +488,7 @@ export const Connections = () => {
) : ( <> - {/* ── Toolbar: search + view toggle ─────────────────────────── */} + {/* ── Toolbar: search + new group + view toggle ─────────────────────────── */}
@@ -360,6 +509,52 @@ export const Connections = () => { )}
+ {/* New Group button or input */} + {isCreatingGroup ? ( +
+ setNewGroupName(e.target.value)} + onKeyDown={e => { + if (e.key === 'Enter') void handleCreateGroup(); + if (e.key === 'Escape') { + setIsCreatingGroup(false); + setNewGroupName(''); + } + }} + placeholder={t('groups.groupName')} + autoFocus + className="w-40 px-3 py-2 bg-elevated border border-strong rounded-xl text-sm text-primary placeholder:text-muted focus:border-amber-500/70 focus:outline-none transition-colors" + /> + + +
+ ) : ( + + )} + {/* View toggle */}
- - {/* Info */} -
-
- {conn.name} -
- -
-
- - {/* Driver + SSH badges */} -
- - {conn.params.driver} - - {conn.params.ssh_enabled && ( - - SSH - - )} - {!isDriverEnabled && ( - - {t('connections.pluginDisabled')} - - )} -
- - {/* Subtitle */} -

{subtitle}

-
+ +
- {/* Action bar */} -
- handleConnect(conn)} - onDisconnect={() => handleDisconnect(conn.id)} - onEdit={() => void openEdit(conn)} - onDuplicate={() => handleDuplicate(conn.id)} - onDelete={() => handleDelete(conn.id)} - /> -
+ {/* Group connections */} + {!isCollapsed && ( +
+ {groupConns.map(conn => { + const isOpen = isConnectionOpen(conn.id); + const isConnecting = connectingId === conn.id; + const capabilities = getCapabilitiesForDriver(conn.params.driver, allDrivers); + const driverManifest = allDrivers.find(d => d.id === conn.params.driver); + const isDriverEnabled = drivers.some(d => d.id === conn.params.driver); + const subtitle = connectionSubtitle(conn, capabilities); + const driverColor = getDriverColor(driverManifest); + + return ( +
e.dataTransfer.setData('connectionId', conn.id)} + onDoubleClick={() => isDriverEnabled && !isConnecting && handleConnect(conn)} + onContextMenu={(e) => { + e.preventDefault(); + setConnectionContextMenu({ x: e.clientX, y: e.clientY, connId: conn.id }); + }} + className={clsx( + 'group relative flex flex-col rounded-2xl border transition-all duration-150 cursor-pointer select-none overflow-hidden', + !isDriverEnabled && 'opacity-60 cursor-not-allowed', + isConnecting && 'pointer-events-none', + cardClass(conn), + )} + > +
+
+ {getDriverIcon(driverManifest, 20)} +
+
+
+ {conn.name} +
+
+
+ {conn.params.driver} + {conn.params.ssh_enabled && ( + + SSH + + )} + {!isDriverEnabled && ( + + {t('connections.pluginDisabled')} + + )} +
+

{subtitle}

+
+
+
+ handleConnect(conn)} + onDisconnect={() => handleDisconnect(conn.id)} + onEdit={() => void openEdit(conn)} + onDuplicate={() => handleDuplicate(conn.id)} + onDelete={() => handleDelete(conn.id)} + /> +
+
+ ); + })} +
+ )}
); })} - {filtered.length === 0 && search && ( -
+ {/* Ungrouped connections */} + {filteredUngroupedConnections.length > 0 && ( +
+ {sortedGroups.length > 0 && ( +
+ {t('groups.ungrouped')} + ({filteredUngroupedConnections.length}) +
+ )} +
0 && "pl-6")}> + {filteredUngroupedConnections.map(conn => { + const isOpen = isConnectionOpen(conn.id); + const isConnecting = connectingId === conn.id; + const capabilities = getCapabilitiesForDriver(conn.params.driver, allDrivers); + const driverManifest = allDrivers.find(d => d.id === conn.params.driver); + const isDriverEnabled = drivers.some(d => d.id === conn.params.driver); + const subtitle = connectionSubtitle(conn, capabilities); + const driverColor = getDriverColor(driverManifest); + + return ( +
e.dataTransfer.setData('connectionId', conn.id)} + onDoubleClick={() => isDriverEnabled && !isConnecting && handleConnect(conn)} + onContextMenu={(e) => { + e.preventDefault(); + setConnectionContextMenu({ x: e.clientX, y: e.clientY, connId: conn.id }); + }} + className={clsx( + 'group relative flex flex-col rounded-2xl border transition-all duration-150 cursor-pointer select-none overflow-hidden', + !isDriverEnabled && 'opacity-60 cursor-not-allowed', + isConnecting && 'pointer-events-none', + cardClass(conn), + )} + > +
+
+ {getDriverIcon(driverManifest, 20)} +
+
+
+ {conn.name} +
+
+
+ {conn.params.driver} + {conn.params.ssh_enabled && ( + + SSH + + )} + {!isDriverEnabled && ( + + {t('connections.pluginDisabled')} + + )} +
+

{subtitle}

+
+
+
+ handleConnect(conn)} + onDisconnect={() => handleDisconnect(conn.id)} + onEdit={() => void openEdit(conn)} + onDuplicate={() => handleDuplicate(conn.id)} + onDelete={() => handleDelete(conn.id)} + /> +
+
+ ); + })} +
+
+ )} + + {Object.keys(filteredGroupedConnections).length === 0 && filteredUngroupedConnections.length === 0 && search && ( +
{t('connections.noSearchResults', { query: search })}
)} @@ -564,11 +909,80 @@ export const Connections = () => {
{ setIsModalOpen(false); setEditingConnection(null); }} onSave={handleSave} initialConnection={editingConnection} /> + setConfirmModal(null)} + title={confirmModal?.title ?? ""} + message={confirmModal?.message ?? ""} + onConfirm={() => confirmModal?.onConfirm()} + /> + + {/* Group context menu */} + {groupContextMenu && ( + { + const group = connectionGroups.find(g => g.id === groupContextMenu.groupId); + if (group) { + setEditGroupName(group.name); + setEditingGroupId(groupContextMenu.groupId); + } + }, + }, + { separator: true as const }, + { + label: t('groups.delete'), + icon: Trash2, + action: () => handleDeleteGroup(groupContextMenu.groupId), + danger: true, + }, + ]} + onClose={() => setGroupContextMenu(null)} + /> + )} + + {/* Connection context menu for moving to groups */} + {connectionContextMenu && (() => { + const conn = connections.find(c => c.id === connectionContextMenu.connId); + const currentGroupId = conn?.group_id; + const isInGroup = !!currentGroupId; + // Filter out the current group from move targets + const availableGroups = sortedGroups.filter(g => g.id !== currentGroupId); + return ( + ({ + label: group.name, + icon: Folder, + action: () => void handleMoveToGroup(connectionContextMenu.connId, group.id), + })), + // Only show "Remove from Group" if the connection is in a group + ...(isInGroup ? [ + ...(availableGroups.length > 0 ? [{ separator: true as const }] : []), + { + label: t('groups.removeFromGroup'), + icon: X, + action: () => void handleMoveToGroup(connectionContextMenu.connId, null), + }, + ] : []), + ]} + onClose={() => setConnectionContextMenu(null)} + /> + ); + })()}
); }; diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx index b9d711d..40f2c09 100644 --- a/src/pages/Settings.tsx +++ b/src/pages/Settings.tsx @@ -1,4 +1,5 @@ -import { useState, useEffect, useCallback, type ReactNode } from "react"; +import { useState, useEffect, useCallback, useRef, type ReactNode } from "react"; +import { createPortal } from "react-dom"; import { useTranslation, Trans } from "react-i18next"; import { openUrl } from "@tauri-apps/plugin-opener"; import { invoke } from "@tauri-apps/api/core"; @@ -26,6 +27,7 @@ import { RotateCcw, ChevronDown, ChevronRight, + Check, ExternalLink, Activity, Keyboard, @@ -35,7 +37,7 @@ import { import clsx from "clsx"; import { useSettings } from "../hooks/useSettings"; import { useTheme } from "../hooks/useTheme"; -import type { AppLanguage, AiProvider } from "../contexts/SettingsContext"; +import type { AppLanguage, AiProvider, PluginConfig } from "../contexts/SettingsContext"; import { DEFAULT_SETTINGS } from "../contexts/SettingsContext"; import { APP_VERSION } from "../version"; import { message, ask, save } from "@tauri-apps/plugin-dialog"; @@ -47,8 +49,11 @@ import { useDatabase } from "../hooks/useDatabase"; import { findConnectionsForDrivers } from "../utils/connectionManager"; import { parseAuthor, versionGte } from "../utils/plugins"; import type { PluginManifest } from "../types/plugins"; -import { SearchableSelect } from "../components/ui/SearchableSelect"; +import { Select } from "../components/ui/Select"; import { PluginInstallErrorModal } from "../components/modals/PluginInstallErrorModal"; +import { PluginRemoveModal } from "../components/modals/PluginRemoveModal"; +import { PluginSettingsModal } from "../components/modals/PluginSettingsModal"; +import { PluginStartErrorModal } from "../components/modals/PluginStartErrorModal"; import { useUpdate } from "../hooks/useUpdate"; import { useKeybindings } from "../hooks/useKeybindings"; import { formatEvent, formatMatch, parseCombo } from "../utils/keybindings"; @@ -665,6 +670,120 @@ const ShortcutsTab = () => { ); }; +interface VersionOption { + version: string; + isInstalled: boolean; + isLatest: boolean; +} + +const VersionDropdown = ({ + options, + value, + onChange, + isDowngrade, + label, +}: { + options: VersionOption[]; + value: string; + onChange: (v: string) => void; + isDowngrade: boolean; + label: string; +}) => { + const [isOpen, setIsOpen] = useState(false); + const [pos, setPos] = useState({ top: 0, left: 0, minWidth: 0 }); + const btnRef = useRef(null); + const dropRef = useRef(null); + + const updatePos = () => { + if (btnRef.current) { + const r = btnRef.current.getBoundingClientRect(); + setPos({ top: r.bottom + 4, left: r.left, minWidth: Math.max(r.width, 160) }); + } + }; + + useEffect(() => { + if (!isOpen) return; + const onMouseDown = (e: MouseEvent) => { + if (!btnRef.current?.contains(e.target as Node) && !dropRef.current?.contains(e.target as Node)) { + setIsOpen(false); + } + }; + const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") setIsOpen(false); }; + document.addEventListener("mousedown", onMouseDown); + document.addEventListener("keydown", onKey); + return () => { + document.removeEventListener("mousedown", onMouseDown); + document.removeEventListener("keydown", onKey); + }; + }, [isOpen]); + + return ( + <> + + + {isOpen && createPortal( +
+ {options.map((opt) => ( + + ))} +
, + document.body + )} + + ); +}; + export const Settings = () => { const { t } = useTranslation(); const { settings, updateSetting } = useSettings(); @@ -680,12 +799,20 @@ export const Settings = () => { const { openConnectionIds, connectionDataMap, disconnect } = useDatabase(); const [installingPluginId, setInstallingPluginId] = useState(null); const [pluginInstallError, setPluginInstallError] = useState<{ pluginId: string; error: string } | null>(null); + const [pluginSettingsModal, setPluginSettingsModal] = useState<{ pluginId: string; pluginName: string } | null>(null); + const [openModalManifest, setOpenModalManifest] = useState(undefined); + const [pluginStartError, setPluginStartError] = useState<{ pluginId: string; pluginName: string; error: string } | null>(null); const [selectedVersions, setSelectedVersions] = useState>({}); const [uninstallingPluginId, setUninstallingPluginId] = useState(null); + const [pluginRemoveConfirm, setPluginRemoveConfirm] = useState<{ pluginId: string; pluginName: string; onConfirm: () => Promise } | null>(null); const [systemPrompt, setSystemPrompt] = useState(""); const [explainPrompt, setExplainPrompt] = useState(""); const { currentTheme, allThemes, setTheme } = useTheme(); + const settingsRef = useRef(settings); + settingsRef.current = settings; + const updateSettingRef = useRef(updateSetting); + updateSettingRef.current = updateSetting; // Initialize customFont from settings if it's a custom font const [customFont, setCustomFont] = useState(() => { @@ -693,6 +820,39 @@ export const Settings = () => { return !isPredefinedFont && settings.fontFamily ? settings.fontFamily : ""; }); + const handleSavePluginConfig = useCallback(async (pluginId: string, pluginName: string, config: PluginConfig) => { + const current = settings.plugins ?? {}; + updateSetting("plugins", { ...current, [pluginId]: config }); + const isRunning = allDrivers.some(d => d.id === pluginId); + if (isRunning) { + try { + await invoke("disable_plugin", { pluginId }); + await invoke("enable_plugin", { pluginId }); + refreshDrivers(); + } catch (err) { + const activeExt = settings.activeExternalDrivers ?? []; + updateSetting("activeExternalDrivers", activeExt.filter(id => id !== pluginId)); + refreshDrivers(); + setPluginStartError({ pluginId, pluginName, error: String(err) }); + } + } + }, [settings.plugins, settings.activeExternalDrivers, updateSetting, allDrivers, refreshDrivers]); + + const handleOpenPluginSettings = useCallback(async (pluginId: string, pluginName: string) => { + setPluginSettingsModal({ pluginId, pluginName }); + const runningDriver = allDrivers.find((d) => d.id === pluginId); + if (runningDriver) { + setOpenModalManifest(runningDriver); + } else { + try { + const manifest = await invoke("get_plugin_manifest", { pluginId }); + setOpenModalManifest(manifest); + } catch { + setOpenModalManifest(undefined); + } + } + }, [allDrivers]); + const loadModels = useCallback(async (force: boolean = false) => { try { const models = await invoke>("get_ai_models", { forceRefresh: force }); @@ -817,6 +977,18 @@ export const Settings = () => { loadSystemPrompt(); loadExplainPrompt(); loadModels(false); + invoke>("get_plugin_startup_errors").then((errors) => { + if (errors.length > 0) { + const failedIds = errors.map(e => e.plugin_id); + const activeExt = settingsRef.current.activeExternalDrivers ?? []; + const cleaned = activeExt.filter(id => !failedIds.includes(id)); + if (cleaned.length !== activeExt.length) { + updateSettingRef.current("activeExternalDrivers", cleaned); + } + const first = errors[0]; + setPluginStartError({ pluginId: first.plugin_id, pluginName: first.plugin_id, error: first.error }); + } + }).catch(() => {/* ignore */}); }, [loadModels]); @@ -978,32 +1150,6 @@ export const Settings = () => {
-
- -

- {t("settings.maxConnectionsDesc")} -

-
- - updateSetting( - "maxConnections", - parseInt(e.target.value) || DEFAULT_SETTINGS.maxConnections!, - ) - } - min="1" - max="100" - className="bg-base border border-strong rounded px-3 py-2 text-primary w-32 focus:outline-none focus:border-blue-500 transition-colors" - /> - - {t("settings.connections")} - -
-
@@ -1514,7 +1660,7 @@ export const Settings = () => { <>
- updateSetting("aiModel", val)} options={currentModels} @@ -1786,37 +1932,25 @@ export const Settings = () => { )} {/* Version picker — for downgrades when at latest, or between multiple installable versions */} - {showVersionPicker && ( -
-
- - {isAtLatest && isSelectedInstalled ? t("settings.plugins.olderVersions") : `v${selectedVer}`} - -
- -
- )} + onChange={(v) => setSelectedVersions((prev) => ({ ...prev, [plugin.id]: v }))} + isDowngrade={isDowngrade} + label={isAtLatest && isSelectedInstalled ? t("settings.plugins.olderVersions") : `v${selectedVer}`} + /> + ); + })()} ) } @@ -1873,7 +2007,7 @@ export const Settings = () => { updateSetting("activeExternalDrivers", [...activeExt, driver.id]); } } catch (err) { - await message(String(err), { title: t("common.error"), kind: "error" }); + setPluginStartError({ pluginId: driver.id, pluginName: driver.name, error: String(err) }); } }} disabled={isBuiltin} @@ -1884,28 +2018,38 @@ export const Settings = () => { > + {/* Plugin settings */} + {!isBuiltin && ( + + )} {/* Remove link */} {!isBuiltin && ( {/* Remove link */} + {/* Plugin settings */} + {/* Remove link */} +
); }; diff --git a/src/types/plugins.ts b/src/types/plugins.ts index 9d94716..d941ef6 100644 --- a/src/types/plugins.ts +++ b/src/types/plugins.ts @@ -4,6 +4,14 @@ export interface DriverCapabilities { routines: boolean; file_based: boolean; folder_based: boolean; + /** Optional flag to enable/disable connection string import UI for network drivers. Defaults to true when omitted. */ + connection_string?: boolean; + /** CamelCase alias accepted for plugin compatibility. */ + connectionString?: boolean; + /** Optional placeholder example shown in the connection string input. */ + connection_string_example?: string; + /** CamelCase alias accepted for plugin compatibility. */ + connectionStringExample?: string; identifier_quote: string; alter_primary_key: boolean; // SQL generation capabilities (optional, default to '' / false when not present) @@ -13,6 +21,20 @@ export interface DriverCapabilities { // DDL capabilities (optional, default to false when not present) alter_column?: boolean; create_foreign_keys?: boolean; + /** true for API-based plugins that need no host/port/credentials (e.g. public REST APIs). Hides the entire connection form. */ + no_connection_required?: boolean; +} + +export type PluginSettingType = "string" | "boolean" | "number" | "select"; + +export interface PluginSettingDefinition { + key: string; + label: string; + type: PluginSettingType; + default?: string | boolean | number; + description?: string; + required?: boolean; + options?: string[]; // only when type === "select" } export interface PluginManifest { @@ -31,6 +53,8 @@ export interface PluginManifest { /** Icon name: built-in values are "mysql" | "postgres" | "sqlite" | "network" | "database" | "folder-open". * External plugins can reference a file bundled in the plugin package. */ icon?: string; + /** Plugin-declared setting definitions. Empty/absent for built-in drivers. */ + settings?: PluginSettingDefinition[]; } export interface RegistryReleaseWithStatus { diff --git a/src/utils/connectionStringParser.ts b/src/utils/connectionStringParser.ts new file mode 100644 index 0000000..fa1696c --- /dev/null +++ b/src/utils/connectionStringParser.ts @@ -0,0 +1,242 @@ +/** + * Connection string parsing utilities. + * The supported protocols are derived from driver capabilities when provided. + */ + +import type { DriverCapabilities } from "../types/plugins"; +import { isLocalDriver } from "./driverCapabilities"; +import type { ConnectionParams, DatabaseDriver } from "./connections"; +import { BUILTIN_DRIVER_IDS } from "./connections"; + +export interface ParsedConnectionString { + driver: DatabaseDriver; + host?: string; + port?: number; + username?: string; + password?: string; + database: string; +} + +export interface ConnectionStringParseResult { + success: true; + params: ParsedConnectionString; +} + +export interface ConnectionStringParseError { + success: false; + error: string; +} + +export type ConnectionStringResult = + | ConnectionStringParseResult + | ConnectionStringParseError; + +export interface ConnectionStringDriver { + id: DatabaseDriver; + capabilities?: DriverCapabilities | null; +} + +interface ResolvedDriver { + id: DatabaseDriver; + local: boolean; +} + +function normalizeProtocol(protocol: string): string { + return protocol.replace(/:$/, "").trim().toLowerCase(); +} + +function getProtocolFromExample(example?: string | null): string | null { + if (!example?.trim()) return null; + + try { + const url = new URL(example.trim()); + return normalizeProtocol(url.protocol); + } catch { + return null; + } +} + +function connectionStringImportEnabled( + capabilities?: DriverCapabilities | null, +): boolean { + if (!capabilities) return true; + return ( + capabilities.connection_string ?? capabilities.connectionString ?? true + ); +} + +function resolveDrivers( + drivers?: ReadonlyArray, +): ReadonlyArray { + if (drivers && drivers.length > 0) return drivers; + return BUILTIN_DRIVER_IDS.map((id) => ({ id, capabilities: null })); +} + +function buildProtocolRegistry( + drivers?: ReadonlyArray, +): Map { + const registry = new Map(); + + for (const driver of resolveDrivers(drivers)) { + const local = isLocalDriver(driver.capabilities); + const canImport = + local || connectionStringImportEnabled(driver.capabilities); + + if (!canImport) continue; + + const idProtocol = normalizeProtocol(driver.id); + if (idProtocol) { + registry.set(idProtocol, { id: driver.id, local }); + } + + const exampleProtocol = getProtocolFromExample( + driver.capabilities?.connection_string_example ?? + driver.capabilities?.connectionStringExample, + ); + + if (exampleProtocol) { + registry.set(exampleProtocol, { id: driver.id, local }); + } + } + + return registry; +} + +export function getSupportedConnectionStringProtocols( + drivers?: ReadonlyArray, +): string[] { + return Array.from(buildProtocolRegistry(drivers).keys()).sort(); +} + +/** + * Parse a database connection string. + * Supported protocols are inferred from the provided drivers/capabilities. + */ +export function parseConnectionString( + connectionString: string, + drivers?: ReadonlyArray, +): ConnectionStringResult { + if (!connectionString || !connectionString.trim()) { + return { success: false, error: "Connection string is empty" }; + } + + const trimmed = connectionString.trim(); + + let url: URL; + try { + url = new URL(trimmed); + } catch { + return { success: false, error: "Invalid connection string format" }; + } + + const protocol = normalizeProtocol(url.protocol); + const registry = buildProtocolRegistry(drivers); + const resolved = registry.get(protocol); + + if (!resolved) { + const supported = getSupportedConnectionStringProtocols(drivers); + const suffix = + supported.length > 0 ? `. Supported: ${supported.join(", ")}` : ""; + return { + success: false, + error: `Unsupported database driver: ${protocol}${suffix}`, + }; + } + + if (resolved.local) { + const rawPath = url.pathname; + if (!rawPath) { + return { + success: false, + error: "Connection string must include a database path", + }; + } + + const database = decodeURIComponent(rawPath.replace(/^\//, "")); + if (!database) { + return { + success: false, + error: "Connection string must include a database path", + }; + } + + return { + success: true, + params: { + driver: resolved.id, + database, + }, + }; + } + + const host = url.hostname || undefined; + const port = url.port ? Number.parseInt(url.port, 10) : undefined; + const username = url.username ? decodeURIComponent(url.username) : undefined; + const password = url.password ? decodeURIComponent(url.password) : undefined; + + let database = url.pathname; + if (database.startsWith("/")) { + database = database.slice(1); + } + database = decodeURIComponent(database); + + if (!database) { + return { + success: false, + error: "Database name is required in connection string", + }; + } + + return { + success: true, + params: { + driver: resolved.id, + host, + port, + username, + password, + database, + }, + }; +} + +/** + * Convert parsed connection string to ConnectionParams format. + */ +export function toConnectionParams( + parsed: ParsedConnectionString, +): Partial { + return { + driver: parsed.driver, + host: parsed.host, + port: parsed.port, + username: parsed.username, + password: parsed.password, + database: parsed.database, + }; +} + +/** + * Validate if a string looks like a supported connection string. + * Supported protocols are inferred from the provided drivers/capabilities. + */ +export function looksLikeConnectionString( + value: string, + drivers?: ReadonlyArray, +): boolean { + if (!value || !value.trim()) return false; + + const trimmed = value.trim(); + + let url: URL; + try { + url = new URL(trimmed); + } catch { + return false; + } + + const protocol = normalizeProtocol(url.protocol); + const registry = buildProtocolRegistry(drivers); + + return registry.has(protocol); +} diff --git a/src/utils/connections.ts b/src/utils/connections.ts index ad315dd..60a2dfd 100644 --- a/src/utils/connections.ts +++ b/src/utils/connections.ts @@ -39,6 +39,7 @@ export interface ConnectionParams { ssh_password?: string; ssh_key_file?: string; ssh_key_passphrase?: string; + max_connections?: number; } /** diff --git a/src/utils/credentials.ts b/src/utils/credentials.ts new file mode 100644 index 0000000..9635998 --- /dev/null +++ b/src/utils/credentials.ts @@ -0,0 +1,34 @@ +import { invoke } from "@tauri-apps/api/core"; + +interface ConnectionParams { + driver: string; + host?: string; + port?: number; + username?: string; + password?: string; + database: string | string[]; + ssl_mode?: string; + ssh_enabled?: boolean; + ssh_connection_id?: string; + ssh_host?: string; + ssh_port?: number; + ssh_user?: string; + ssh_password?: string; + ssh_key_file?: string; + ssh_key_passphrase?: string; + save_in_keychain?: boolean; +} + +export interface SavedConnectionWithCredentials { + id: string; + name: string; + params: ConnectionParams; +} + +export async function fetchConnectionWithCredentials( + id: string, +): Promise { + return await invoke("get_connection_by_id", { + id, + }); +} diff --git a/src/utils/database.ts b/src/utils/database.ts index 05afe65..ab3ad47 100644 --- a/src/utils/database.ts +++ b/src/utils/database.ts @@ -6,6 +6,7 @@ import type { DriverCapabilities } from '../types/plugins'; */ export function isMultiDatabaseCapable(capabilities: DriverCapabilities | null | undefined): boolean { if (!capabilities) return false; + if (capabilities.no_connection_required) return false; return ( capabilities.file_based === false && !capabilities.folder_based && diff --git a/src/utils/dragState.ts b/src/utils/dragState.ts new file mode 100644 index 0000000..2807573 --- /dev/null +++ b/src/utils/dragState.ts @@ -0,0 +1,7 @@ +let _table: string | null = null; + +export const dragState = { + get table() { return _table; }, + start(name: string) { _table = name; }, + clear() { _table = null; }, +}; diff --git a/src/utils/pluginConfig.ts b/src/utils/pluginConfig.ts new file mode 100644 index 0000000..1947876 --- /dev/null +++ b/src/utils/pluginConfig.ts @@ -0,0 +1,68 @@ +import type { PluginConfig } from "../contexts/SettingsContext"; +import type { PluginSettingDefinition } from "../types/plugins"; + +/** + * Builds a PluginConfig from a raw interpreter string entered by the user. + * Trims whitespace; an empty string clears the interpreter field. + */ +export function resolvePluginConfig( + currentConfig: PluginConfig | undefined, + rawInterpreter: string, +): PluginConfig { + return { + ...(currentConfig ?? {}), + interpreter: rawInterpreter.trim() || undefined, + }; +} + +/** + * Returns the interpreter to display in the modal input for a given plugin. + * Falls back to an empty string when none is configured. + */ +export function getDisplayInterpreter(config: PluginConfig | undefined): string { + return config?.interpreter ?? ""; +} + +/** + * Merges saved setting values with defaults declared in the manifest. + * For each definition: uses the saved value if present, otherwise falls back + * to the declared default. Returns an object keyed by setting key. + */ +export function resolveSettingsWithDefaults( + definitions: PluginSettingDefinition[], + saved: Record | undefined, +): Record { + const result: Record = {}; + for (const def of definitions) { + if (saved !== undefined && Object.prototype.hasOwnProperty.call(saved, def.key)) { + result[def.key] = saved[def.key]; + } else if (def.default !== undefined) { + result[def.key] = def.default; + } + } + return result; +} + +/** + * Validates setting values against their definitions. + * Returns a map of key → error message for any field that fails validation. + * Currently validates only required fields (non-empty value required). + */ +export function validateSettings( + definitions: PluginSettingDefinition[], + values: Record, +): Record { + const errors: Record = {}; + for (const def of definitions) { + if (!def.required) continue; + const val = values[def.key]; + const isEmpty = + val === undefined || + val === null || + (typeof val === "string" && val.trim() === ""); + if (isEmpty) { + errors[def.key] = def.label; + } + } + return errors; +} diff --git a/src/utils/tabFilters.ts b/src/utils/tabFilters.ts index eb42ba4..4d9f826 100644 --- a/src/utils/tabFilters.ts +++ b/src/utils/tabFilters.ts @@ -30,7 +30,7 @@ export function findTabById(tabs: Tab[], tabId: string | null): Tab | undefined * @param tabs - All tabs * @param connectionId - The connection ID * @param activeTabId - The active tab ID - * @returns The active tab if found and belongs to the connection, null otherwise + * @returns The active tab if found and belongs to the connection, or the first tab for the connection as fallback */ export function getActiveTabForConnection( tabs: Tab[], @@ -38,8 +38,13 @@ export function getActiveTabForConnection( activeTabId: string | null ): Tab | null { if (!connectionId || !activeTabId) return null; + const tab = findTabById(tabs, activeTabId); - return tab && tab.connectionId === connectionId ? tab : null; + if (tab && tab.connectionId === connectionId) { + return tab; + } + + return null; } /** diff --git a/src/version.ts b/src/version.ts index 6a29225..57c03ed 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const APP_VERSION = "0.9.5"; +export const APP_VERSION = "0.9.8"; diff --git a/tests/utils/connectionStringParser.test.ts b/tests/utils/connectionStringParser.test.ts new file mode 100644 index 0000000..f70255d --- /dev/null +++ b/tests/utils/connectionStringParser.test.ts @@ -0,0 +1,396 @@ +import { describe, it, expect } from "vitest"; +import { + parseConnectionString, + toConnectionParams, + looksLikeConnectionString, + type ParsedConnectionString, + type ConnectionStringDriver, +} from "../../src/utils/connectionStringParser"; + +function createRemoteDriver( + id: string, + example: string, +): ConnectionStringDriver { + return { + id, + capabilities: { + schemas: id === "postgres", + views: true, + routines: true, + file_based: false, + folder_based: false, + connection_string: true, + connection_string_example: example, + identifier_quote: id === "mysql" ? "`" : '"', + alter_primary_key: true, + }, + }; +} + +const CAPABILITY_DRIVERS: ConnectionStringDriver[] = [ + createRemoteDriver("postgres", "postgresql://user:pass@localhost:5432/db"), + createRemoteDriver("mysql", "mariadb://user:pass@localhost:3306/db"), + { + id: "sqlite", + capabilities: { + schemas: false, + views: true, + routines: false, + file_based: true, + folder_based: false, + connection_string: false, + identifier_quote: '"', + alter_primary_key: true, + }, + }, +]; + +describe("connectionStringParser", () => { + describe("parseConnectionString", () => { + it("should parse MySQL connection string", () => { + const result = parseConnectionString( + "mysql://root:password@localhost:3306/mydb", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("mysql"); + expect(result.params.host).toBe("localhost"); + expect(result.params.port).toBe(3306); + expect(result.params.username).toBe("root"); + expect(result.params.password).toBe("password"); + expect(result.params.database).toBe("mydb"); + } + }); + + it("should parse MySQL connection string without port", () => { + const result = parseConnectionString( + "mysql://root@localhost/mydb", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("mysql"); + expect(result.params.host).toBe("localhost"); + expect(result.params.port).toBeUndefined(); + expect(result.params.username).toBe("root"); + expect(result.params.password).toBeUndefined(); + expect(result.params.database).toBe("mydb"); + } + }); + + it("should parse MySQL connection string without credentials", () => { + const result = parseConnectionString( + "mysql://localhost/mydb", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("mysql"); + expect(result.params.host).toBe("localhost"); + expect(result.params.username).toBeUndefined(); + expect(result.params.password).toBeUndefined(); + expect(result.params.database).toBe("mydb"); + } + }); + + it("should parse PostgreSQL connection string", () => { + const result = parseConnectionString( + "postgres://user:pass@db.example.com:5432/mydb", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("postgres"); + expect(result.params.host).toBe("db.example.com"); + expect(result.params.port).toBe(5432); + expect(result.params.username).toBe("user"); + expect(result.params.password).toBe("pass"); + expect(result.params.database).toBe("mydb"); + } + }); + + it("should parse postgresql:// as postgres using capabilities", () => { + const result = parseConnectionString( + "postgresql://user@host/db", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("postgres"); + } + }); + + it("should parse mariadb:// as mysql using capabilities", () => { + const result = parseConnectionString( + "mariadb://user@host/db", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("mysql"); + } + }); + + it("should parse SQLite connection string", () => { + const result = parseConnectionString( + "sqlite:///path/to/database.db", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("sqlite"); + expect(result.params.database).toBe("path/to/database.db"); + expect(result.params.host).toBeUndefined(); + expect(result.params.port).toBeUndefined(); + } + }); + + it("should parse SQLite with absolute path", () => { + const result = parseConnectionString( + "sqlite:////absolute/path/db.sqlite", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("sqlite"); + expect(result.params.database).toBe("/absolute/path/db.sqlite"); + } + }); + + it("should decode URL-encoded characters in credentials", () => { + const result = parseConnectionString( + "mysql://user%40domain:password%23123@host/db", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.username).toBe("user@domain"); + expect(result.params.password).toBe("password#123"); + } + }); + + it("should decode URL-encoded characters in database name", () => { + const result = parseConnectionString( + "mysql://localhost/my%20database", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.database).toBe("my database"); + } + }); + + it("should handle IPv4 addresses", () => { + const result = parseConnectionString( + "mysql://user@192.168.1.100:3306/db", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.host).toBe("192.168.1.100"); + } + }); + + it("should handle connection string with query parameters", () => { + const result = parseConnectionString( + "mysql://user:pass@localhost:3306/db?ssl_mode=require", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.database).toBe("db"); + } + }); + + it("should fail for empty string", () => { + const result = parseConnectionString("", CAPABILITY_DRIVERS); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error).toBe("Connection string is empty"); + } + }); + + it("should fail for whitespace-only string", () => { + const result = parseConnectionString(" ", CAPABILITY_DRIVERS); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error).toBe("Connection string is empty"); + } + }); + + it("should fail for invalid URL format", () => { + const result = parseConnectionString( + "not-a-valid-url", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error).toBe("Invalid connection string format"); + } + }); + + it("should fail for unsupported driver", () => { + const result = parseConnectionString( + "oracle://user@host/db", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error).toContain("Unsupported database driver"); + } + }); + + it("should fail for SQLite without path", () => { + const result = parseConnectionString("sqlite://", CAPABILITY_DRIVERS); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error).toContain("must include a database path"); + } + }); + + it("should fail for remote database without database name", () => { + const result = parseConnectionString( + "mysql://user@localhost", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error).toContain("Database name is required"); + } + }); + + it("should parse database name for capability-driven multi-database drivers", () => { + const result = parseConnectionString( + "postgresql://user:pass@db.example.com:5432/analytics", + CAPABILITY_DRIVERS, + ); + expect(result.success).toBe(true); + if (result.success) { + expect(result.params.driver).toBe("postgres"); + expect(result.params.database).toBe("analytics"); + } + }); + }); + + describe("toConnectionParams", () => { + it("should convert parsed result to ConnectionParams", () => { + const parsed: ParsedConnectionString = { + driver: "mysql", + host: "localhost", + port: 3306, + username: "root", + password: "pass", + database: "mydb", + }; + + const params = toConnectionParams(parsed); + expect(params.driver).toBe("mysql"); + expect(params.host).toBe("localhost"); + expect(params.port).toBe(3306); + expect(params.username).toBe("root"); + expect(params.password).toBe("pass"); + expect(params.database).toBe("mydb"); + }); + + it("should handle optional fields", () => { + const parsed: ParsedConnectionString = { + driver: "sqlite", + database: "/path/to/db.sqlite", + }; + + const params = toConnectionParams(parsed); + expect(params.driver).toBe("sqlite"); + expect(params.database).toBe("/path/to/db.sqlite"); + expect(params.host).toBeUndefined(); + expect(params.port).toBeUndefined(); + expect(params.username).toBeUndefined(); + expect(params.password).toBeUndefined(); + }); + }); + + describe("looksLikeConnectionString", () => { + it("should return true for mysql://", () => { + expect( + looksLikeConnectionString("mysql://user@host/db", CAPABILITY_DRIVERS), + ).toBe(true); + }); + + it("should return true for mariadb://", () => { + expect( + looksLikeConnectionString("mariadb://user@host/db", CAPABILITY_DRIVERS), + ).toBe(true); + }); + + it("should return true for postgres://", () => { + expect( + looksLikeConnectionString( + "postgres://user@host/db", + CAPABILITY_DRIVERS, + ), + ).toBe(true); + }); + + it("should return true for postgresql://", () => { + expect( + looksLikeConnectionString( + "postgresql://user@host/db", + CAPABILITY_DRIVERS, + ), + ).toBe(true); + }); + + it("should return true for sqlite://", () => { + expect( + looksLikeConnectionString("sqlite:///path/to/db", CAPABILITY_DRIVERS), + ).toBe(true); + }); + + it("should return false for empty string", () => { + expect(looksLikeConnectionString("", CAPABILITY_DRIVERS)).toBe(false); + }); + + it("should return false for regular string", () => { + expect(looksLikeConnectionString("localhost", CAPABILITY_DRIVERS)).toBe( + false, + ); + }); + + it("should return false for arbitrary URL", () => { + expect( + looksLikeConnectionString("https://example.com", CAPABILITY_DRIVERS), + ).toBe(false); + }); + + it("should use provided driver capabilities to validate protocols", () => { + const restrictedDrivers: ConnectionStringDriver[] = [ + createRemoteDriver( + "postgres", + "postgresql://user:pass@localhost:5432/db", + ), + ]; + + expect( + looksLikeConnectionString( + "postgresql://user@host/db", + restrictedDrivers, + ), + ).toBe(true); + expect( + looksLikeConnectionString("mysql://user@host/db", restrictedDrivers), + ).toBe(false); + }); + + it("should be case insensitive for protocol", () => { + expect( + looksLikeConnectionString("MYSQL://user@host/db", CAPABILITY_DRIVERS), + ).toBe(true); + expect( + looksLikeConnectionString( + "PostgreSQL://user@host/db", + CAPABILITY_DRIVERS, + ), + ).toBe(true); + }); + }); +}); diff --git a/tests/utils/credentials.test.ts b/tests/utils/credentials.test.ts new file mode 100644 index 0000000..6a57735 --- /dev/null +++ b/tests/utils/credentials.test.ts @@ -0,0 +1,37 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { invoke } from "@tauri-apps/api/core"; +import { fetchConnectionWithCredentials } from "../../src/utils/credentials"; + +vi.mock("@tauri-apps/api/core", () => ({ + invoke: vi.fn(), +})); + +describe("credentials", () => { + beforeEach(() => { + vi.mocked(invoke).mockReset(); + }); + + describe("fetchConnectionWithCredentials", () => { + it("invoca find_connection_by_id con l'id fornito", async () => { + const mockConn = { + id: "abc", + name: "Test", + params: { driver: "mysql", password: "secret", database: "mydb" }, + }; + vi.mocked(invoke).mockResolvedValueOnce(mockConn); + + const result = await fetchConnectionWithCredentials("abc"); + + expect(invoke).toHaveBeenCalledWith("get_connection_by_id", { id: "abc" }); + expect(result).toEqual(mockConn); + }); + + it("propaga gli errori del backend", async () => { + vi.mocked(invoke).mockRejectedValueOnce("Connection not found"); + + await expect(fetchConnectionWithCredentials("unknown")).rejects.toBe( + "Connection not found", + ); + }); + }); +}); diff --git a/tests/utils/pluginConfig.test.ts b/tests/utils/pluginConfig.test.ts new file mode 100644 index 0000000..905d49c --- /dev/null +++ b/tests/utils/pluginConfig.test.ts @@ -0,0 +1,154 @@ +import { describe, it, expect } from "vitest"; +import { resolvePluginConfig, getDisplayInterpreter, resolveSettingsWithDefaults, validateSettings } from "../../src/utils/pluginConfig"; +import type { PluginConfig } from "../../src/contexts/SettingsContext"; +import type { PluginSettingDefinition } from "../../src/types/plugins"; + +describe("pluginConfig", () => { + describe("resolvePluginConfig", () => { + it("sets interpreter when a non-empty string is provided", () => { + const result = resolvePluginConfig(undefined, "python3"); + expect(result.interpreter).toBe("python3"); + }); + + it("trims whitespace from interpreter", () => { + const result = resolvePluginConfig(undefined, " python "); + expect(result.interpreter).toBe("python"); + }); + + it("sets interpreter to undefined when empty string is provided", () => { + const result = resolvePluginConfig(undefined, ""); + expect(result.interpreter).toBeUndefined(); + }); + + it("sets interpreter to undefined when only whitespace is provided", () => { + const result = resolvePluginConfig(undefined, " "); + expect(result.interpreter).toBeUndefined(); + }); + + it("preserves existing settings when updating interpreter", () => { + const current: PluginConfig = { + interpreter: "old-python", + settings: { timeout: 30 }, + }; + const result = resolvePluginConfig(current, "python3"); + expect(result.interpreter).toBe("python3"); + expect(result.settings).toEqual({ timeout: 30 }); + }); + + it("clears interpreter while preserving other settings", () => { + const current: PluginConfig = { + interpreter: "python3", + settings: { timeout: 30 }, + }; + const result = resolvePluginConfig(current, ""); + expect(result.interpreter).toBeUndefined(); + expect(result.settings).toEqual({ timeout: 30 }); + }); + + it("accepts a full path interpreter", () => { + const result = resolvePluginConfig(undefined, "C:\\Python311\\python.exe"); + expect(result.interpreter).toBe("C:\\Python311\\python.exe"); + }); + + it("starts from empty config when currentConfig is undefined", () => { + const result = resolvePluginConfig(undefined, "python3"); + expect(result).toEqual({ interpreter: "python3" }); + }); + + it("starts from empty config when currentConfig has no settings", () => { + const current: PluginConfig = { interpreter: "python" }; + const result = resolvePluginConfig(current, "python3"); + expect(result.interpreter).toBe("python3"); + expect(result.settings).toBeUndefined(); + }); + }); + + describe("getDisplayInterpreter", () => { + it("returns the configured interpreter", () => { + const config: PluginConfig = { interpreter: "python3" }; + expect(getDisplayInterpreter(config)).toBe("python3"); + }); + + it("returns empty string when config is undefined", () => { + expect(getDisplayInterpreter(undefined)).toBe(""); + }); + + it("returns empty string when interpreter is undefined", () => { + const config: PluginConfig = { settings: {} }; + expect(getDisplayInterpreter(config)).toBe(""); + }); + }); +}); + +describe("resolveSettingsWithDefaults", () => { + const defs: PluginSettingDefinition[] = [ + { key: "host", label: "Host", type: "string", default: "localhost" }, + { key: "port", label: "Port", type: "number", default: 5432 }, + { key: "verbose", label: "Verbose", type: "boolean" }, + ]; + + it("uses default when no saved value exists", () => { + const result = resolveSettingsWithDefaults(defs, undefined); + expect(result["host"]).toBe("localhost"); + expect(result["port"]).toBe(5432); + }); + + it("prefers saved value over default", () => { + const result = resolveSettingsWithDefaults(defs, { host: "myserver", port: 3306 }); + expect(result["host"]).toBe("myserver"); + expect(result["port"]).toBe(3306); + }); + + it("omits key when no default and no saved value", () => { + const result = resolveSettingsWithDefaults(defs, undefined); + expect(Object.prototype.hasOwnProperty.call(result, "verbose")).toBe(false); + }); + + it("includes saved value even when no default defined", () => { + const result = resolveSettingsWithDefaults(defs, { verbose: true }); + expect(result["verbose"]).toBe(true); + }); + + it("returns empty object for empty definitions", () => { + expect(resolveSettingsWithDefaults([], { host: "x" })).toEqual({}); + }); +}); + +describe("validateSettings", () => { + const defs: PluginSettingDefinition[] = [ + { key: "api_key", label: "API Key", type: "string", required: true }, + { key: "timeout", label: "Timeout", type: "number", required: false }, + { key: "region", label: "Region", type: "string", required: true }, + ]; + + it("returns no errors when all required fields are filled", () => { + const errors = validateSettings(defs, { api_key: "abc", region: "us-east" }); + expect(errors).toEqual({}); + }); + + it("returns error for empty required string field", () => { + const errors = validateSettings(defs, { api_key: "", region: "us-east" }); + expect(errors["api_key"]).toBe("API Key"); + }); + + it("returns error for whitespace-only required string field", () => { + const errors = validateSettings(defs, { api_key: " ", region: "us-east" }); + expect(errors["api_key"]).toBe("API Key"); + }); + + it("returns error for undefined required field", () => { + const errors = validateSettings(defs, { region: "us-east" }); + expect(errors["api_key"]).toBe("API Key"); + }); + + it("ignores optional fields that are empty", () => { + const errors = validateSettings(defs, { api_key: "abc", region: "us-east", timeout: undefined }); + expect(Object.prototype.hasOwnProperty.call(errors, "timeout")).toBe(false); + }); + + it("returns errors for multiple missing required fields", () => { + const errors = validateSettings(defs, {}); + expect(errors["api_key"]).toBe("API Key"); + expect(errors["region"]).toBe("Region"); + }); +}); diff --git a/website/content/posts/hackernews-plugin.md b/website/content/posts/hackernews-plugin.md new file mode 100644 index 0000000..c01a94f --- /dev/null +++ b/website/content/posts/hackernews-plugin.md @@ -0,0 +1,106 @@ +--- +title: "Query Hacker News with SQL: a New Plugin for Tabularis" +date: "2026-03-10T12:00:00" +tags: ["plugins", "hackernews", "duckdb", "sql", "extensibility"] +excerpt: "A Hacker News plugin for Tabularis that exposes the public HN API as a queryable SQL database — and serves as a real-world showcase for the new per-plugin settings system." +og: + title: "Query Hacker News" + accent: "with SQL." + claim: "Stories, comments, users, and poll options as in-memory DuckDB tables. No API key required." + image: "/img/posts/hackernews-plugin.png" +--- + +# Query Hacker News with SQL + +Hacker News plugin in Tabularis — querying stories with SQL + +There is a new plugin in the registry: **Hacker News**. + +It exposes the [public HN Firebase API](https://github.com/HackerNews/API) as a queryable SQL database. Stories, comments, users, and poll options become real in-memory tables powered by DuckDB. No API key, no authentication, no setup beyond installing the plugin. + +Fair warning upfront: this is as much a **stress test for the new per-plugin settings system** (introduced in [v0.9.7](/posts/v097-plugin-settings-connection-groups)) as it is a genuinely useful tool. HN made an ideal guinea pig — public API, no auth, rich enough data variety to exercise different configuration combinations. But it does actually work, and the queries below are real. + +--- + +## What You Can Query + +```sql +-- Top stories from the last 24 hours with at least 10 points +SELECT title, score, by, epoch_ms(time * 1000)::TIMESTAMP AS posted_at +FROM stories +WHERE time > epoch(now()) - 86400 + AND score >= 10 +ORDER BY score DESC; + +-- Who posts the most — and how well do they do? +SELECT by, COUNT(*) AS posts, AVG(score) AS avg_score +FROM stories +GROUP BY by +ORDER BY posts DESC; + +-- JOIN stories with their top-level comments +SELECT s.title, s.score, COUNT(c.id) AS loaded_comments +FROM stories s +LEFT JOIN comments c ON c.story_id = s.id +GROUP BY s.id, s.title, s.score +ORDER BY loaded_comments DESC; +``` + +Full SQL is supported: `JOIN`, `GROUP BY`, CTEs, window functions — anything DuckDB handles. The `stories` table is always available; the rest are optional and enabled through plugin settings. + +--- + +## Optional Tables + +The plugin exposes four tables, three of which are opt-in via settings: + +| Table | Contents | Default | +|-------|----------|---------| +| `stories` | Feed items (title, score, author, time, url) | Always loaded | +| `comments` | Top-level comments, up to 3 levels deep | Optional | +| `users` | Karma and bio for all story/comment authors | Optional | +| `poll_options` | Voting options for poll-type stories | Optional | + +Enabling `comments` and `users` increases the number of API calls on the first query — HN's Firebase API is item-by-item, so fetching author details for 500 stories means up to 500 additional requests. The TTL and HTTP timeout settings let you tune this trade-off for your connection. + +--- + +## Plugin Settings in Practice + +This plugin was designed to exercise the [declarable plugin settings](/posts/v097-plugin-settings-connection-groups#declarable-plugin-settings-via-manifestjson) feature from v0.9.7. It declares its full configuration schema in `manifest.json`, and Tabularis renders the settings UI automatically — no app changes needed: + +| Setting | Type | Default | Description | +|---------|------|---------|-------------| +| **Feed** | select | `top` | Which HN feed to load: top, new, best, ask, show, or jobs | +| **Max Stories** | number | `30` | How many stories to fetch (max 500) | +| **Include Comments** | toggle | off | Enables the `comments` table | +| **Comment Depth** | number | `1` | Nesting levels to fetch (1–3). Higher values mean many more requests | +| **Max Comments** | number | `500` | Global cap on total comments fetched (max 5000) | +| **Include Users** | toggle | off | Fetches author karma and bio. Enables the `users` table | +| **Include Poll Options** | toggle | off | Fetches voting options for poll-type stories. Enables the `poll_options` table | +| **Timeout (s)** | number | `10` | HTTP request timeout in seconds for the HN API | +| **Cache TTL (min)** | number | `0` | Auto-refresh data after N minutes. Set to 0 to disable | + +The three `include_*` toggles are the main cost knobs. With all three off (the default), only `stories` are fetched — fast, minimal API calls. Enabling comments at depth 3 with a large story count can trigger thousands of requests; the `Max Comments` cap and `Timeout` exist to keep that bounded. + +It also uses the [`no_connection_required`](/posts/v097-plugin-settings-connection-groups#no_connection_required-capability-flag) flag — since there is no host or credentials to enter, Tabularis hides the connection form entirely. You give the connection a name and start querying. + +--- + +## How It Works + +Tabularis spawns the plugin as a child process and communicates via **JSON-RPC 2.0 over stdio**. On the first query, the plugin fetches from the HN API, builds an in-memory DuckDB instance, and keeps it alive for the session duration (or until the TTL expires). Subsequent queries hit the local DuckDB instance directly — no network round-trips. + +The plugin is written in **Rust**. Source is on [GitHub](https://github.com/debba/tabularis-hackernews-plugin). + +--- + +## Installation + +Open **Settings → Available Plugins** and install **Hacker News** from the registry. That's it — no manual download, no interpreter to configure. + +:::plugin hackernews::: + +--- + +Feedback is welcome — particularly on the per-plugin settings UX and what other public APIs would make good candidates for this kind of driver. The pattern (public API → in-memory DuckDB → SQL) generalizes well, and the plugin serves as a concrete reference implementation for anyone who wants to build something similar. diff --git a/website/content/posts/nosql-plugins-community.md b/website/content/posts/nosql-plugins-community.md new file mode 100644 index 0000000..babbdc6 --- /dev/null +++ b/website/content/posts/nosql-plugins-community.md @@ -0,0 +1,71 @@ +--- +title: "Tabularis Goes NoSQL: Redis Ships, MongoDB and ClickHouse Need You" +date: "2026-03-07" +tags: ["nosql", "plugins", "community", "redis", "open-source", "extensibility"] +excerpt: "The plugin ecosystem is growing beyond SQL. Two Redis drivers have already shipped thanks to community contributors. Now we need experts to push DuckDB, MongoDB, and ClickHouse across the finish line." +og: + title: "Tabularis Goes NoSQL:" + accent: "Redis Ships, More Coming." + claim: "Two Redis drivers shipped by the community. DuckDB, MongoDB, and ClickHouse need your expertise." + image: "/img/screenshot-9.png" +--- + +# Tabularis Goes NoSQL: Redis Ships, MongoDB and ClickHouse Need You + +When I shipped the plugin system in v0.9.0, the promise was simple: you should not need to wait for us to support your database. Build a driver, list it in the registry, and Tabularis users can use it today. That promise is being kept — and the NoSQL world is where the community has moved fastest. + +## Redis: Two Independent Drivers, Both Excellent + +Redis is the first NoSQL database to land in the official plugin registry, and it arrived not once but **twice** — two independent implementations from two different contributors, each with a distinct design philosophy. + +### Redis (Go) + +The first Redis driver comes from [@gzamboni](https://github.com/gzamboni) and is written in Go. It models Redis as a set of **virtual tables**: Strings, Hashes, Lists, Sets, and ZSets each get their own tab in the Tabularis data grid. Write operations — SET, HSET, LPUSH, and the rest — are available directly from the UI without dropping to a terminal. If your team uses Redis as a primary data store and you want a visual interface for daily operations, this is the driver to reach for. + +:::plugin redis::: + +### Redis (Rust) + +The second implementation comes from [@nicholas-papachriston](https://github.com/nicholas-papachriston) and takes a different approach. Written in Rust, it focuses on **Hash and RedisJSON row storage** — treating Redis keys as structured records rather than raw key-value pairs. If you store JSON documents in Redis and want to query and browse them like rows in a table, this driver fits more naturally. + +:::plugin redis-rust::: + +Two drivers for the same database is not redundancy — it is a sign that the plugin system is working as intended. Different use cases, different mental models, different implementations. Users can pick the one that matches how they use Redis. + +## The Next Frontier: DuckDB, MongoDB, and ClickHouse + +Redis proved the model. Now the ecosystem needs to grow into the rest of the NoSQL and analytical space. Three databases are in active development, and all three could use experienced contributors. + +### DuckDB + +DuckDB is the reference plugin — the first one we ever shipped — but being first does not mean it is finished. The current driver covers the basics: open a local `.db` file, run queries, browse results. What it does not yet handle well: **in-memory databases**, **Parquet and Arrow file sources** passed directly as connection targets, deeper **type fidelity** for DuckDB-native types like `HUGEINT`, `MAP`, and `UNION`, and **ATTACH/DETACH** multi-database workflows. If you know DuckDB internals and want to make the Tabularis integration best-in-class, the codebase is a Rust project with a clean JSON-RPC interface. + +:::plugin duckdb::: + +### MongoDB + +MongoDB is the most-requested NoSQL database on the issue tracker. A driver is in development but has not yet reached a releasable state. The core challenge is the impedance mismatch: MongoDB documents are schema-less and deeply nested, while Tabularis renders data in a tabular grid. Solving this well — flattening documents intelligently, handling arrays, surfacing the right projection controls in the UI — requires someone who has built against the MongoDB wire protocol before. + +If you have experience with the MongoDB Rust driver, the Node.js driver, or the Go official driver, and you want to bring full MongoDB support to Tabularis, [open a discussion on GitHub](https://github.com/debba/tabularis) or reach out directly. The JSON-RPC protocol is documented in the [Plugin Guide](https://github.com/debba/tabularis/blob/main/plugins/PLUGIN_GUIDE.md) and a skeleton implementation is included to get you started quickly. + +### ClickHouse + +The ClickHouse plugin landed in the registry at v0.1.0 — it connects, authenticates, and runs queries. That is a foundation, not a finished product. ClickHouse has a rich type system (tuples, maps, nested arrays, nullable variants), a native HTTP and binary protocol, and features like **distributed tables**, **materialized views**, and **TTL policies** that deserve first-class representation in the UI. The driver today exposes none of that. + +If you work with ClickHouse at scale and know what a power user actually needs from a GUI client, the v0.1.0 driver is a starting point. Help shape what v1.0 looks like. + +:::plugin clickhouse::: + +## How to Contribute + +The plugin protocol is language-agnostic. MongoDB contributors have used Go, Rust, Python, and Node.js in existing plugins — pick the runtime you are most productive in. What matters is the JSON-RPC 2.0 interface over stdin/stdout. + +Start here: + +1. Read the **[Plugin Guide](https://github.com/debba/tabularis/blob/main/plugins/PLUGIN_GUIDE.md)** — covers the full protocol, manifest format, and type system. +2. Clone an existing plugin as a reference. The [DuckDB plugin](https://github.com/debba/tabularis-duckdb-plugin) (Rust) and the [CSV plugin](https://github.com/debba/tabularis-csv-plugin) (Python) are both intentionally simple and well-commented. +3. Open an issue or discussion on the [main repo](https://github.com/debba/tabularis) before starting, so we can coordinate and avoid duplicate work. + +The Redis contributions showed what happens when someone with domain expertise builds for their own use case: two production-quality drivers shipped in a matter of weeks. DuckDB, MongoDB, and ClickHouse deserve the same treatment. If you have the expertise, we have the platform. + +:::contributors::: diff --git a/website/content/posts/v096-redis-clickhouse-filters.md b/website/content/posts/v096-redis-clickhouse-filters.md new file mode 100644 index 0000000..441faef --- /dev/null +++ b/website/content/posts/v096-redis-clickhouse-filters.md @@ -0,0 +1,78 @@ +--- +title: "Smarter Filters, Close Tab, and a Better Plugin Install: v0.9.6" +date: "2026-03-07 12:30" +release: "v0.9.6" +tags: ["release", "filters", "plugins", "ux", "bugfix"] +excerpt: "v0.9.6 ships a structured filter toolbar with ORDER BY autocomplete, a close-tab keyboard shortcut, a cleaner plugin install error experience, and a handful of focused bug fixes." +og: + title: "Smarter Filters," + accent: "v0.9.6." + claim: "Structured filter toolbar, ORDER BY autocomplete, close-tab shortcut, and a cleaner plugin install flow." + image: "/img/screenshot-9.png" +--- + +# Smarter Filters, Close Tab, and a Better Plugin Install: v0.9.6 + +**v0.9.6** focuses on the day-to-day editing experience: a structured filter toolbar that handles the common filtering case without writing SQL, ORDER BY autocomplete in the toolbar, a close-tab keyboard shortcut, and a plugin install error modal that finally tells you what went wrong. + +--- + +## Structured Filter Toolbar and ORDER BY Autocomplete + +The table toolbar has grown two new capabilities that make filtering and sorting larger datasets faster without writing raw SQL. + +### Structured Filter UI + +The filter toolbar now supports **structured filter expressions** — column, operator, and value entered as discrete fields rather than as a typed WHERE clause. The column list is autocompleted from the schema; operators adapt to the column type (text gets `=`, `!=`, `LIKE`, `NOT LIKE`; numbers and dates get the full comparison set). Multiple filters chain with AND by default. + +This does not replace the ability to type a raw WHERE clause — the raw input is still there for complex predicates. The structured mode handles the common case of "show me rows where status = active and created_at > last week" without requiring SQL knowledge. + + + +### ORDER BY Autocomplete + +The ORDER BY field in the toolbar now autocompletes column names from the current table or query result. Start typing a column name and a dropdown narrows the list. Selecting a column appends `ASC` by default; a toggle switches it to `DESC`. Compound sorts across multiple columns are supported. + +--- + +## Close Tab Keyboard Shortcut + +The editor tab bar now responds to a close-tab shortcut: + +| Platform | Shortcut | +| :-------------- | :------- | +| macOS | `⌘+W` | +| Windows / Linux | `Ctrl+W` | + +If the tab has unsaved query changes, a confirmation prompt appears before closing. If the content is clean, the tab closes immediately. The shortcut is rebindable from **Settings → Keyboard Shortcuts** like all other custom bindings. + +--- + +## Plugin Install Error Modal + +Until now, a failed plugin installation was silent — the progress spinner would stop and the registry panel would return to idle with no indication of what went wrong. v0.9.6 adds a dedicated **Install Error modal** that surfaces the full error output from the installer. + +If a download times out, an asset hash mismatches, or the archive is malformed, you now see the exact error message and which step failed. The modal includes a copy button for sharing the log when opening an issue. Installer logging is also more detailed internally, so the stack trace reaching the modal is actionable rather than a generic failure code. + +--- + +## Bug Fixes + +### Connection Dialog: Autocomplete and Autocorrect Disabled + +Browser and OS autocomplete surfaces were interfering with connection form inputs — particularly the host, port, username, and database fields. On macOS, autocorrect was silently mangling hostnames. Both issues are fixed: + +- `autoComplete="off"` is now set on all connection dialog inputs, preventing browser credential and history suggestions from appearing. +- The macOS `autoCorrect`, `autoCapitalize`, and `spellCheck` attributes are disabled on the same fields. + +### Website: Badge Image CSP Rule Scoped to shields.io + +A Content Security Policy rule for badge images was written too broadly, allowing any external image source where only `shields.io` badge URLs are used. The rule is now scoped to `shields.io` specifically. + +--- + +:::contributors::: + +--- + +_v0.9.6 is available now. Update via the in-app updater, or download from the releases page._ diff --git a/website/content/posts/v097-plugin-settings-connection-groups.md b/website/content/posts/v097-plugin-settings-connection-groups.md new file mode 100644 index 0000000..e280d48 --- /dev/null +++ b/website/content/posts/v097-plugin-settings-connection-groups.md @@ -0,0 +1,128 @@ +--- +title: "Plugin Settings, Connection Groups, and Credential Cache: v0.9.7" +date: "2026-03-09 23:30" +release: "v0.9.7" +tags: ["release", "plugins", "connections", "ux", "bugfix"] +excerpt: "v0.9.7 brings per-plugin interpreter settings, connection groups, a credential cache, and a robust plugin startup error flow." +og: + title: "Plugin Settings," + accent: "v0.9.7." + claim: "Per-plugin interpreter settings, connection groups, credential cache, and a smarter plugin error flow." + image: "/img/screenshot-10.png" +--- + +# Plugin Settings, Connection Groups, and Credential Cache: v0.9.7 + +**v0.9.7** is a broad release centered on two themes: making the plugin system significantly more configurable and robust, and making connection management smoother — from grouping connections into folders to reducing keychain overhead with an in-memory credential cache. + +--- + +## Plugin System: Major Improvements + +The plugin system has received its most comprehensive update yet. Three independent capabilities land together: per-plugin settings (including interpreter configuration), the `no_connection_required` capability flag, and a proper startup error surface. + +### Per-Plugin Interpreter Settings + +Plugin Settings gear icon in the Installed Plugins list + +Python-based plugins — and any plugin driven by an external interpreter — can now have their interpreter path configured directly from the UI. Every plugin in the Settings page now shows a gear (⚙) icon that opens a `PluginSettingsModal`. + +From this modal you can: +- Type an absolute interpreter path (e.g. `/usr/bin/python3.12` or a virtualenv binary) +- Use the file picker to browse to the executable +- Save the setting — the plugin process is **restarted automatically** without needing to restart Tabularis + +PluginSettingsModal with interpreter path field and file picker + +The interpreter is resolved with the following priority: **user config → manifest hint → `.py` heuristic**. If none of these resolve to a working binary, the startup error flow (see below) catches it and shows a clear message. + +### Declarable Plugin Settings via `manifest.json` + +Plugins can now declare custom configuration fields directly in `manifest.json`. Tabularis renders them in the settings modal, persists them in `config.json`, and passes them to the plugin at startup via an `initialize` RPC call — no changes to Tabularis required. + +Full details on the `settings` schema and the `initialize` RPC contract are in the [Plugin Guide](/wiki/plugins). + +### Plugin Startup Error Modal + +Plugin startup error modal with error output and Configure Interpreter button + +When a plugin fails to start, Tabularis previously gave no feedback — the plugin simply appeared disabled. Starting with v0.9.7: + +1. Tabularis **auto-disables** the plugin rather than blocking the rest of the app +2. A `PluginStartErrorModal` surfaces the full error output, with a one-click copy button for pasting into a bug report +3. A shortcut **"Configure Interpreter"** button opens the settings modal directly, making the fix-and-retry loop as fast as possible + +A new backend command `get_plugin_startup_errors` tracks failure reasons per plugin and makes them available to the frontend at any point after startup. + +### `no_connection_required` Capability Flag + +Plugins that connect to public APIs or REST services — where there is no host, port, or credentials to enter — can now declare `"no_connection_required": true` in their manifest. When this flag is set, Tabularis hides the entire connection form. The user fills in only a connection name and can start querying immediately. + +### Plugin Removal Confirmation Modal + +Removing an installed plugin now opens a `PluginRemoveModal` to confirm before proceeding, preventing accidental deletions during housekeeping. + +--- + +## Connection Groups + +Sidebar showing connections organized into collapsible group folders + +Community contribution (thanks [@fandujar](https://github.com/fandujar)!): connections can now be organized into **groups**. Groups appear in the sidebar as collapsible folders rendered via a dedicated `ConnectionGroupFolder` component. + +From the Connections page you can: +- Create, rename, and delete groups +- Drag connections into a group or reassign them via the edit form + +This is particularly useful when managing many connections across multiple environments — separating dev, staging, and production at a glance without scrolling through a flat list. + +--- + +## Credential Cache + +Every time Tabularis opened or reconnected to a database, it called the OS keychain to retrieve credentials. On macOS this could trigger repeated authorization prompts and noticeable latency, especially when switching between connections frequently. + +v0.9.7 introduces an **in-memory credential cache** that: +- Caches DB, SSH, and AI credentials after the first successful keychain read +- Automatically invalidates the cache entry when a connection is updated or deleted +- Reduces OS keychain calls to the minimum necessary during a session + +--- + +## New `Select` Component and UI Consistency + +The `SearchableSelect` component has been replaced by a new `Select` component that is more robust and consistent across the app. This also brings full i18n support for SSL mode labels in the connection form. The plugin version dropdown in Settings now uses a portal-based approach so it layers correctly above any open modals. Input padding has been standardized across all connection form fields. + +--- + +## Bug Fixes + +### SQLite WAL Mode Opening on Windows + +Community fix (thanks [@GreenBeret9](https://github.com/GreenBeret9)): opening SQLite databases in WAL journal mode failed with **"unable to open database file" (error code 14)** on Windows and whenever `-wal` / `-shm` sidecar files were present. The root cause was the bare URL connection string, which did not configure journal mode handling. + +The fix switches the SQLite driver to use `SqliteConnectOptions` with `read_only(true)` and explicit WAL journal mode, consistent with the pattern already used by the PostgreSQL driver. + +### Active Tab Restored Correctly on Session Reload + +An implicit fallback in the tab state logic was causing the wrong tab to appear active after reloading a session. The editor now prefers the `activeTabId` persisted in saved state, falling back to `null` only when no valid ID is available. + +--- + +## Summary + +| Area | What's new | +|------|-----------| +| Plugins | Per-plugin interpreter settings, declarable manifest settings, `no_connection_required` flag, startup error modal, removal confirmation | +| Connections | Group folders in the sidebar | +| Performance | In-memory credential cache to reduce OS keychain calls | +| UI | New `Select` component, portal-based plugin version dropdown, standardized input padding | +| Bug fixes | SQLite WAL mode on Windows, active tab on session reload | + +--- + +:::contributors::: + +--- + +_v0.9.7 is available now. Update via the in-app updater, or download from the [releases page](https://github.com/debba/tabularis/releases/tag/v0.9.7)._ diff --git a/website/content/wiki/plugins.md b/website/content/wiki/plugins.md index 3437a45..04b0835 100644 --- a/website/content/wiki/plugins.md +++ b/website/content/wiki/plugins.md @@ -84,6 +84,7 @@ Every plugin must include a `manifest.json` that tells Tabularis its capabilitie | `alter_column` | bool | `true` to enable ALTER TABLE MODIFY COLUMN operations in the schema editor. | | `create_foreign_keys` | bool | `true` to enable FK constraint creation in the schema editor. | | `folder_based` | bool | `true` for databases that target a folder rather than a file or host (e.g., CSV plugin). Replaces host/port with a folder picker. | +| `no_connection_required` | bool | `true` for API-based plugins that need no host, port, or credentials (e.g. a public REST API). Hides the entire connection form — the user only fills in the connection name. | ### Data Type Categories @@ -97,6 +98,67 @@ Every plugin must include a `manifest.json` that tells Tabularis its capabilitie | `spatial` | GEOMETRY, POINT | | `other` | BOOLEAN, UUID | +## Plugin Settings + +Plugins can declare custom configuration fields in their `manifest.json`. Tabularis renders these fields in **Settings → gear icon** next to the plugin. Users fill them in, the values are persisted in `config.json`, and Tabularis delivers them to the plugin at startup. + +### Declaring settings in `manifest.json` + +Add an optional `settings` array to your manifest: + +```json +{ + "id": "my-plugin", + "settings": [ + { + "key": "api_key", + "label": "API Key", + "type": "string", + "required": true, + "description": "Your API key for authentication." + }, + { + "key": "region", + "label": "Region", + "type": "select", + "options": ["us-east-1", "eu-west-1"], + "default": "us-east-1" + }, + { + "key": "max_connections", + "label": "Max Connections", + "type": "number", + "default": 10 + }, + { + "key": "ssl", + "label": "Enable SSL", + "type": "boolean", + "default": true + } + ] +} +``` + +Supported setting types: `"string"`, `"boolean"`, `"number"`, `"select"`. + +### The `initialize` call + +After spawning the plugin process, Tabularis immediately sends an `initialize` JSON-RPC call with the user's saved settings: + +```json +{ + "jsonrpc": "2.0", + "method": "initialize", + "params": { "settings": { "api_key": "abc", "region": "eu-west-1" } }, + "id": 1 +} +``` + +Returning an error from `initialize` is safe — Tabularis ignores it silently. Plugins that do not implement `initialize` are completely unaffected. + +For the full developer reference (field schema, code examples in Rust and Python), see the [Plugin Guide](https://github.com/debba/tabularis/blob/main/plugins/PLUGIN_GUIDE.md). + ## Protocol Specification Your plugin runs a continuous read loop on `stdin`. For each line received, parse the JSON-RPC request, execute the operation, and write a JSON-RPC response to `stdout` followed by `\n`. diff --git a/website/next-env.d.ts b/website/next-env.d.ts index 9edff1c..c4b7818 100644 --- a/website/next-env.d.ts +++ b/website/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/types/routes.d.ts"; +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/website/public/img/posts/connection-groups.png b/website/public/img/posts/connection-groups.png new file mode 100644 index 0000000000000000000000000000000000000000..4111e2cf5024827bb8f69b7d3fca3443063e416f GIT binary patch literal 67302 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 Q;7) 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 Ml(p{_-nD-AZ>;T*!vFvP literal 0 HcmV?d00001 diff --git a/website/public/img/posts/hackernews-plugin.png b/website/public/img/posts/hackernews-plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0a532e3a34d25da7e8d8a2826cd2428608f5b3 GIT binary patch literal 192726 zcmc$_1yEdD_b=E$fRG@;9TI{B2(FDra1HKmK^k`_B)9~JUD$@aPz3-m0|9^sWDhZr zBZmQ9Zpg<2GugNAP;dY!8P>ww$lp<1RHfelN=K-+0f46fS&7%`o*8=!9==KIclXEB zewr6_&py)ckzXvnRp}~mbJx>@+U%E4g0FADHJVUesEw^&jhn4CwObDM>jx+(_)jo> zKH|S|cdi_1IJ|-PVg(i-UpX5Y9N^yJAV*h&1?wHCEm z^z-N57TJG|O3;Jov z|JPK4cx|U%j)=nNV{qU8SzKP$Kjb;<$}1^ZP8JdW)UEk&d3lNJuvvbv(CBj540nY2 zwSKdmE@fKC`ol{Z`WGlK|1fcX<1pZ!vRJcZsdA8gck7*!?(5emqavp-l||2aySuxo zsbl`UlhNaTxH#M%jLD@~<)3c-g-XQp^FpJCbTx;TgdQROUl;H(SxAtDjtJtCkeWK; z&wCU7!^0p~pToswC|^v^+UDl*awx6y>2U4Ru>{J}=~b#Q9Hx-Qo%TbmQ2Hl_1|agU z*JK(!xARHKMZJjt9*b8zh5>gPfN=<<{^r1_!g1L*ncbixL0N2Zt)T%8<7_jW3DG^C zFYmcmAx*~n{^_r?vyn&=He)0+u&ITr`|Fe@?#Do*U-%-uP8XN(0_s}F#9W*)PJg`( zusmLoY=SSUX8E3AS&n2lIpbygz1+``ZF&xefLx=(VB|7+OgbKHjNAzX1=6;{MqBUi zMAQltERl=C-4US7Qmq_ni7Mu?Lq zgp3Ntt39zgO_$WyXWPRL0X{}mSnvP**YKB6a0RF_xAXlHlX!jb-3{L7goMud`g_ZR z`Au?uyBAkiSM&Zi%FpLg3Ia*~dMD2PxbJx^w|U{yZ%f;>YH!x zimwB1kC{BzlN{Hbkyr3dgU9GoF)SstNrtytAA)& z&&8GR9;`JxlD*+G3~^z|&E3Fb{3-x2Zx46U0&(b^u!BLX=iWM1mTW18-dKLuXEx=^ zW?J5~jU^>_tv3ga=e4mQhtVv3_x(9Zsk_NOhbU z^&Jfeez2gpIIW@pS!)Zro0yuKa5%lW+k*uFLOX*X+fmv^MS#DViwh~%;>hw`G3x5- zDtBII(JaxGG%0?BY55w;!$_h0gR#) zNY2QhDs8!D`F$VMZwkEBJyVJtmHkWK*IZq4(xQmmDM~%et7z!C z+=@*lSnfXzYw^1|f!&X+M;hHaOAxl{qG|uJ6?4%RIsi`*dq9Cw<{N!|sz{RN&PmMecro0uxHP51huvCPx3YsPo!G08&aMU0q%8E^?uw8D#dL`{Dkf zp|zsomO$wKMoMc_x@~EF41@e4y773PEXYRfZ&IC(mVzu>^SqSB@6`QH;8S`5Z6&pc zz-Ax#cxymFme6j9ml0S;ib_&4hcg@>!f2Y?!Fkm{K z7p_QipU+`18buC44$$-QB}GI$B4P6mef6}BDciRr4F7rEVT(`y@PfRzx7NVGfQ+mx z%Gb(Dg6vUgS6AME%g)2A$ufUMSy|cQYlj%f_R>arYb12va=y;Vvzho@cE@dZs^*8{ zA02^wG9ja;ep96YG2fX;9%YK>+3sZkvcYPUziI73c5fBJGJA}o0Eb7b` zA=0Y??onFq_79K7q<7OeO+-lb9Z`^sbU|8t3&bt@zc+)+VxZcxRS6Re61a8~O69ho z5STxT#yC`ymzS?!4snpUJ?6o{qw)35sQII1|9oZ;{bQ5=8F3|$``b$Y-;I<)ESAmw zn5cg~fxv&1(egFQVF*o?hKWqEz8JDmb zp>!}k#+AW+7m97MS_Bss!p4tdjLs4Y&P*2<&-d%JelMx{OPx?p95<> zNR0K`7P-bFFFK}UD>$Yr`S$1jO}n$@&Q|NXaAklZ3fq6JWn8vSNC<$B4?G23`AJEK zKD7!PQ?qh)efaNhWqx4^l>B2K{{9rgV))-0(UQh|`tNyvlLh8+{Kaa?sS+ayxYgwI zv8^>Vt0|)XAG6O8FSPWolh^XjT<9WTsaluX#d9jCNTVh6F_RE4AwG6q$*mJ?Lv{K{ zn3Lt-yaYn)7ia(<+FvzZKt&rkb_Ym~w_36Rj`C%g{V_B%JMME_D0WmXQ2W+WNr|;; z)6Fh3*gTYTI zSbD0u`ph*a*9=(BQJeb~xSJ8aDk&7x6ImV7Bfo08y3)5dmXN7en*+c4Yw6=U3P39o zz#u8d-jd85BP!NX5A0UzK(IN82p{+by85ifRw%z)^1&@4ta>{rS-osmHPS4xIe7d2{xtZ+dQCTHhB{^ybWB&?-C7?!6DouISFzQ{ofy8)!1od1KLkGu4qgW4Z;h}nQ&3FR3La?83Fa?$xS z0**(BSl&pM*!PZImqwelC^>rAw(3H&!}@f(_AfqvNsfVSMs8u+p|s+)j!N6;df!cu z><^E?%?f=wl+PiJ#s-;A9cBm3@cS`Qp5RuoTV*j=Q_|tWiDH3Ln&(b1I^uXM;r7A< zPgPTMk^Qcwmf?`Suz;nkojC}0V42ary)90mPgN#OGHb3Ao>!iCy2(S?(iW1E!TU+; z#4pptV-F%U%jVVTm9gm?5U{Z0}BdvDV{VzSN z_dX%Zogq&irM=Xt%;4}_XFRC8ySd%SYMd!|B77c#$8gy8+WvY3^z+)74SsvAWPd$1 zEu*BAQ&5n6^_bM969;BnSt3p2M-b=$J3C)pX}Dvmb%w^;GjeeS1!LkJ_ln;|7iMKq zj`bFccJ)}Ps3l3;`I6v<21iut6U2LieW<`VRfx+gC+LmgQL|=E!dwmIDw8sU7#E6B zN$jYYq4Gg#roQVsUl$WS!0|lA0k9Mdhdp<2VE4PmGwush5j3#J-5a#%oSQU;V$<+v z&@|tyoLn~^2f~nu0OD`WwsOYG)H%ziB_a9!)(y6X?uRHVD5AZfvS*)H;o@|H23YH6y29B*V zja4brDnLw63)5$s{aAsW((!RgimtBMn0R~78?89N{s{6$Flc$MY@sj6&nG-OJil^W zUe1O^p0r8w=@av=nd37`!H2D*qX+wXGvF(p`1nT0b_=a?+Z%rG^KE%qCw$tb+QgrR zqG_CN7y#?vsw0N#;027_Xr5ZTOx}>RX;KjO;GdjKvb%M}Ay3m$5I;mUM8J6@ymHb+ zPN^F5+`4%cFAf&_dv~W$6~&o&&ubpFn!_j0}X-goD>Lw4bMk zPUVvXn#`p*iEMr;^h2j)ku1Tf;Y@uA!o*r#G!(P+2=>UQWH zkP{oN(Y|4EeNd~y_lgC8xS9!$q5x(DAa=HNMLc@-J9kZs@@f&!+WV(BC>^pgO{u@5{!(GyyC1jH|zuqtbF%TI6H~X@gpf zjuN0P9#V{f%Q6Hryu-M%2vjnRmv`I0uA$M2^|LdWC%qKBu4Kf->n{y1Nfx-Pw!g%^ zMykV4UGT@!ZStrz!8DJ}(auV?BG%%tm~e}sE@t0Ke`;b23xzLU?D>+CYX@^EuY7$` zZME2$o;{0W-puG7+1LC2g4OI8>hP-&1{mjVn1)jmQucOPLv$LJKt;txX+R&`JIwWR z(5V$Rt!Q#dw!P`-$o?5+;#=KmSB604H+emSS(SFxfb^nX*$f5SG~)ZV1g# zB7F?=j+TX3#`Boc?}};nuhhc6-hX|Tmse1E5KIiXL|gvxYteu+b}do8M>%ckYxc2P zp_;D#&@~?|r}r&=NGwff1D+=8@^qI)Bq_IJ-#e-3^tPaRQAI@Q-y$#L6Ba3Nytl?o z))R-9PnZzj9++0e@e^jLN3uKpv!Fr9`49pSiFt3|*AhykReKFe8@mHs>cFgaYKbv% zkA{L8D>#*BED5oUbHme@9qgWR0n^y6t?L#JNJ0Wkl|s=9nI6?*ny#42%E~_{L#nmD zf~1#M9b77*UG70--)wv3Po**GU<3_W)bY+U&b9__wBFI$EZ20=$|`1N=G8*+#`Mce z!P2G^(-3TO2}48A<{<|89fyg9l7ogiXk3r>0{SNOCxB+qZ6!4-$WwfaW9)pH#+%|&i@bvW+lSVVWfbFz znS~Z=;N6_>lB~ByOY^`_l{Nm-NVZ7q{>< zQ3JCeuK=HzSW(u*q*47|SIep`be+t$gTvBYlXr@boXt?Z4ZMFn{c#(@boz;vV|hIV z_FnBJ>~;#TZg+$h(x|13fxR_o;IY`#R7+CxgDtQ(+cT>X0dtu1z1?1#vChU*##~sW z<6GabqILLMUH3UJkv-4Kwa^2GGUT(4zQ=EPW;~6fK3J_?WvUYyqjS{5x=biEFyH}u zRwd0rKtQ-XS&PSP&`@qO+X#w~r4ulWu@H<3EAe!$9*?I>ZiYBEZ{@AA_re1{2t19W zfmub$M3X|noI4mYcY8!&#n=8cNWZQ)ZBI_0?`kqvzge}mFR&YHyZ6`59w(;=%uW5s zAeW$s*gGBMIPrx- zeq(Dl49lH zCcTfW&B+LQ8yc4tC+q7g0tTt+EHmWG4p(g+Y`hvNRAtlhn(lZFc?Dy+9!4yzEP$=qLXI?1@5=35Jg4=2 zrebN195d4&FE~Iaz;DcoHRy7mYf@yCP%@`#D3Ozy!*`;~z$83GHYZo><$LaW?ZJ^>&4eaEUdsC=WVn2HaDn}i;oMu;=1$vyjH+| z##ME{xyqb8z1Gf3W~2=x+!%jb1vp?jIWoQb8V9}liONJy-x?s~%*fah}S%c`k< z*+JJ^RA5w2;R0WP|4yshVjUVk?d(t>uF9;mD@^(HY7d?=Sv`fdY}yLzs9 z@>`xm5hpLiZ`(aC_x)O*a&TnVyBOI(gCRi$%IWi4Us@}UbuxHdSO#~d^z8B0efTpR zvnv;v7MUDihCNDOI=+7Ee0YiK+i;wFeQcxI6(0OrL3gNMhdZPCRZBt>PFaRMfGzcM&eV@63i<=Zxwbjahp=ZXB@&Bb29(K}DM zlcwf+Y+9b=W3>WR1C8z;yy=W1{XA==cxU@H1#Qh}TMlIfmw}UOiWiy8F@WU)DaeRZ z;foV)vUTNhC!e~Om-39E88RhcWZ+BM-ZXmkg3SE1ke2Z123gRwy{H4Fi<=<>!;FAq z3nEhDlf{nOza=~clpXL!Rh59p%18$3&UZCKr-j%AQ(dxDaY|HH;Z_#d;1rtLp zbQQ&zc=LaN^X?>Unvm&RGAA+-GtDuZsbjxw3dq?^8BXWtGMQ5tY2D&R%81U<^*!JP zGYc|YrB+DgMk^fb4=rBAV{(i2I<(j0Z<+gobfPx4HmUxL=nv3di|P8U)%e4*49>O| zLR~iXqfE$}PO`0JWfazKBRPs;RvUXjb?@fi0qInUZu?BX8qn(E6A>xt@pjJ!EorpF zU-b(h<#{BvB&o6hqVmSFp^it^xzNeF_K+q8kcE_U2NDrEi}J*kS2W@Wa56Nr-tu?gMFVXUg^me{vaV{@H%9=;vLzx8PN`z`mjHiGzlDvHFAQUg{vrFN#7qA@tr`{I`t0 z)B{Ig5lWenVU)EX_>mw<><-j(ech^lE9aE51mM3rOq$ARf=v^fJ}-K6d3T3*yfRqk zg1F-GIz7KH_wVdIJD5!P_|fxs`2m#>6n;_qtpRbgQ14l$Fe`Wk&+silQ-;S8qq&9;` zb|ah|Jj;llS1j8+01G_a%rg~9jI3xZIL26unoQ=(p0FkI<7mlDY%!x~ZuK3-a3Ass z9JtGtqLTndpV4xwuS)7FAn)Agy@P9MRSz%kej2&#uoqAWcu^oL1Mka0cXN|_i;HL1 zOTTkhF~izqKix=#Ac&mfPpR%$X~W?P8QGhn*=m7BM?G^8y$r+4KFzdi>FFW--Z$li zQvM^k_2MQ5-8oVY0vmmW2fsJW4ccH~nZ@64^iT`6(8_(YEvtE1BLMWih2rvT%^3*1 zzfC)@O?j!Kgxn61ldXjLyW;HQMi?Ug%-(tiJbZW<@V&iafoJ?`vo&jdV31?u+O}-1 zo7BjnKYjyqS^WO$NtLDIW~UqF3qkd+y;+{C?)!!INRC#+R^>xO(W}G9W!&z2GK|U; zqoS=X2{-pgTE7c6mv<;M2xx06uQioX1A+zY0PRN$@U274MA>iO?jCPmb`X=gtRwGs z^vx5b&63<2BZwR6n$bWDm?u0I7W>OBb_^2~!T+Gv+D zCj!ra_{!?)#S}H5a>d7?yAur2xj8wqGD>-s^N}VqGvL?3^p3f(Y{Q-?n*Q{%`$ELU z=jDX{g{oLg#3koura&+`596wPqt{iE00q4@%A&9BGmrage*!|n%PE1@fi5gFbAPuY zCKXLJf>}($ZM{;5(L3VfgWuY414pJUC()EGL&!;x07V=ld3_C8eJ_*Od3`Pt^Ki8+ zPT>$;_e1*1+84_{)dEJ>qv0L|f9!$0x>k0B4jxCI$o%POYZubbReGN{5cbfIr+&;cUs)jp zl!GGUbKbmZ2j69d{{sghpBeTizQR{m8$j1%SIo9b#fxd0R@YHK;TDIc7t)~z@(gs_o84x|)daP`Id$w2C z#_NV0t+$hh6wQZVTK|-R0Txr!oU4UH|MrZ>W!8=Xc6Qi~^jMVG7(0hmoi3)ULK{|_ z@Ea$gSak~@k*w>FhZPYK5ni|9n}ExmlrnT<#4SV9^-j~ZA1*NwzxUn_->!DER6i_+ z-|s>a8Ilfoq-UXtsb1p@v{%|)?7jC^tVouVRa|{+bR`uGvS5&G;)l;B*f(;q*QS4a z-upRj0qM@4GV+r^F^u+)ZAW#J6%j#xc8k@ov8?|McHje}-k+1n0TxL^O*MbP_o&y>P_=zdG8$l6@zub5D3B8+tpZX3X#Cg`#U9yUFcp9Fz8W`y7eb zm+>qq<&1&Aj3c_`q(x``65$&0LK?pt6bX8ijKugyZEAS;Sb>Ij7+kyY^8I}~uQ{K5 z&HMgYMrn63;OI$@QkqhGyU5EydKMuJP6|apBp5dPOu=Geqs^ud^h+Brs8a&2DHue zL!5kauHI{$+Dc@X62ud5*#$?Iwa^5f7i&rIep_H;O`p#c))o@K_3;^zOhGNTYuAfD z5Z_&4-AYa>c~JfzY|TjCA!zFvt9lh$Y>k7Ka?=G7rxZL&N)w!aokNh(#YAz*$~N@% zwQCL<6#Sj##Ee2kFc-&;&{q?+<+8L(u*m7=krNf4pOY;xlfA=5oKiZ%7ccwmUHvSm z2=yXq4L@Zr_%Wh9Yo&zs#}F*MOeA}59L-oTOtzn1s9rc+Cs>wJggA7$!^pc_5>)8E z4_ouI-bUMLz27@!Ge0Nuo)@Dnf%TD=B6M?mNr{Ph+~y>a=uN-Hv_OMjfBZTU(cmM8 z1mlTzAn)-lKk?hK%-bVr4}Pzo)!7wl1w5vEo?_Y!sZlhdfSHOb9>#1Jnq-Sglk)-G zn4>N`;U*=lCdNv;*Px-rL?MN|E96lGFJek2zO8I00B?Cu;(zHp`d-Di( z!A_HjtGsW?UI*+dx2`C;z$DdOQQM=CImWOOsp zmgEoU;g5m;6N;uA?jBPUhhmW7+F?`SqJ?%k<*Z_H?C5!jV5BaUabjKF3X0OiSLOU* z;18|;9nZofb#^*pW<+J@;j3h8s_lM}pNG}4r!){koV_|9$5ajCd7GWEnZ z-x;1p=GTTmwoONprhg%QdA4ufITDfn*R^)GDWrNQf5+P&f}e%jAi4KEG&Hti7vZ8} zV7KD>MS@8A#`Fk`32)opeJYE0re0n09w(W`LHfPGKad5dA)&ila3mae|km={mkB;6EvkTC&l; zvz=i3W(yeEi2Z3Mj4e`u5kyhG8=uW@OvW!|;8SBkf{+s*lYJ&q!G0U`;@16T$bOs2 zY-)12$($gFlZu9=!RkrM7`j~XQ!=~PL`t}D8l?x*pwco0dp*@DVrpgm=|$IV@u2Zc zTK+}{-4WM#Z`{HLW3BXS0wCn4Q8Pj3viV8FGO=DF%r1 z4L#!nEFDHZ%a`tb9o+3|ns3GnSt|%vftUNNTNmS|8PHSRCl7knQE2-CwDptM5{_;r z><4x91+Xi|pdxM-y!{S-G@M3vZk+NAbzQLL}GM3#kLkjCYgl2SNi-==%gelS|x>B^wwbzD2l=LgFT0U?ZYHV0ddh_tx!2ufGyNG#O?zh zf6IVw4k0Ri8u5gX&&tU`dvK7)#Dk{iHzpQ>@2xwgzDG8<1IeU^75!W#9a){*G=C{? z$JF>DPMY&@Q)PVNDE}R;e!f|R5P|gik9H4*$IE1dw`U8*!A`#MZubX0#bfDnttEaS z{l?#?Sc@&8YqpOi$6&QCM@-+S3P*;THo9XZhaL+2KPb zLu$ql^z+S$yeW$hw(=J)U(EwpSAam=!pMx}=QA~atSw)@xbJESr5HfL)p|yQq|MY7 z;PFN)f|So~w_1h|zWTW1NyTKl>Z1xG;cO)QL}?dkegfx&U{~0gtc@uD%S1>>tf@Ow zw{9Ob4TIzXv>U8AD=|)lnKthXsM^k^`D}$bu_<>F+W8-3KA@5{o~1JUG*b!E<-@B1 z@mJh0gG$PVYWAPtN~=f01v1!&z8-$O$pLXD}k?R=WbHYxOqhZ=bl#hjJF?koh zxBo$^gc6@t9ofZ}qz?{NNd}^xi~pUT-LfN@1cQ&Gdj-~&!W*&35ZhCl1A&ak;F1P5 z{$COFk!Wbe?EX9PedqOdb6{M@?HD|A_d5qN&u!3}gTBn56HdofLX%jvT4KlK!fOW|aK>%b64%6gfMT}_S8vBpHu{EI7O2&UJh*-<> z+UmPh1O z8ST16xpV~X60Gyi9z zS%Or^r?T$NN`PrW*IJlvF8?dJvvE^< zMVs^><_YF+=iJe+4dv#vedDS~^Y#V5jN3S_@4CiiGYS7vSI?1GIO6iH{tdrbswJh5 z82^>efA`w9+t=ce4~rro!?>vw_)ZDc8UR<_!@^|=wejd;(9Og z1&d%;kq69V99TsrU_rr3!eOVD;e7oFJ=pI0JzKh%E|mG2g@bJ)--?Dw>=`})3Z^qW z_o@EB%5lx=6aaTKD7r!Ri}Hu%uAqcYa;?Tv$wF#H^)neN9W|#}y)gDmvc?=#tt+dU zt5D9pDJFj$Y`f0)pEskc18c+L`5C>^o$sPyC|?`K2ZbG4FkV@Bc_rMClCG)g84Q1G zx{JyZBriPei{(HTe3AQ(#5q5IPQ-qtDn}}&U!Sqk@pf&0;jQ~&3x2fGn);6u&3Ef1 zTU(s}DV!sMz4U>xKhu3G)n55DkZFUXsU1HME1~LzghTip^^`tn@@ihte`s!4x-u4< zSgR3T_Z6ICEKa3ly#XzFw-t8e2q2_2@<|SXV|QBp?q)iNq4YST;FC%{p(Y0-_+I_Zranfbk!U|n zbO=PuOfCBtICjzf8i`ltH;hA#^=zi?$=qTCOr0NDZ<8kyg%-B%C&x+ZdSf)-;N^e| zD0ql|ikHH^Qa!?@dCI^Sy#TERyi?JXL*h8clM|mOiyiLfis^9)ThBY;$x@dl5;M8Foq@U|7;huZrzb;pg$W z;jYxQJonb1fjsP=#mN=A3T7|!-QCrcdGhr)w84o zl$3*CEaWMvHeKuMmm+Lm2qlh=l%%6*S9qeRjiz^YYZ*zu_7|h|E3c#;m5|7DL6(&1 zpD~BOdisi!Oyn5FxyMn+0I8T}01Y|Re}WU4#}-IPX|Y+j!pVu6TCPx4%>W51ilJkk z3JE3hOdbDLIKi5ik3&1hz#%xKG@+PwnC{j@$-VTSwIi*y#s;%OAaRm4#L{gJghJtX z<7}r}e8H4G0Szpy%qu@a?e!;759L?=@6-jRwFL^B!VuU9!vfSa@51wU}ywB!}$gKuYFlEh7&Mmw#hlb5U= zGMncM9cNNT2Yf7^y~|)viEqtJwf<74KOBqlk9Uvj9B=d}tgMVT{=N@nx7Oz*$|)L` z_l6%(QxA~u_AzBjuj6&fZ&0K@O8~RGZ1n_T3WR`+$&8^-Tm_xdm-y}WK7V2|CtR;} z3{jZVMYH?D2sYu>Uzi50p6MRI^Vl-)rE;O^#f&6zJVuV?1giTCoI{EeOp5mvQ+s@Z z<5)9Hb-(2P(a^Q9?^|R=MYcjhQA(`HMgzHs{VmQB?cUKtUqL6EnFpw#R-12(v!Ux) zD<~p@;oSOlPAe!mY+>B(ugfuq^(gsAz8PNeD<_=x%NRJ+d!tv>YYWaA_{OGi+uLAB^MVbd2;j zE3WmNx?GB_(b44CDr#!Tj&?V5)IVj<-^`Dzl7hHI&b_1LJ-WG-kd&_Z;nd0bP)PBj zV1tl4iji^Y+ql8d$kx7R^htstc3W1`N?X2syZ!bbx>V?v!a(jRqJnHw3o?19X5d!TLG;f)&M~%P$Ro$j5<4QfcoRw@UV<4DR;`i zTz01|?hJZQQ?I>v;d-~*ntASff6e{-yh)J1<0_%T2n}wabvjiM%W}nenKLY+@Hs_e zwUQ>>Uf&aOb`34CRxw<**uPfp6IY)JisL(+V`cAJb>e}qd;N!v?jt{x*D~sWx1LU} zg2gW;9*f+sP*OipnTa;4k4SIvXFDZ%xsGTRSu}CVh}Q45FR$RTYqSR$v~jmD=P|B* zE1yu-t)xVn#e<+X2I~%9fpecJ_g)F|<8J!xH)upkB2^~FtVoJl>Jli-R3gCIaxCZ~ zZqTMoDn9gWXI!(!c9w+0w#6G}=&DQ_*tDDn}?Q&_aZzt0vrOI`Zz;+~wu5{2x|Rh6OT zZhJZ%hbw#$3r2R3Bqk-5yLWRVo6v-XUUFhPheR90vKEjX2;iM}9*Lo>WjBw0HUM=K%d^;nec0qfIGX&70cgT4!w9ZV5drm>M4>1&QzyFM@5k<%6KsRqWso4 zZ6?*2I_vrh*$xAW$;^TO?LKK3i{HqkPV>UYdWugwPmOIZ8lR$Ml;4 zD~{%2Uudqm?B0r3zK4Ga%YqFV=IYct5Ed*r_M;Xq8|#k7y@WM#<=kaPt;CzM46w>5 zD>F4p;|&ZBR_ud0YToG>bXF$WqSPG>M9PH4qJ7o#rch&yVr1q*p-hj6kkkBWs4Qzu zuErE&a@5wcM$3|8t4j*FpzX8TjyM{%=vzWykCMwEOZU$pYwup;N5b^F%QJ!$s02Pd zav*kc;vynS{v4MjW#WW&3e&-DJL_NFntV=J+Z$arH9AGzID6S|$=>*$WZTUT#dp_s z8t^&bd)QTENfWXmBhtpM-KM)x51O(%3v(>#*5;(-{s!veiRvh*bW8l{T)p2JgHOsW=wG? zgFoo9P8%t9LweAJb`qOr6Q(A|iD&0X_D!l|jpu z<(*h+=|_nJA#U^)HfZ2*klu`CSm6HBI}H&AVw4ZhJun^UYm)6U(aWMw7#wB#$@F12(Q$1EL{<-146wjz_mi ztsBF;_ffr0^LeDyjAYo$=bGRynP=Nc!!s(KVd3FDv=31^?I$=9 z;y!R{T8*Sur&|}RahYe&sNa-*3x4|aDK*M#16RoRAv9%)9>h<<8*Zl$f4`l zp8J8uz>se@Uzs^^rqJ=`Et$wyynh6gt~YnKOtf1^t#^9Xf2ta5$bbLG+Z_nBH{Ikd z2B%#g0OKMO-S{B(RHw!JxoCs?Mu9Dd$v_vRe`sJieABQDI5K#?xSet6-)&#(v^Z;3 z*UN3T<0%&*uhZm;=1TUFSvbGzHQvBhrfPDhLpG9DL3a;!&@ z^I*kBJ$NcepLojA7@-ytYrY|w!fiQD)U>w<$na}_84^v=IlE~zG*LC0?&_S@|ZIMW;Kw< z33A3-?A(QOdmDS8jj%vVgGR04hI)+2r0Qh!5EGL$#*l?BZXE1RlmZkbG|m@{pT`Mk zn@Z?(XIYPqQ5zT9HY_>~H7ur7l^|Wn=u%LTg#|}W(TGawVL=t@kes7XQGuVkX&R%k z=AEquI?cHT>h#Emq(_lq6H~0!&ucUJBYjAl=FIgPO*SE?H0b)ffPe}=u~T^I`ij35 zua}*i38R+Z4JW|M<5o)HUDqp<3+k_iY1;O4HruMj7E%Ws8X{^1w%3!`-4Pm`nN_eYR z>#@@XNfSDD1&s4l0pa860MC;vfw2AAq|=eK4-5923$YuYecnB}IqWrjDo_@<*xc}Y zZ2+|Evo8B8uFV^xtF6=ed8a`m!Ofv?Y|8O$kg!4b>$KT=k&_8l05&CeU^)M@y$Izs zgml(wk^IPdB8p#_@{EVV6u`aNVM|qCUBXEPAK-_H-BFe#9_fD-&c5KoZ8xFqpL$x~ z2(ou)bP@)0JI!GWxo>x5T?)3acw8`a`P^XMzmGI)o1intTBQ*A7}7? zKkMMc=CmW5)X)x5Ve;l{GbpgsVbo?!wg_4W3_chPvH+G-t!pQD5(Cncv^DctAApC7 zDl}qi+%NTD=V4(o)FDAyJgjDlgKPPG*)Fp8KN5ih^;^X^U;HQvt-XC6cw%mKPi$4) zIhTVeQv+rPecjp#0Sa3piCDDrZC?_prEh&hb3v}WpxoSwmyy-gycr{%j|;1uPh^xw zb8;#_Ty~)m5!Dso93Nj4=%vJ9?~z8Dkj?D7PakgSDnR(qFApx8%`G?9&X`ql0oRw;m;O}BxgT>o;p|jY*{O#@fPR9zJ8eQFo-R0y8R4x>>eqt$Fu&cGt*ZNidj~iDAQC_gHJ2{LFvl@49>?@>keo36b z7Q5TQj9pb2bjIvJ8WY2Fn(WvzTcGwd?`Y||E(+3z*v7a`HNkIMr!Cb~bi8ED?nTkj zF%z=B$k`{`hVF`#Oc}--}Pqc<`!+^oJl7u0ml#CHJ&X)~8SCYwK$hQN=+m zw`iy@SYABk5zV}962ZWso?7GcuAdq}fBAUuZpz+G(oy5QY@w?f+pZw!Q?8}8L3;S7 zaGYt1_L)7h5VXf=cJ5jnAwf3_upO@-IK?dSHTvH;)HN=2wUZ$R>$XD0*L;~8%VlT^ zgb;2n&I*NMmWMr}cU2ZaCOUk(^1csN9t|drKEm+II=4m zgxO;_h!(l{wR-$~n?Arn9B|vDA3(I0LQI|cTEJ9s02gU2!;RSe@B?M59E1)!i~{%e z?3_=XnOT|h$DJ+%o+KqFS2*wY2tjYo4_-UTG8a!fd~0gTfGAVW8Pjg3>Eu~8bii7g zeSVd=V5+L}gvrmy?|yw1yPZv`M*YivrfDG;wf2JP5#=?Toi53zD|EYg)zefU)p?nU zfu`ojh@e)!OJD%2dk;go_X6YG#|MNE_J~E%#<3cCY4m^P6wdRh+$OwAg$YKa^_D$1 zuyk4#O~dxdlq}4)^uvG=VOsx5LN@Uws(OOt+{y8^;_$_nLqhleMc!MuMfI+2po1Vtt0*BQAl)JzqoN=nAky6+ z-3)f`oK;*U(4~Fu>5=H4Fp8S?+KD_P4)to&Vs>bq%#xYi8E_lpfvbvUZvxP&~QCSJ#)Eyhjix2$@Px1Xwl|&8p4N>l*>EtEqdBz z;g3s0_3ews8mrM?rTHJVREFm3bAz282ivQk2;sK4vx9t2K1TLarhHVPeZif$sl?!#?;Nlw92|Ikp%`CLC^u6&73BAY4$XGqQsW{q~t(!>VxWU$9!Y2C;K)L>cg)xtnElHAn3Sn(=BhjQHE5#3MKd%k)KP@QE}^%x z^G>$uT$R5ABjAC4y1nD$q~QHkP#zG_{&cRl8oIIG6EbG1bpq!FE@2|3m`1|-KxIr# zL+yix&TA_ZlqQS8wEDgy=^Ue1PC@(H-pQ1ys5R~{(D5(q>dJ$`{WesYb;0LUif z-buX7kK{kwTMXKpZ?;fwt291!pR0*@#>n+!DeEb+`pZTHtd?Tnv6NSz7b{FY+fWKyfrYu0;<;c?1mO^ z`uApi0!aAB02f0z@uGit&|$jb9|yw-ox_f5bA5BQO$`tH8+g|tpV4LcXJ(v5?2n|J z>t0@=4UaD_RyNx7dm~^YD`j=p)Q*a)X>q#kTMwk!c-W0c<_$rY_KSC}y4_9pwv5AR z1;d-0??_=*#F1BRiYT`+f;?p^Xckt>cPomZuH~iAOwPH(e+yCHGNmGqEz{%-lt?%e zxj;tnjR+!Y(G;h+{J$GNcg(|5w|*Pz!ph8N3M$@9o!W*H5Ng+1i-P3PNU};h!u-f5 z*a>gvFYM^1pl~6FEM&mvvu$uRt*%g&+iK%C^jzXQKpd$gAaI^0D95|xrS35D+rm_@1zuM>-(G1AWC2|m*`p!&(^YkSNJE{*wlPpo^Up3p zMoHnJO&MC345Lv-y;tm3yq$uXt=uAq2NMrcG>ztfwBAGt2g*h;KzzD*XHdepwe_Q? zCeYI!R8*5gYJ$!10yh=@^*&lwJErB=hJah z^R_O6fm;w&4t4o;6|-@SM6z0C=7s-LS&7MupcF_bF5aL}0!cU`hk>rId8GfSVA0L( zf(K_j2_7lk&wzTVGAZ=a79Tg$z2ro?8W)(rBQ=wn`g&CGu`BoqGvNfO$friwhJL2jU^ZxC$S_L z<8?U)bpZ@fGme@Vos2lJW)%shR3pizLE1RqhI@sj3!&pjmEfbhFBk#nCfmhYuH&Mm z#|d(oqEe9QGah-%EBEa&eFqH*?WsXFnvFwxg|@bTkoGr9Pfj7auRnYMN#kDhSkwv5 zO}nNv-}b|X(02VQv=eT(m!m5ChLOa)j%61LQ;dy*x3ATgtczH2gcf$MbOMY;^*hSU z1B@H<{7d7nbRyogmr50Jdg^zS7Aa3m`LrxMlw3?fHGy=Qp!&AVNFBB=Wy36`~39@`IkYt7TrmGwS@q+Oy5|tNccSq?7@~4$c$^ z_Gkz%s9k-ZxQiC6snCtTkOb^`wb^^eXwVO?erz*E0QpS-(ci_OGaadXF!x z2i`x3i3^)r+|(ld`8Jd=>>d#TqlCnrrbNxaHoRR^<7HP7Hcrl*g8C!2$dCV7jWxXylU{NMq~Pb=vW`G#u2wZ{Km8DeRm9=886JwYcyC4PeL(H-hitIUX< zP`&U%H$UQbS6Wkzw~gOa+&tX~Y$wlFe`+KV3Qm|kQU6>CZEP2e?~svRb_i4jhlQji zh2J47s@c~fT_x>EC^~ol-`=LR?#+}tjlb{Dlv{K7*pyuAsxIgXE>tyj!V0u8uyiQh zi<{i#^!FaBT=W>}qpZxW|uYJy#tTxLpb^jwi{fAJ&jWg}+* zDS`3A<5oKA0@|y_tKX%9rP{1Bf-HkoUV#i{orVuYoly1#pr*Ixmb^oJ=nA?Kx&DOx zZl5x21aW*st&5r%&>)iFlYB=sdB)D2gOl2y!Lxu@!1=Zeio$ z5Sy0%r#=!x_T~iRM=3 z2`!FhUD3v(hB!#55Cd0xu4~g~>@`AZr%gA!lX=k4dZcLu^s~~4CYZ-$rYb<}5B}@I zK&BgLU4rHNM{n3I@2k7r*}X46F?^Rxeu~FzYb6dPOEO;&VyTa>2|T^L1U$RhXh`s= zHF)eQZ`yx$9TVO&x(Uq%0;OvbrvI&a0XIzaqS3G$?K z+cnzR2&@3P`Cb_t%L1LLvE<5+qzn7|0(B0?>)Ce$da{g}w&s}<%D}!9sS6|V!kEC! zHdO2{zwZ%|rk%-~e;Ry9xdyYJ@>_elLD`zf!Bk!1uVI-hzc+ZEA zYVUT1?2b;69>FzM{r%O4^RrXmjqlS@4Nnu>EZpQV(;K0#4Q-UviavVpSN8nM&*L-M z!vSvXXm)0+gKId}s}d@4bFrdCo@cBAf%ujgiV!6d@mgEkldC7xvL^F9Ld6D3Wf1Hn zK093cwsVg7$B(%%C|Mx3-mE^3yF4x$W#c;1Gj-~SLd2xT@D> zL-rqQ_4oUlr>Tu^-P?4>8t*vssn)T+is2jUHP1ooENy8h9Y+`n?5hCi?t5|Mold44 z-TA=GO!{xe(eW`#*5i;?%%xxK#lG8Nlr=nKa_t#`v&(mT*kX&MB=h(3kav3qi(kLV zF0Jn?ddr9U_?y3F_G*|tD4QcVIh9kEV>I3r>SRixbJ>l)Pt;|!xuN)rh4!fccf``4 zKNk9irmJjaY^=PjsU_6Y%j^5njv+;(&1qaG&Mu(7fp|IyXkvSUodya#3gr>+NFM4Ka48N%=Gbpt4)O_TLs?UPwmZr?9#u!i!Q$S zfaP00$55nlyRk#f&3$dRrxrZDRF21Y8|*+OeEvQ!-Gjl<|BNmO70~;;6 z`$hX#{;zVIU5kevhpvZFkyeJP#55BbEyqqEvtM~2TtMEd@rjv)#RqA>-2vn#nbW@h zalqI5bgrB8e6dX-MZ(mQZM=5A@Iua#luz)=_D_r0ut^avLK89f&KHV62%R#ud3MU{ z3@$eGJL3uR@={!kia17+J{19htJcwlr;5>Xg>_%*1D1-6oNC=* zv(B;&>tK~8Qod4P{JS+ga@uY#I>om=2T{FdmcV^U6)+%81CRMLBVvLkep-tFaSfU* zoG`m_I8s-BS|nXlyIcGAZt0);3Uq}PG1!u8sfkyr*M5fD)|BQVpYp%u?@eTc^t}Mm z>G^<*r4RcvI8BNINsb${-L8AxQHGGY>>WeUZTrhF(sSj)Qjx&Dow0QnbKg}mx#nSn z*LGP{@w;tg@&lBDO|w#Wf_KrE>x>xM0iQWOzo z2|f!3FjEuCZ$8|HgO&49YHs(fr*t;!Dx97jEcSfvmJCl3NxsyFr_#vQWPkZ0<|pJ1 z7Rt?TzT-fjDF){r?B*jPI6awHHGs7WfdGu0V_+~<(*3_BDrQxV%mzd+r&xmWktleK zft*umQ(18zFci4mQ?)dBS!duEVoNQp_2!ok$6A5=K48{NM`REAH*=7D=}LgnsgF`r zR%EQS6My|$T24XkWD5q=Y@&sX0oBpL!y}vG`DS0?*FRwEJ#^R0>wh-Ee}eyHT2>ib z+pM478XoM=1Ii-&>5YGi{;rH`83H~j0u*PzBN`&+_qcG0s16qC9zIceN3FT^gpNwl zXxC^I%_Y*kkXdF}1X$v{H4Dpep*+)cs}jN!=k3W7)}Iez&h`WX#$z826m=r4_r+Wp zS&I(N#{QF<{{4aV3lpG7C!b&yO#JC$^v;)r(HXJbg*}9nLf%}9tx|gmA(pF!k3nys z-M|6BOG|;0x2@jP?6zYh@j<_GpREF}JP3vQK~CXyMol~M*@d@hzz@Aok?EwlPeLn* zn?Lbt;PcJFb}lv065gKeg%Gek6S>C5o^4~zpw$(|D(7X$NY@nx7@d+u(v>uL(v+P_ zmTG{W5O}rw-fjc}{4vNBkFfLokta1$8Zyxp@0L*|H(NNSA|qpm{p zh{Y(y*;X$mKfLtLdUnf7>*Lq*3ZYn9EoKa>c|%LZgcd4lAKH0cHb2}L;~+FJMAVWA z?O9K2?Q{^ury(@#3+OY+Y3cvk*bx)=^#RS)rYAR4(iS*q-c{KH^`?Z@bacs%)mZYj zrrhu(nA7bp)9~AMGExe=iT&=!(`q=XV}X;>ihfgC@Gk$fhzzE|gwcd{3P_n;5L&YB}WV{UMT7`Yj z^MOHmeBv;pvo&^*+7HcgVTQ=`RN-k+NMFd9nwmzr`GU0$3Xc!9mrRFF9KDS%4u8?y z>?h*3w*B?3j7oGSG$l8Tjhj7hv|V*;u_+45e=J^G z>@RoR4`<}H<>Xd3ABoB=`X8GA-Pi0UJl`vfxc;-ZDicZ5I|}yOZq@(r;a$^(-xJZ- zYnQHQJK^IpxWmQ*QfgzQiSASNexhMBGyvka^}uK6P@taanUp>4*jUT~TzK)4cM-i5 zmjhYkPE7!I{SHhDjDpvsPF#=xW67a2G@X>D;qyP)@-^1)JM{@Otv40$7A>h;3ZgC< zAnKY&10-*Y!iK;KJoG+0kbU<_tLjQm=$3-~nlJG#c!*h8oG@VV25)(NwW|^ZR@L~} zxwM>*6@9-hF6b2Ul$-r~^{;2-Bk0e7TQ99Rrw_@gjAd>c>1xkHws**0?!46*8AW6! zDW%KJ)L;)j=T~G+oh~+m<`IMTW~x6c+Gq&TV(xUw$PGtCe| zpdL^v>0>OG4isn}Oo~wk0JWMQkH~=&=r+8Ha+#ScyoNbw;^SQp-AsZ_3=9myCH>eu z7BCd0^=HaZSFS{8wP}CI@*XWX(k(~k#Ja5&XKo*Kc0&5pZoFH}@Q}E`YXS1pfj(oO z7H)K_+1ot{hq}>PwS<|G-L~X=F{P4@+B4Dw`#nlNG#kF0AHvhLMVMG7El^}%R z9E*TJ>U^3W0U?3zBotr>*cLW=bb}kdQY7jU)#tg69P0>O_K#$JSFEL=^p=K@W7F}Q z=txUj8P%Y0{9&Bx188k1^YyS-gAc;-^w9tZiRT%GbxntMjEr!R00^Phs;u3Em0f(# zBef~bfAcX^6=Ykg7gEJovRJlkv5*-Tl{sXJhH1+l(H;GW$&fR!rvs?4gI%vz>&Rop zz;RngdH!uLEQSkWd?(s>yZfT=x6(fU`qjyF*8A#{6tzTB>*vqI2R=iWRA%Ve*O*#6?Ox6@376tvhJV{URxEW8?BR@95)j@xyHv_4E3y>Yg+nnX;|~e22A?|# zF=+wiF|J?DlT}anp0Y&`O+Iq2s+wuG7yMkJ+l1!j<#y7%AYa?4k2*d+&;3;p@@1Z8 znoIxd!XSiFlf&7}b$2SY`0NG2iSq(Hl#tNrQvD9liTuV(Tf6EiG$fRTRh%rp3lI#A zl5089^30Xa*OlWFpI|?kKzD)87tpH`U0@3UvMG%MNWfn?sW5E+?stvahZmpHMeVr* z+dVzm*B{55S*#2BwX3`kWK5IwK3_pNITa5N=0`*c2gbMKL;mRn(8W`A{bO?|YBL?H zseL;0Sd7}AhP1Zs*AGr1`;(aj0~_}spC-4}l*oNAMhL0R$tnI>k7r2a*hS@VsySY0rk1_MN`nZWZl`f8@h1H5$g@<$paV~Jye zIt2P0Ze4oP7{pciJr~caUh3$feb8~yDxpE0U;Dy^?AA;1MaSzzXAV!;;&telT`y1R z3*HrcbeP-4@KNKV!$PpIrW&TbZI85avX&sgY+Pb4QoQC%GT8tME?q);9-DfG*;DrN zzsL{vz1APSd%W4d-t6hYu!$gde&@~S;{95-)ocz0mRZuciYFh4+TXrICyyUyA1z!f_-u;^#!2X;vL?iX`#WJb02Z)dnQq-zP z{G&L{$0^mw)75Vyv<*(XLI&cF0q1w`{yk~kuk>m4A8i*~i?__{3G1zXS;_Ripd>zw zt48T%(9oI4iSxtRCQBw|spFSbQHGV5c+Qm%DPNS+=chf7&i;b^=rPR_`q27Lv$=x5 zvjZ=ONPAyQm(IMbiv+40yBk`<#LF6U<0E|9yE|I9b-7W0p0GR9YA!0OjlX8bTj)v z9|JWW=FCIe+@Y>_!wJzin2WPtoFKXNnAi9yB(HLn{+ORVNtqJ-qTh_ae<7I z)Wl=pU!sA#zCO5tbu=_VT4g@*amBru1vpxV@c#aFVYmMsyeHk`xliCt& znE^@i`<~i25^kw{jeF35raxFkGTSo(f)pKX#M88P2YGrnCTlHK?()n4{qJ0KEov3e zVxjWF&L1f+dkP3NA)}yr{yeJ+AnwMgwI41YTYWc|xTSJF6TMF8pW9qaG$>Xrj9-+? zLTj|Fj3Aq+5YYGTUfG0&D%xn$YGg77=SU}(?jhm=fQTTZ;M2h1K;K}$)UVdLuMLZ? zr5P+O>?E?x)Ue`bd)4Z+}R9n|U}{hwk|E1K`80Aw&8f1%%KB9^{4)BO8$ zjxy0yN7=BuEtvj?*2kfq{kidu(XzM3J25X9xPI(~%0q_wim5N@UwK^b9)1lDI@vNE zjg3nm4EXFfTf^Bp3k74kU8+e4)=I@4a(`8aQy6$Y4*2oI)gx6UCx5)fN3-;1aDCph zOE7p+R`sA|QwVbb<3wGh(qA4!4Jn_S-Pbg9!%t4uo_BFrDBu6E;CUnX%hKX_sEXIL zYL-&Umu*n9)av3G(3aKEL7p|Zga2B7CWPrZ#}^)baaA?7J^R!7swf~Q8ez>GW^fuc zXhd!ee8!eLxZ!QRe3mX&yNRMOU}a{GFDgyzX*;~702pMiUmOaTq6UZO-H?G2H~RBjO;bB33PYKDt$HYvhvIX$7X$&^KQRikmQ$lK<~1t!vZp%;b=v&CCVZ&v%3(5{-B89dk$&raNntr<(ldOV7 zb`@n_xpW2P>bYxBl|eQT*M!B+fHxf7llzsPNiUGi=p`&V+v4D0#g5CzFOim66*;0d z1H-I4+qbNXk#if2B;F!l_+9lnpQ~4S-qctodmWgA);8Bq7f8WX-sfVkU%#$D{$^8; z%z$5F(3x1CJI8n;=aU^nm@UEtZv75*O@q#?&o}QBT+|blQ$!Mi=^KM-#aBExl5Zc- zJ?M=Pz7G1U9NPjsca|_d4or-UY55tDn6tC@f8RiJ%dY=5^~pslFEANI1ai4dFq<>Ixq%!(BfPP7>*PQNsJEA<6v zRdz#4OCa}h04{3U03Lm@<26;@=T4p5dX5-TiJKvX_h}*t0{My?-&qYmP1kt)_z0{H z30$H}JWk;bVV4#o!Fv7+QxaD*RiJq<7&hfMfFVhu1DIlhI`Gj1wU`gOBWq|5Z2moH zB;>k+h61ZRXtzbyQkY)8EEFeeN;i3iY*5tOp#dg9GJ%uBamGgk+t&e7cy=H~dJ2vz z4`Bm-u|oXjL|=3piz${H_&We(NEdtP^QDg!VLUS7tP?buP!w*}A7UxDi<=cS&w z91Lw28@45LmNsJrC`+YxExp19IHvX<5C^pQH3PS5y`;_(`=~ed5b(U^fBSl%*MVctj4EqETFG#d^vvO9b9;uepv@y^!cH4)1(vieiagycNt>nE8FXR)U! zt3?NpnT3VQM;&=!7?I~igXa9|T}@`gM4t5el>zGc&koM=9EPLG!{;#lVa~GFg>0L` zsJeAU*}1Awkv~SMB-N&Lgc7ypD_2jI>mSeUxuBK@i)uZ*#!!^>a1w4%nb2NxEa9&GF@y64(#f4z)-Xg}W=pLlg)>}5~KdkBZ_ zNb8l=Gx$p#+CI0@=X{Ays!en1^#lSAHh^UXaqBg-nq<(@=%ZE;Md`$`J8ieJk$MO+ zIv$U=T`ZqzxlJkJ%`GktuNrBXxmgY+p*2ZzJN62&*$6af@jjY{S1mAnN)=*|ILZ{) zb>;pWeaxOr={e6Lb`}7hr%%Ad8K|OgLoaGs*09{-ye!Ran(6@LxjRkUe12g|=Y3>9 z?JzTx>fqPD8g-LuuipgvprbP&O$wF^CgDHZnF_?C^ZjBV+0?}8o7y;S4IV*9IJBa$ z0x~yldXJW+DS>qiBj;U>Q`QFy^Ge)`0F=Myt+@36N8ipLmQ}>%KX*Tww6NoC;-c9E z`KMuDvp3BPrtckU-|7PGMXpVhb6>wbm=(%Xy8F|C)4!9E$%>ZdwVVn=o)v(LJZ(JR zk=8PMw){Zl(V7<>*<_<&Ng(`>SUu2K&gsC*!^N0w2lOI+8}sk`eYPW<)nCzbLI0+W zA^#!J!Pw`{|06!Feqv~#-xy#wx7DlpqFAIsqp@X$JYjsnl{Qpu@xF@)AjG*(_xSBg zqx;J$DnF*L0^R~Vt}$bFyVo>y`==TjYSGOOyatPl02C-x1hz^uZx3u*O|G{V6e1#z zq#U_fX!5~11Z|e;kA8hzv|wl`czRq6WJ8mym-w6-Rr$XjIV!>&Zb;gK3_Q05xdvCz z4VgzkxH6fXfqDb5;r1_e-1Luxd-xO6iiHR<1lKBAOB?vFN?u(=Far?AEgGRpH!&>) zoo@giuWPzAoP>sHx4D0Yz9$exg8O1OE{}L%*wjU6AYUbi-TN#C_eVOwS0(;9Z|cP5=3y%%gtT zf$FvAKU7Axr|-Sjk=pHNZ{e(%HG*a|W-8k5@QXftEiL^{?%emLuOR=bPDiQr)th$! zVW79#vm)oyJ{OT0^^ZfC@#lH8XEYcN$-tiqi4{EH%sO16rMOpt_bTDkTNUe!OkJYU zKUOO2CN}IY(P)>eZ6+*$;8%ABh!D4bH}&<)FNF^Bc0!@h1t}4cknR>i`fGVPC1&9| zmI8YO!?!kjTwRRXhPlBQQ`L+D{=qFx}wQ8qeO{nr~oYVCdMJ zr-B)!mX`|wowmm_3H6rX2g`y;FMIX&16Q&BVYizbqm(?fw?ZL=RV0lhG)%t@O-q7j zU|=u|2z`?WYkgZ8NoZH++zYffDYE7tHU^AVr1xD%GuIo{d((>s`c@kuCE7N_vlFAH zh(qJeT5cjyyGKl{?^%S!!vNZcdgQDvuIh*=g=}u%SAFq!%5I9VI>@^76^R&7h4qtD zoE!c8W>h#Cpn+J!K!7sgU!;F?I)VtmbXCamKLD`ZoOzhlz*W2gmGj&urOX%cUz#PR zOFzw~nlZ}iXqSK{w{2%r{Az-}$*wqx^^MvXgrwE`P*mLDJ~!Ip1E7}>go=Qq$t#15 zBAr&M2{3*C>7As!xazfMCSq<3Mc+dqR;?|$x$`wP6b`J+6^`AG8ceYO60L;Mnzcvq2LZ+)Q1 z-t6j3pnmzPsNtqIHA&2z(X_Xrkh-OX`gWoqS3y;6`t-Vb))vrKXY~GUX_W(dM4x-7 zjbU9zwEx%mnDwaq^b~vp#9rNVD$TiEFBOnzzV>G%6d2aTJ4hJ3?46G6q5$D#?6%yI zaPUv39xBqZD|R^c?2^_)+BnNBjIs!wC(+;o3!jv?=~B}iQY*FpcOv>^et>uGxI8=ODJ_2 z4i1}0QOBnZZ^4E?f7(51&agf|5a06WPK!+0EjZkq+AhYwQnXyy^ize+vDQ+6-UglD zmRglE9nS$hs{eZU(?Fq*{v-gyt7cXQok$!@axD~!k7kfQ!1jA%K)!ZtNBc+C;K~*- z7o1-#`(++G@bTCc+^FBh1x7uchSW6B-YL!ayzvG{c2zo!gdUBQ|a6r^72ICo8?(?y)x!_~-K_Yh>G7|CJ7CiN8F()y&= z!GZT2GV`eE8N!^MJ-KQrOr_!FZ28-Q2vV572e|L=v-dnq68ejPH-&zS7;$|{2fG>X zw~ivq_bJ?(YZcr$u10~jYlq0A1k3&iw%0yjNhRgj`j^!N;$JKJRn$-5^{6w(e#V!* zmA4pV8Qbg$Z;Y&+%pU314pL)zhe`&S}qi@u_jUhmd zAlc|~Ix}78z{SkW%%xKu-iEl=Y;JB&a_g@-ke^bbh5J;G4h|w`rg`$XjhBu00Q@Y# z%=sfhj%?IYA}Z{i+yzk`mXQ5CK|6as(Mr{58`jd7(^0E2#Pu%BA-lf*E1hJc;0%j6 zXYfqMf@H1R!FHCOeG{ZLROM(uMXz_4o0&0 z+tEXgp8Vy1=;;9_O}_o~iMrNy!61L(+`lQUP0tTMO5#Go&`;lkV;;y{zLAOt`5a*I z;I)U0&l%^L^jsAacTyr7d|*7bi_OEd2QTWP0OY~9xdm{PGc$C1^9}G8hY=Xq5vVkr zoTtqWrK8D&QX`DJzJ1Wr>H|A8jjl=zlKUyhSda_c`nrW36aj-aPbT9?D}gfc#op}T zpPzxp$HxrJxd)R7@W@T{mrh2WwDks|t&%!DC@?>8rrcP7iYhsrlK&Af;vlln%FNK` zMjzv~d#>kl&RlIz`|fq8ftb53FgTHlRO;-RLP9Ap|B+kIb-7_}lOi_l$IxRHl z(+gR{`q2qs&9N{gd_;lxtIEiv#fxoAgB8Gyt^oG-6%f(cB3k2sH^^_j#+Rqq)^6Ht z3Qg-(7zKAmosv63^|^HwP@?GF;?nEy9%;OM@C#AVwXukiVj-b&#Jd$HIL(0@Ch%4S z(_?wzu=T0u$bY1%Ve~-f_B)C4ErTalt8szF-quc&#ca58>H(zmei)ZF5L7v`bIMk=7+IqX#%;I5T4Q;Zd zc`|Q~tgJaKWo1@ODfc*d@+MzUJ$N{@7UEb6Z>)K{S=ed-x&`@1?PvO52;SZtG7a5a zm`dI5*_iks%?7B*v@4tegtO-v%R!fY-RYz%X~n1IkG+x9!`FVkbsOSn)+2eCf`Xc}WiA|2_$?CZIZUsvS<84Uz8!jI#-~%ab zX5Y|Ic0obXF2?UD$EOF&nX+{V0`uTLhp zbQ@#YRayQNS$bsnmD<-F{IuTD(PacwbmAN7^4|=he&+n@xYZEiD+j|6yC~; zr(0W5>~)5I(>o5%)qxBCYUHj=YgY%9J;TP5t~6`;U2R6;u%i>8Moiu&{nuSs7`6 zKRdwp?2kH@g$>~mLeL36rSTe|NBhF`D%#rpHU2H}06#o=fX%HtXOx65y?@IE!S#)< zik{v|h0Ld#SJ>#~-QB@T^P=57n*pg+P)^I}3f*Q&^R8#iG)_hDOuHB_te7}ihCHqr zGn6ypgOXiGh!{OPjlQv3tb<)Q8?LxXDvREBIYjdQ&Wio(%F1rWa7R&}_X+8o7AICJ zSoV;Nl7qd!Z*~noW&x(8r$&BNlbQPb(3O(!G&hb`#z-c@A@fUxd+XMle zTyeYNZh2vCU@4(Mzg+YACL0Qb<%_mLZvaJp^X6Lp<%jMe=!LWmpL zH={@vJ#R#LlHH_WdVcJHE3;T=OqqQNNkLL0=h1w^dj5jQ1s`f)C-U|6odmAm$?F@n z@Wag**@Ml4CVOB!Rx9d)_0Am$aP-6vYKO+a{7ml#Tdi1xA-*!*1W(+tVHT9kG*2T)qh#nMm5uvvFxTnG>IP1OTb?wLk!if+4Pffuti= zWB&o5?gaq79r^2oNj2@LME$$%oAk{SOBZvG?@l?)Pt}#=HX^qNzgZNQaWXm=6VVCE zl&PKsJ5N2PaNcaQUpXnljO^sRNI&df%iW|mKgxoHKk>P!pc_y@4ih$jr4^>_u;Zamzd)Gj;g1mf4_`$h&Z~Tr;L(3R!1!lpWlh=s`=1yY z{V8QxK_hN=+beFagy%*ovn(?qptb++tKmC||1K_mR%j=V$!tMKMmEY*i(t}|&*Z(C z@fltgd=B_>mdzN-W|G6ku~RtX?xydk*%Nt(mre22%lnUF7}-MA@W*rS-ivBM&S)jV|LzE;8Bgi{ zs=Bse_VWYVF)2~DbUshLkM|wNtwfO**5@_%-U25R+wUx-FABTnsB?Nu?r=aPy+iez zNcE8-vc3DKwq)ESbcqElLI~Ig$y=(3P*yuS^0Bu==d~jF~dWw+Oj-~ zRHo{C$=#slgrqmQVoo_4hVlT{IzB#bBNY6D~uyY&|7(A8|euli*=!&FeAKyh)WZfUKkc#^L%I5j=<4b%sg1cokVJ7yQBN9*O zNdr2}I#qr@o12QSvKG8))=?=GUMjT47)D4*EhdHcTF@iqj@OGDsI_9sM8zY75?8Mu>Mv=aeMI?h+!PPMl4Px}oSzFr3Qjr3bi%Vt)2-10wv z?!tX5^X6;qI|*}d?9CU}MP=4i{e_C(YC{FA1;YfM&uDA)eV{i4U3q(rO-uy#=PS9C z7l-@h<~ILu{Pq9?dDAF@ZIrL(TwWc{ASDGNIzC?hK&CNjKX=JIn~eV>Ue%2v;h$cB zU$N=Q?Ts~q+-^QAkgWQnI}4_b04a{NxfgEyI+ZO3QjX0Q)T06Zto(aTlx;A&ntd5HEsb{-rWs%8Q#e?%gfCE z#g^PH5S%2o{2>i{7-13N{eicZ?=R|bs1q;}BZ z;i)|S{}ORP0i(te_nVEgXJRn5?}Apu-O*nm7?r=WxA#sxzBae()1wwDHHxUT!+l_&ATXE9RZPL} zi;iMOZ3?xdZiQSbUOQ&|<2UqGC7)!vv6Pf=O3X-fnA}?LlDm%Jnsec zr@s2#?0ax?M!K=Ie9-&jwmBqEeh^CUf9IvU`|$PH*nScQL;Z-Hod0~P&dJGX<2Nh4 z@yH%>YrMo_GaQ30bDwr0GFM?^tPCI!eU^W+Gy}DQ@x(snY{NA=w&bJ~GXuGRGYl-# zY}!z15I>(P-yZ8o`Y6k@1tu?4uH|=da{I=xE>_a@*|QS@f@DD-Ecx8n#TK86!}etv z!?0FA2eTDv(sHYbC}5fs_ALlJ_eSP}HoL6Ee~W7Ox$7`l`^sn$z)_A9TxSeLQa`b! zo)=3a(KiwCcH}khc?)9@W8e`;{i*t%)WrLIbE^J#a`p+wm=G};*_GYZo*go9ZQnJSw6rJNim_qzUilUhns&+d`30*w@Lqa{7c1;v*dvCvppg>Atca7tqTjCKmLy){%ehVpJB}p z{cSaiS`^lff4l+EG@ny|L_|dSG2i=tB>pJ3U;n6(s>EM$M)l%R07t~PDpqC3y(I(C zHFhAC*R6;KPfDgX5?rzaHzF`C=l7mSz>>5SZ;NMB1Tuq3Ur%a`JVvn@b7i zd|T4-9 z!s8y8xVMTVmvFj-AVJ&7Ar8@*RcNI;A|!KQ zi_0p8vUPZ{N(_4@q(LK<=>~0Frj{*8<+bd3$49~1L_Mn@N06?z-~ zuk*#d>FT~0llad+^8EP;%tH-)J==1QM}*t8?)63bkDA8P@_JBQ7@s&P#_sx&wIgzSN@0+ue2xuiJjsIZC&E-dm`s z={S~XY1w{6Hdw2;+y7pnqR_?FeYqDa5as5O2Hb_L-^FHd59)fmGrzMv@hp|1Z$Y0( z?CCOq`9_KKu#(^L*KSDL9!WB~SGk3#f(iW!+VX$qFq@g8#UxYiy%wbel9<@(%X-idQm;)as9?To9An7+5YgUK#Z`@hZ3 zn+bgwjw6IAHktd?@5ORc;rCyLNGIv@0VOxTKr|Tv$;syOagIp5W5%KXWkYV4)rZ2o z(AO;)4OUh|JCwtJu!9SPQbn|MdIw`-F2zN(9=4|I>Ek;(uN^tqKbrZG7#y4)TEAi< z*4QA(9*H7M_$&X@#Rdbkb%>8ei)KQmmJWtR5~9oz%U!|F@FU{{?)1znXpV@8h~t5+ zNy&v`g`XykPDw&^^ivGL9#A?5fL6~~q)vzc7hZ0+>kT01rmA-+t!rBro4q)1At+HG z&3eotDb!I}QvH9F!RD}$CBVZ0?kt&a^CE7nJ%Jd(w~~RT@Imy~H77fDvPqb-hXhoeapXNqLDAZXZFx?lxhL=`-xSW^^ zLBIqw>W@$R{W254Jp8-3VWr23P4ai~{U8T7H?$euJQ>FpH zyl9<)=c;k+eS;-a$kA-KPftlBsNZV1OXVxEK6pT9@_VpvsOM9$U+W%y50w4){62mA z>4OJD@8m2TocLJ>29se80s?VyD(sJ%7kNU5y-?3=3LRBAxcyFD#Vm4v30WSRq3xyg&qP&JVumh{6iMi=Iyw7(&2L@u#&PMoy+b%m* zySrVNXDU2TP6@Xr@+oiwKMM^1=p+9>eo3VA?%CTQRKs;WgqZ1|A=B7n{_ac1T|S6j zTi!IsVqRrc6%+~%2y_xG`aS2dZJ}ijbdOrcy|7pvF9#|IMQclM&%*d z3Rb~K!$qF+nT{JX%U@*Vvyt{KS4%59BbdxOVNpzm@Hs1{&v-yS^!xTyst_%(i4#$W0JUmv)u__UK=ReE}H#%{d1{Q zg~`)wMJrr}X?C{Z8j%)MGdG+j8bu|r2+Zlq=ma{;FXQmJFt&Gp|K7ev#|tN&WKwt@ zF5DUmrHUqcezuy()4j^m6Zw{jSg%@Kg+aV4!k}6V^yPZIxmTNz>_9A z{Qq$F6;M%r-Me6+Nc;>$TBJchxS^Ki+JxTZIf_cy2TG-K20N- z?har2T)Xx|Mc}()z_3OB$?Vp9$b3Y7#Rr;;WA462-&?@tAfIeHbPpfRT6mExmiJ$- z|LuJ^VtZTK(J>K*GP${D|8R9>Z##hnEB_e;^+8|mg##m4*IVcNLSVRAU2?R~`Gby@ z?_x2=%B1Mc?H%uTv{izZmlH+XKB#L$Y8s&3uKJhKdU}$r6K|*AsnpsV04`mH?J| z+C&T7kH)QM%)M5f?A?8IPim{_u(#G%IwqwRluE{(HcpiQkw{6mJmJ7LYq!z|dKj|% zM#P^WptQVcjdbR2z(1VB6CTMxK&Ip!vhQYf`LZsr^b)(l|GZhran;Q9YkCZ9Xh!ND z1c?LK=UDlStkqQor6Zb1r9xGgt%+2E)P^76Lv0#4UvZ~u>wQ+vdZDNFa<+z*hwp`M zix}fKP{HJ6f?)^R<`Z0B{yaTyQ@0xg+F-M8EdN^T{;6Z%HP;q{UnFY(!`H%t>=r&W zRovSx#$|PkCsN^)tYoBr&{7D&ua!;NgdGuSSy2UbZQSoq8f~u@nDc2ux`6w+N#(#y zy&NqT2~!W$ntbY-_MiSj&|j`V`ov_)+}U=Afh9m9)n$C#24iWWLW_w>+8mriUnYJ>1qDG`YQdP3Fx)Y8RMQU6{Vf@wui+a`b1&2G!hhcGtU0qPHfSWvA@k<- z`+sh+)Ik>X3Sy`#m@h5%v!K5g37I(RvU9}$d(O1OAdt_CixrX(XjNP8f%Z+>|GN9t zkQdLRZ~XYjRj0C(Pr|SiTL<53Ja^qMclq<7$p168C%W>#2cNoS2(PO z32p|ydX=~r$zUC4o}K%{Yn>A-%^#^oo|;m;f%Kwqp7+DCH!z?V!T2;C4yN$pSN51V z&ptr!(+VVN0q*LQ@}mj*=oScmR~J0N%9bZDf{MXzMqL&)XWVsfs+od04i_tHxVvDf zYqH+)0T!VciW`lM{VY)^Av*IZmR*zeL&~%g&4zcuFb*`4&7~WWeu*#%zlVuzh;rFu zclUXlg$O&!orjx8&j$P7*=dtvp_&>sXSm{t615tgj-O$%$1&#|sc&FWWM$pP zzq1&^+5nX3vO!ivGQ2SuK`+)hdnT(R*eF<{Q}=}#xnh#2u4AeO-9^mNrVE*S+SGp= zV`XJBTFDE=+C!coYKGk_k3-pqtgO!Y=+1PA3E9~tBgy*CoDq}Nrg!z{_3Z(DX@^F8@(}cUm<-<~_5)9WjPGsSBm4EC z4K>gWN?tv8Wpe~~N|w2=uXy9osRH{sNqBrkX6rSq17~MeQ&&rAe*!)Pc2|IpvewzZJ?k3R2!m_!r6anzm6Ctkm#bKk*&Rqxuw9IS2y2OHf%P?d&{NXYkz`D8U zBzgc~#e+j=1GxRdEb;6=`u9N@zyp6DLh#nIN$T%BD)@bhxdG*L0D83sSMobsi3OiY zgLjP9qdnu#MI6Nxbv@qiaOiys56`F&4(vU^$4S=pUa-w#J z6Oh1L$4iLR|6ZWWb!udc5Bw@uX zU6$X1r}N9o-R?I+(pu8YS7^j=$_cBhtZ1^Vgq9$H>Ds9l+7>0KwDgmM@0#zAK<&?{fYGydm~h zOS*8S&hEm}w}jVy&Q(Z?U^g4Uc3{xz&kXh;nnYlY{A;6Qiy`_6ezpQR!KL>XJMDda zF<|jntvjHrK8Wi8!NL!VUn&mG2f$hMm(S%T6LYuy7=Mxs&sm)SkTeLn?&!$d#jzsB zzPJ3~fq=^zqpX-g@T-jPwlg3BX|1jxwtw2z2prn2h?%Z>ce9ZKXYNQ5!3c@;0kb0! zLhPXoU!64H9U{?hqTvm@q%DW+Z+{1_kJe(|H)vIFkfo$vNuHS@lkkPP(S860lJmK= zv}-bbj>Shv);?q3)SJllxj%`A%0P^YUhI&+(ySRqK|@v5?lm|^lPF+K$z?XMk`Zu5jr zATHl6%EW{l-5GF&EH>reewbizmMRh4IGQ11G{7?x-7qy(&d-`kG-s^&HOWrJ2S&v3 zb2*P8N<*=`c)<_G5MvAIo{cy#LgHu0RE%e=8;o5s!z$Z>=JJ|YeOn3;JW z#Ooc)=9GxvA(V!jHF{Vsk?XILd4KyH?dOI2QBs!(Ik(}9cq}0?f6Zm+m7J4|<~f2F zG|yJFkI@zBQdA^>ufVpv%DZE(n4!2gLS{dvb<#JG8jh~JY}y^{NH6&hidpLIjfSHy z?gOjt|0a+CeCjJJ*xKGE6Zr%7KRt~3$H~XyCfbqS^v6$j3hRw z@@m{g=xtqiLRR(xbJnS^yARQxOV3~ccXrm()yr>GGy)Pa>bC+K@}#mJ{FI5KkRl*A z?B1K1TnM_cN8ygg021)Y_7r;Ns3v1jR%-y*OOcS+;Ey*PH%r8y6$M@O7&?SWrun0p zwzjr3QOH|p)PeKq*{SCF)?|6|NHixUslOOtEIqKZD-Em5TRm3*upMXhJUQQ!a3QYkwcb_nu(S48ZvmQ3KhTXL@(WXdkmr9rpQQ?T~wtft(YN(ll}KC!iE= ztsHE=_Op;3?sPijw$pg1KJRrQ{(V(fUrvo^U|^s>t#XJHPKQH?mf0oq)}~bW<{&mc zE(my;??#;kd`=&$sj0b6AlIF*OGTvoszX>UhFz>+?RSx4DouEkwW?1m1vh(TWJyH^ zc76TzE1cn!cps-(zJ(Bwya*xKzDgMHHi?m8v6rd8^H^@ma@TolW68cZUEk28-A3yd~F9 zqtG)P<{GQVrlzk;(a0zg*wv;za~{nrn}P+%*m=$fivb2oBlIOnye*Whud6Gx{jf*f zl&NR^^lXB%%ka5obhL(cxf4Db+fNu7DTNKnL^SW;A5c8O8#MfgZ>@cL*%wp8-?+2=IZIz(hBH8^>3qHXL(rlK*Qz2kvI1f;tumP<~XH zZVvJ+*kBR5^L@nI=wk>?s(rgn%F;cUm049ae=ci|Wx$Rbe82L{iCG~_eQEW#*?4E$ z=!1YS6;8=rVvfttMb3|?*@YT@cWNjWs%n%#In89La#}YGvi1+o+L5UY+BpTS^KBHh zjU#6V9x~A}Dv6-}xx}xafFypm$o0IabNVYj8E>Ugn^`UtbIU!FwB@6#!E@tPU9*8C zxP$r6dGrYe&Ir*Cfo5f?C8it0dKa#xMm$IK-PvZndGoC`u|!x%h@3OGR0m=F?KgNus>}S)Hkg$v8^z z&c9vBPta#tSKfc7KJa?uWc<{)Kaw~&yXVR1Suz2wF4|{LTMPA6yCN*cHYDvaJ~_rX zgn-UsEd7*E9mvyWWV}R9AXZmK>s>#oX(0xNEx1YDcIT~~Q(Sv``#TpFB5j4-D=$OG z)eUM&kGK#+s)_vh*e1qAAVw0hyNak^OgwV$76?8=#PSty>dnobhw7+=Rj z?$c=$(diXcGxK4~a&dW9x!x93*=F@EGfhcI5lL=umr65QP9+@a?TaagPQ}kyaKAIx zaBr>4|M6|@SV`UV-aVs-52uflb|Pk^-a^xVn|HFtufYHIWnK?E27s*^&A{s zS6;n~&OvvheO*GsSB^Q1`8}6!>x<4G)vwe0%^6%IF~{;0nUr-J4#hYe(9U^vMn@%0 ztns^VO~MWbMS50uH7bpz$U(ZzZccE2uiYH$)C>l>T);H-xhFR-Ci5)ZpDPz>v#01p zUx#WBY@(Xt*>pO-zeJt7p@@Bu$00JRqP@v=X+PZ=nq53{a(vjg^ZEfLqiIwl%y(>{P zez2-T#cLJDUQux>rTKWb${w@@5D04EKOE%!-7jBo!J`uw2NRpAdTG>l>vv7Nfcrqh z(FRG|kKZR5!@8n0e9X+zBvj2kErC#=wIEZbFXG_f@I*)mUg$4lB}hrR^GugNlvT&= zFUm)~UCy8)%NAkRDZ>Bp=3TRjlZ5MdRHCs2+gaa45C<~5zrH@v)k{%ge27QE`F()( zvpG!vXVCtM^KO&7xj7l|ezef^$6#|uwHQ=~R6rMZU2j{ow#qKa|Z1h62i zJcZ3#J&Ml5#vZD(>$y>67X4oREnk*=zPP;j*3^?khtF5aPd*~2xi~x49(w-eWm|~z zZX01n$%xa|5cTnPePh$k-yw49O7ZO4K&pW2BEJrwU7_kzqADk zylL#ScIEiqag+A+){`SDRzQcp`~B@9l)siD^HkJwOfm1H!`9=`X^64U zo9DrTB8Q_RXU}M|29Aj&X%?23_dGNwc|NOTC@R9QDF(K@@X%yLT_8JKTHg1{@aRCc z7oiyMuEM!Z`$h%O4<<`;zOxpmOHp0jP8v%g?b2R1C6&bUq9lyUn;o>lc!pWD&TTrw z#%gf0$ECWK`J3Sfa7_ zrdUjgail(fJ^xJAqU3FA(!nrwm5xMX=)_E>6!g6YD&<_rifaAli+4`accq>N)uxG_ zTL_+nlSo{wktNx#)crgB0z0DF{CwI&;sl<0R1UNZQ=)+-R99Q&a{JXMD0i^Wz-{W+ zG|1+11_t?*3K_H?WS!+B-j0DiRk&oJzhTJcy|h0+iqwDe%HRGZRx0bxe1{rc57cDV zhMKSYULa}e#UJiAB6G(F(S!^3zfOk(k;iZ#F`)GybD~C9%+Ag2+vZf&rR%BY4Zxp} z|NUku8$JC;_l4vL{W9~58e5y`s^LPvu47x)hlzjQUEdAyKpx_P2Y>6#0Ev^KqmNm4 zkIVveCFEgNcJ1T9mkW4NcL2y3l7eDsUyxd4FyO+(l<5fmVbRp+uZ>M|ys6kepKY+` zu*}Vg8-0EEkB(Yxc$L)DB>eQ*NL@{vd;yTPHddFcre*X}lw`dCYjS4h!C#NV)Qf=Z z7alROhM-GhO0lThvSJCx^$#DISlKe`>+3z!G%0Kn+Xlt3#4uR*q|Gt$NaY|E*F6D*H>Rc7rF2sJxjGIRK9Au1+j z(0B-5yw`NZ9w4s)D>yZd@0w<2MGT~Lj?bkI4gJtw0_=hhf#SpYEM;2PYAu}^t>R2f zb7GQXBs^Z59NuF5Pc;7bPZnQk1Ik)w;8$>(jLes3rjl7vVMnUkAre5+4PA)h*^oIB zOjXmG$tUpe@VfTZhx&8H$o;owG^F9ALf#kJ#zDc5mM%D9K)%~B*285`>m2nlrjqO4 zJtaU}0GVi@iSjb9i2lj*+wAOA04y)HvjeC&VCkycr)VU%&9}VY+k2y{J2$lHYGRhH zq@-UtHfzIs?;c5TNC<;O@J$obT$PgX3Ee!wn%+`&eGTAMw9+`ZIJJN0`nZn#qWx``b^1DQN2@K zdCwDJ;a{j37($)Rtp+Ry-W07TCnR5gk=*U}kcikp5Y1n|VfCtwt&GwQ>~kzMsa3Hi zmzUSUSFjo(FJ-e+RabYQr%sDrdD$>a+4F_hkN(A^jVO23U)2F6^wg#!^?96>!Ym}oag0Cko_5Ieh4x9!6He|_r zB9iVA1TdvOIM}dl&{)BL3^wyKNNK2jgPHXs>8*$uW2+%Anw9g|5(crGtEM%~mmUpx zr4Cg1x>U=1chrpHrlh2RZ`D3HNR{*I^YP-wOj6CbMYWo$hBeSzeWldp2E!l39v{~R z!?Re~4wosY(9S6y-DF~CFCl4=qdg`d0KbjwSN3n5E@ZyEcI|egMX0)tgwe}pIry8~ z!g{1V(t|} z;2|`5xZI#!h%WpLrjQnF|>|8M_nsL6qgGz({hIKau?VY`skQ(2PCU3MptskGE7b^p* zcFKTmzEQkzy3O3E?aAq|*RAb(JtVBXWj<}@BcbtX7$k|+?vITv$bvvl25ZK%Msj^I zWTb#d##`f|8?uZICDQ+q`K=c|y)6^HtLVprerrwzUm&=(zh@(%Re)qR3|0=#t;lTQ z3Q%FA&1k5->Ec>_Txgrj%u1Ko`{h7;C1GU3tTJ&d_O2YI811t#=J2Hcb{AnCPhczK z%jMs9Je(^khw@n*-5gtBbJy*u#N<<-rZubGEd>q z(o0YwsM@R+%C3WJRnrV*c>Y&vPd{9Pwz4b%9OQGxIC>|Z$vOaY4zyJ-zDxpGM=4~! ztBY*3Bl)Hui%`*OHOFH-xx0%0J|lsVmr^I!1gO`YF5c(4<_%@b-t)TQht^dkl2l`4kyRwL_VvzA{W96qB9~H^ea85`n!8 zum|=RsiIQ#bOG58X!#5mtX_obyf!!&cPdh!udS_pmsi*`m<%%mnfy{a%BvUb?FqjX zl$N&k&EQBeFtpB8b%;IB?-{J#5qMFcn4vuN``52GEbR70qQ}R_wcZ{hy)!sJHyVwz zlp>Rp$pD#wU#LNsXa3jFL~U)I5@@iX^b-808za$#JuLrtxGH?ZP;GT{Qz5}l1e6xn zRJwnc1uVN8xA@MqZ|}RqAqws(Ddf`pqesb7euQ+-OMD;RRT=d>X}#&k%7QS|B1tzl z-JfyM{ci?ndeXu@-=@a3_4Srzl{^7W_0HxIWqld`w%h(PbrCm{?xE@5=EJH!DhEbTpBiQh#*F#>~m%F(x7U!~4#K z8;6T`6`~xRr~o*9MeUp##qscHy&k@U0hl@fn60KpJOIPfx;hbXI->_rKmm?9aXoKs ztlT%N3(}DrZUCsIFTjg{b6Tv^&^YWXX26>cz~n1mY<^xp9^uUP`+E*-gzhk(Q5G@= zOFF9=fBau8RAWoX*~K`oNF)QL|F_d6Z@@sMXV}COL)FHE)E95~@YjWldOkBekkSIg z85zlG=|1ZNSdyu_aj|CePvvwU^kXWR=Yle1xw0;PlLF)cLWzA}18Qkb2NQ^5`bO;j zcXDb6y*|+&8^G%h>v8*6uf;~}@PEW_ zSBws06Qk_UwHAa*>H(E9UQs_ZI8MQN*=fNY4f^vWcQeX&P*r;NgZMy+$@)GHbw&v` zKZ!qipneF5MnMLpb>?-ZDzmg~(+ki|O0iOg7qn0N{@oCWk@fTp(5|%JY^9kV$uKq_ zi;DyLaOhHm4xGGhD)H*j7MZS`kg?EnB%k{SvlW@_jXIg{20f?oht9(cpZSdgJ%@ zcF%Wgz8@}UUiB``ymy*Ex;VNs4E1~_($eBZjwZi!-8Y9q5*Qd*n7bPmJ7aHDCkfl~ z@Ojld)lyk-Lu$CMtK=6@abOb=%x-MCf$EIWL>ZWc1Ea}PRkJW^=}vZN7_ihr1kiHme)Nn@VkwK zY6*d8<5EzlVCwvz7`anF9q(#rSD4U&Oe~N>s0{&92#32G`Z(W}eLcG(y68pv{Bz%C zDWvQBl=~Q!aOClBcfpL`g^;+b7WkdBZI3>eXN0Jze8-v1-z~q7*K6(u`OVg|9`{sNf?b{ z)T;A2avOF)R3zXhoHpzpxxA8)Mu#@Jmds~wn-)s<9}lp7;Z5Kj!<;Okhzyh>*2m~W z!$NPNc5Ar|MZ*cTcZ~9_10px#irB}sa5&TqW=yI;iXZ%amGN_6fU@Z&p&3`+V&rg! zF);`})ru6V)%(h6LN>_R(UVbL2xZ16BCNqjRk7NxXPyGf2rY&ig@xQHBF+`+GmW$4 z2TryNf>osgy?uTBt_QU%j*?!?SU1l+AL?q~Ox5;&R$U(*q{2W-R0fuL<(=xXrMTz; zx-n*!XWeD4`akr`mP{VpKYaCx)Oe>kE-*wPI>F#|!T{?7@!Co*ub9ta%&d%tW?dGY zx8PfkpCh*f)J?R~L#;zTph5n0f8XqKKWUJ{A4lq7gWp+1Ln9oT6}bH}5q5=l$e7SN zN_41>Rq{Caj)dU9e19$HRm;YfjcDUnn}Q;4Qmt?C1C{rFdrVJpun6Q#$RIvW{z344 z1!4LpDfpNn{o5xH?3Oj{H`7tWMRHjn3x2XOs|Asjp?ASK?u>}mM6PHjU+kWlieb4& zG~&nfv}+VumzmsRWMo`!*sU=vUCMtiJGh(UFDF?xIxf^X{`TML0$I}>(twE)aZvLX z1~b-^b8g(h55Gc=x8~eG?GvK12GHWSP7uFZXoN4eSg-)+nH4bO5d%W@K(~_C34c9&{6az^M~#z>RU}Ibf%T2Ynlev5 z)o7=S>WA}%Bz;&z*%YFd@|8}=ukCFK?cO_Ia0gTXg#VdP3_Q)de6vGYQ>&H{aFmtt z>(@cUg>ek#gY*+K3;&I}M|2oI-Dx0Er!3MbP|v zRsr?H@a7M_B8RQnz#-xZOb9goU4D1#e1k}*`tQdwDmsE7G(H{Oqc|!7Q z#BBpN7iG`cr*89vRixqly(FpTQc`zsA?>LtC9CIO^G2icMl(u`$G5*_NtLTGp4Cga z7j35P*_i@4GQy002OoqHdhP+fxIEz2Kv}zH@ zHS;m6F#yFJZ}e2P)Aq7QrWL55d-U8ReoYt!CSK06 z*v!=wN$;cMQ=2I0V_Z#==rM!kJO1FCOxq|=nmm?`}q(&O3r|;bdTmKM16cL zAYt?r^rz{0hpvx}t;(kGb#3}pb2K(JVQuI#`AVm{B4?BH;G5QQQ!`W7f9%DW(xwU7 zt0g2D40W6TXMIu!)hajLxpJff?HTY)6AjVVi!V{EG55r^Iy)YZ+8B(0&9AjL!N9(= zWq$tP^rODs9czm2di)ti#%FahgR8EMjpX6OKfnEa5pQCqUv2yU$jx=oV!{#_AFpzE zEhl9knF#@!K2UMOP0YhN2##O|)E5fqohJ%|tC4fcofY#ug zqc^q%8OiW7W4I~$16{wtk073+1ShEnHHo~W;geH59=#oEiT!3=RG)WAu;G&0Isoo{9#C{dSv z^X4zmTUdy<$agbh4c8{LCM)U3UOU9)*(p zZo&Nmb&U)-S$9uUbI~3*{R3we70)KUhY`$l-l4J%>IHi>Wtgq`NEPL}8LxXPT(&FC4jlo>t11<8j8(#^F_$dF5)c(={Y_OE|M#K&>`>`Dg2oil@X zhr3?)b{4~W@LonlG)}O6(UXu+2~!DG%`rhCRiI4_p8KDuByoH=+0AKz%`yPs<(m&Gr+{);s|ze`KvvbUZy zxd=}4V{fb!;lzL*lc$`VDF+n?+S{NAy?vwu)3r+F4%Du=tj6=QbC-Vq9spF3$qG}P z-$ofe!tPNy^DtN(NDpQzGCH`s14)jsu`!n-j)Mc-HDBXrW%4M7yaxlncM&?9KDxm3 z#M1S1rfC^5EqctIPqk2r`B2uZE%nlmdd}O0j+XyZ`BM51s|KetVL?gAQZBZ8X2Uxo zZ*lOX?fV}?DFr$M(7u{AE|gHTR~S%yy7&0uPv^n$l(UBaE2_SM_!CtR0BJnUjfzUA zNeW10l>2Ni7|W-briAa`U)a^J->R`+faQgX+8^=U`%k9t)mT0scCizFyQ=)T_T*JAt3JiL5N;;y z;&BTH7sopJyxVuF(RTgc3Yu@tETbv<<)yP!?SDlLDdtv%XSW(Y$#@0(d{A#MGm;3q zyx7uej@TZ^Z4?Ilthd7V1{=0#4kb<=P1DRwK2D$+`wv zD$@DkCKt)cug86bQ+s>Q7yZzbsq$TG-jrtUv-(%S@u1kn4GiBVMQ$BLz~yvp<-7;e*)f$E1zG4l zEk99KR_;AuZ#J7wro#GR-9-;b<941UytbG3oAd`CC^UCZyC!2jcHVv6tXuaKZ*gIWsffO}2?Yd}YtW;~-XH4WLR<EgZ)LO^qd$h<-`!tis`-IAF{WXQgOO?@X#*C^y@7XQlY~$G{fZbLWYE z>aN%{$qH{5p4HAptw!{`a~r#-8+%^F$C+GkXejjOnfZ@PPm>G8uxFoeaXpQ^_iL!u zHZ%F@kWydrz5N%dT@U|!oPSSY?W-nGp_)pFg9Dqpj~Lq%jgofuw-DC1>jSam9LJKE1TB5p2)IfDs2MOe4!26D4}`BU5d# z$8mqm>8nrl>DaRab(z1-aEYpR2zLAodBrbUcvcc9Ly$pXONPAquHV?~Ovh;bY{jkv zI_T>q)aKb|&@n|jj#d90f1N}C&O<=7Co}Vg@-}Yk+(1N|sVOLVeiN;I{l)))hQiyY z7WzV~MT}XI<}BmSAb_-z<#?l16qJX7a>k=wsb9+>qE#nwcPM@x3mYtNIFL0hxC z=>K{&Tr$RSvXOxm!$Mmf3YHn@@AAI($`^v?kjMxhCa}H5TEQa9d0wr63 z7KTKELK1COvcrS3CjwI=^AZKin5l-{)54;Q$faE&&O1{vFRsxV1(7KJrC4+ADdQ8y zFN^uwQq^Kbw$-j_It(4}yKhZp20ZbWIL7@N6tvY8Bjo2#tLr59Brse1urMPH8)}lMi1Xg-)D(`HInVN$UC77H6xYu$7}$dZdrBd5NpE2( z+zMj(E4~ER!EyWtmVeWDNm1+U+|fd|i4>-Ngi{VUy*O&lwqoRZ~2WsF%);j-S7T$|k82`aPbm z!G~@+3s>1g6Ce;jGNK%Qd;7Uc_w-Q_$j)reC3EPKYZP)8Vcxc|KqZtLTj5lV zbkMLKt%Hh^(!oB5s{BY!)|Y*w_{uVIy1t1OAmHdE%-Lp}z(#kmb8 zP;!i6%Dvw|oX=uXsl3jOrAyDoW>!~Uzoz*rQ(1YGg6dId&hLSQuOY+PI5g86aZ7j3 zIfbOWL%$pyWzcYv;U)b=y5X|Be!xk=#x#tRr(mt;R`U_(hM=ATGYdSe^%ZJcHIq`z z;SDr=gHfz9bjd3YR+yDTCr@>@;649w)gml=gfsOS>u6`AFicifqbe_iwxHW;+`Fg8 zOPI6bT(UtgQc7}dH&4FD=?>=S=3G%jvwo#!;<{8^y0;9@vF*fzNKF5F8eOP4)B2eH z3L;Hed&8(imqSBezl0o~ezDE&db!3%v`oiLcNXxj!L5*MFxkGbILNr+>H~T{UmUeu z*bC@kexV?-(LOJ3dVUu4vS<(%5l*^%CVq=>gl{vRnWp4iOFs1z99Yj*ttfKf^K_+k z(}9ybv(RBJuWy44jTBxKEk60Af)+_vm17(3%1X-EmlfwK-x+vskIWDQ6-FaE*1-nS zeC`wlRL@-u7tCPkd@56kU7I!~BK8BAt2=uNFt~2*5r~}37zmcaPWNoL!x!=;?urd3 z#)@Bk%KT|~(sQF?+V!kN3@EwckZW?z1ck2TGwxI(RdbdR0CP~ulW%7cJBh8}jIcyR zl%@K~lhTxA>W0Y39C>Odb?!{(kX@o&jlUn3{eF;>BX4lsoO!_a!E1j5D&MsDTs5t! zX#?G2@J~`g+D@$~HSO!BMxD(Gy@o1A8kLJLUwR{&c>cu&sN!Vlv#dsGg%V#Xu*CaK zXP^JmD!KI@Tr<2l@oOaYyUm03qHlR=R6F|U*O9ar8cw)bE|puT5jmjI7(rRmv}^=q zQ{^MFU{4!>_(B1+Y|!&UZHjL6rrQ_Iw5Wo2p=xc{E|c_h#GScm+sD=TZr-vIw=2!s zMlFwiIXF@kqoSI7_>i`;<@-&`1h>BJs|iRIlvpqEZz{uhpS$Mbuy-d@zIMO%aIKOUy5W)@kJxH$X>(`s$g>S@wO!oRngpBmxHa5h+X+ke<qyKi`$-4@R+1`@fv4%_PvRYFVDn_^;%8K$Lr zyKE*F%aHj@?d{|B2dg**`RFhiF9Fp{t(!@io2-1755jm6KG5H8eX1x-mFLLFljem z%6fWMk7R#_@OKJ0{Q6;bX&XVIiVJP)G-o=)Q=3a0CH_UQl~7^n6q6x)P5XdJjdEx z3M(Zx~EEq`h`*xMVLQ(;&y z6=D!P2Z>Tfe*W(L`r_jLd!@4DFRMajmoU@SHd9utx>ava#BW))wB~prtNpp_ zF=rl$a<0?#JJU-pw;Z;ef82fcXzm_W*`|*#(!(Su&4#MLoRDgmIB^^i1V3@T^Y;_~ zwNc-Qz4u;iWRD>yo&9SKEV@{2e4Czlz22Kv0lMMs_vF4jyf)M=!O0mnndhU1 zrc~ywwwYb+<0!TDrO~yGST$gQ#6$=`E`y>WV0V8#tjvP2;J%6xE_OP*gn*9 ziAz2aak1UZ>kiVNWs22V>vGHVMcs6Rc?LDCDlLum(*SGMwScd?dWI|lp?`|1tat9c z;d`*I3rjgmY@YFc!J^S02lYn|HcfRrONP}|j3^_%&jR~O#!s&H7B z0MuT`ueoLgu{poT>s6#v+}t~$UI5D-J8+WVU3zBzPb*9qT)__@ERBC8#xQqm&SaN) z$kQOFeM+|84Ns^J%I$tLsN$s^@ezNw2x;xk!UrLt{xO`bP91f?B5*?3YbS~wy>+lT zIXXPSOsmW}p%+Xe9Vv>+wtFo4x};IN0BAHx5t5Iv3^sjlp!!z&S%pDp=b}%@UOIYY zFnjZN!6=>ds6YCFJWTP_$Yuu9i;MDu{stp5!?D za&F;&E|Y-1(kbk{ou^_*+qqA+&o!X>C~9fK!I&+#^+2H{VR)PoeAWKMatL39$L96n zD?_;YJnlM&CYr)qU|RTk8=bTg&938>$Iv@InkSF>vByiwV;2@JPrGrbW>9E-qN&HV zCn#5kV51Olcwh@%X9Qxj}_{|c7f@16N zl6HkrjAR5w$$F%4e#wGed_%*9=O)UgvrEov7fV-9q~29o@hkLxjIs&vRf^1stMLhk zd&kMjEGSHQi_B8whh;g2nITiLT1pu>Gu3K2uu_S2q)|>(kKW}N z)=rPf;+)A5UWW*d@g(9!hvDMl0{U7__Qs(Z^ui9h(`cNDi~A)uDY|fdG_Ti$(`sVt zW^{IOF*$y-QGnk?a$amyRL-3Tc1o(MI20moucEoFCv@ioOh4%Rqv)D2Xep~1US08z zcuq|nj~WpEId$oSLjVPLX~Vxx zG+rL)R6$174Lw0id7URjZnWU+#Di)^`II-RuV3rLB_wPTmNgcf%wyiT&vU#iYdZfh z4T=2P(2z{&yX*(lkvA7GXNuQxjvLla&fZ!j@!HI0>U7R$yU(8`^V&@ogC-UDj~z;y z(O!Y`-WbrD#g&;uYks~2IUwXex-o7|L^7<7@w)Jp9$`;EuLFQ*>FKF2(3l%>h3nCT zc4W56;Z?NF&Jw}3zZ~vQR8k08Xqn|sAo!sOrL;8M{OX%7QRA6hL_`PAla5}SWY;Vs zn3^(Q`I%MvQ4r6pul-)8LCF&9@@ES=QIE;Jey zTzNvjk8zTY@cwBYNx8r}-ak$6y!kWX=ljh1m+LDk6xV=TuGc21pT(|Wr{d^n**0gT z`evJ%o{;PAJ{nq0;<~Lj2V$f9#lHLA$aH8^PW0ji zs|>_;I@4U=N1o!Hpw-le4taB|ldVx5`WU6VqRBbg_JCmArffsCD&5=mx7m zC1>Rk8j5C-CUt0ga`VHx{l}R5&Bow{iqy;ypX8J$a~KM(g=+k4Wg7Rl2Pr ztet!=J;g_58uSJ!1v2Y=y{s)^B=z)xN;9|cRX=xRHU$UQ`|tXd^bELdz~@KB$!_T* z#*PoljlE915i=8fQsO#N@EX%!FQk>-B!WR{%*Kjw7ug(y+8&C^%>_$nXJ;p(CgzSe zuz_4@$U>eypY1qJq-Y5Qy`SW_-!AUt?5t+BL4rCPhgy#pmeER=U9Pi#*`Agj6g|8v zJ%UDs93iLit>C3z<3|Ij`(9^+_G>*1lp_n6V+Nu}k1SWEDv?JRk=1X9abnF(?(TeY zNe-bO2}o#@VY$WqHn2p9X7tfHnLQINt>yzevLdCdk1TX6VUO6g3R>VoPz?UrN||37 z!tXG4r`ftfSVTlsQ!_g_w9q~K&D*yVl~6xvC<>#V0&&{o(cA8{5FySCr``Vb!gzl3r>&9kJdR%}eN9;M8`X6OaZK?h#nEjg7Ca zmo=zEBB*GxhVxTWgnjv!RBWdzvZS4ThAKmtZPimjga^I<0O=zXLEww}(>*`55Z)BufgWRb210?+0 zZW8Z|xO1TfmOp>B^jw<2ybe_!B%#GH*5oUmG7Lj2&DJuf>SW=U>Ni|Irz+}^M$5Dw zs3iAo_`7xKc4jw$ksLt)jxg%IydP3J>-w(}j7ROjW2ny#3I1cJKw;rR3b@YdXrN=616=yR9S2ScNm7uT~QXm*tvu$L%o%^?BD zxVHW~qU;8BW0g0n8bTW4`wg-Q=l!H?X{HNyT~V%GO)9QSlf(G83PA)BO$$kSGBG|U z7p3UBx8!#v2z!yA<~(z&aQT;|FNi zGoqZ{NvM)1!->H3(_3<1O*9Tx=^}U+^7U~yMH=NX5yMJe+uP9f(xJvO_TW~`s;qL`2i&4d7f2f&D?X( ztXVLZ3_&_x!(MLZL7X&&#*)}UTjn!)mP~0lf<|Yn1IQ7*HY^w7dFfkpN_>SUMz?i- zx;G;dbs=nZ>zfMJvB`xy3U{AHb};o^imj%BLAOpiX03_QWafPo$D0 zJT|1c({$0FB_&qk@TGl>^eFW@b<3XKg1#AzBkVneYK0it5dRt zvw}_T^Odyr6vRzD%yFaV zRBubo<_#dWk1Kio=k{axAJO>3gVn}io#gyd&QDA`;v7NB;N>@ z!n?PRs71u&vIGs5^_l!LRN&X+VPtt4H9RZWhB_q+6C~JbejvhW zu1sTYN9LA&1)I^gM`w@=_tsV$BV*dN7Ov0=rmWLZEX|U@$)DSnW|euIb2@+6{9fNhTIrgVP~+pz zT;v~FCcW{<2&U;{fpgfsh3|t)S_O6%I;}C zcdADe2Vohat%5X{dHUFBn$AI); zTd>zzzF@-jWR3TCvmTxPs~V;GAz#G>4>wJC6aBeZaN=ywxxZ$t&+0jn9}BnEms(K~ z&-n13-D7yiM|s#_T9|pm$nY-nKid1?PRMwwBaeG+(2urdi_z*)yD292Yuf{-sWQH; z>z%c>-=5vsj|&Qpdoj3O?Cr9KB1p;>H$H$vb0TAl)2Mzm#V?_FCE<`>5ZM&&zAPKH zD@G8=#GG=$XTwe7)Rbe3#!5Ck~5=!hk>JWk5AS2ka+RA>P;}vYn{GM#tN0 zqG3Xk(s2kC@aU<{dnH&&1u5werK#+r{rMQbOQ~vy7Ih-N8x@QveC!o_z&3cSbhD_! zo*KXVrMs0+Pnf+p!W6^jm~iVAp`brIIQ!DiOCb;+Wb{Rd0*Y*^2H%6h#}dk~{AA@0 zz7w4_{CjbO_mU_6sy_Jq->RVge$A_ml@cNv*T+T(bVBhuNJQF9+tr7;4-x6#7{Fonae&vz8Na9nqo%NiM z;vNHUXs@%mU3m&OTQPq7Ot}H0R$j>oxPeD&`CdUY$7@s(qKRw7}s z*Hbt#+@6d_Ub`$0+)?=)M`L6L9=4&bWdn}()#9Z6wT*)az zZD-+Hn&yUH<)*DWs;E)s%b6B5_flOxFc}x>IL|gb@!lB_E6_%-`nFbFqft@W+M;kR zjUM0HqHZV*&yaAVaIaMsSLIF(8b)viK{?i(3PkI^TGst|g{&G^fKicG+E}IsFp;1{ z!AI1`Y@NH3s;0>3*Ms~>9Qh7h3}*x1FsOjyi+q|ba}3sBUEQnWC04k`rmXumZ)&58 z9Q(Drw`=exP8=tChu%ZC3ECI~vN0wu#pL7!mrr*HTNUp281Q88{k43vDHjwv;}j5q z8L=s=J+?Owle2f+P!0Ih5;!ASy>#v(13Izoc1H1;J8`4q^J)v1JFmJus`T;Mb|H(# z$v?zCnpHT zd{)&%Nhq}cWUHwUJF}#riK#I=w*Y*X`g8=8?A8C5z9$(n*H^3*H2zIX_0gMj@x}KV z`p=(BA^BWGPMll@$Vj&f?QAvITdHq`$Wu2^4gn={!C@4fIrPiA%}xcA5ZbBJ1l*AABDt7TauV1x>U>K$Xf@c*Z8iV5l$sGLuf~ zDBx;+fM!W+zPlmjWWUPG!J+0cO%LnHuML137_cFP5aHqB1a)|tQ2-6$X+FCcmvqhb z>nDy|Y3Qrev(wViTJB{7f(jG|#2^wXm9aJhpAE!{txA6wWu{o<*pF$4_LXQwHuvIXQ2wQg1;!WC%oh_^FRmNbjD$O? z)UNoHT4#OvQtQ0?c{qeS4`6C@Tbz)y2 z!U(Aa1s!ZeZDtG+jY@u6vD@7pLmULhcJ&)*YbWCNmtS)>HqrJbrF>P1PPW>nX`79@ zYmDpVNjLu8@j+?GY^v5K-aH=Esf@Yz0B-V1nMo48itN8qzdp@E$d&d4Xgq0n?jkwO zDsJ!9)>dN^L9Mk!f|IL4;ki`J^f|hWaD_`Sl)B1Ij7E1Z*c?&zUHsm`diSSn2=1y? z-2}_}K&r2^*l7YO++MFzu9K1RpzsEtd>IrJ*d=&FJuHKaX$+KSy&{(E?^)GJ-Vo1J z&d)~{dPT_x1{u3Je@JV5u=x|pK_Gfm|JG=#ZpIYTfGYJh`M#a+SJE=#U5c=w^Uwoz zG(XINAtDzpCp7Qe51Wrp2ZjAIlauv;q>!df3?HG!o42(OR_HF(DO9s9aX=i8b!(Yu zMq`UXXSlAhYkP06MFs^0b#!(Vd9}Zg-7qZl%6jmie{wsi76k1^r^nL|T8cXA=-ld0 zW7WkyVge{bZPmoFpm9T|ir?cq&A0jTZ&H=3-N~~|{YpzQLI&+30q?GIVd|1!)&^X$ zS<3+B-M)S) z&4uBSP!TM!9vnWD5H17eUk~<+2!d>$=i<557O`fiKgaj$ACR5D=<{5DBMyk4fBaxMF8qeT`$c?h>X#FztcQgrB&0Ogc51lb zH4U_;&AA$yIxERyntIyy0*(LpKM-9NYnGq601!yq;d5Yky{Qd&!Q=o1$7GXVvHhrE zrftAYPFK;|b&bibLNMFl87=zf_28QG=OEo3Y&X;4klMw=3TsU<$G#A@4OXHH|3Zip9X1V9dZ zFAsY*Dq_xL+cAhK`v-(-Vn{jRF>yI2LE|%ceKA%TZ`BeaJR+Q6TgY+io}Lapee_aG zRd`fHdg6Ok@B_$MZ2{%Acl~;j=%Ri(Dc2z9{bxZ2&zXm? zj%J*aYE1E5kptm|_g=eVZ?;x_$?vB5T+u$HC+B?Zp3`bG!`-Pf+)=yv;P3-RGCsTL z;Zi@2{m$^Gl)19&EYM!8O|7V$E@iT%x$kh_Yf3@#vSp-d9ea9B2jSr8p%VHqkYN!$&=>;drgdJc3y;WKnR1RMPTlfnb*>$KewE&+DW$7P=z<5Jm?qpKXD-ahbM1q1cT&YtNO9YuOW=G57PJrbbj;W! zOKw4!ENFs$TITej*|f7=nwk}+BDwz}`x20C9aaP#f;54cv z>R?}0=CY7go%pz7sWC`h$+i&EDs=h3Ndev zy^<@obJ^sA+vUe5#H6ftb%qqLx5q(2_!Zc>xMHJRn{~On{NOZir`p9~PA=}w=`;nW z*~ROy4pgZlzio%HQnaWNaA|r$-0o?O9;_qlwzUKQ#Or91GLI(!( zcjnc(jo7%i`B|3CXTVmd^XlkPWTm-J;lOVI0YL=R+=P;Rut6ny$wqh%pOvp%q7(1i zjZCoGA5|~($gk!7{|4oMlnMKXZrJ1uiaya$oU^AAM~RMKYq4M^qR z2dweNSW&TcUIzYt{FZr|#pu7tt08NRFtU*Pd^~EPijF-Z@XGa`jLfTj2fTOEBwOcCBxY*w1G zVKFxi2ND>5>r&9jc9{TXCJvWmCJ>_!>_(CGuve+4hxtw_0hKD{AAmN~WA?^*W=MD} zFvY=O#I_GYoY&YV`6?BDO>Z@^{=|?dT6!oc#g6m|=4wuu4TWpIADkR8Nn<@A5Z)fI zzhcvUn*KT=*M^ZK($^>FS~+y7O^$}CE!~bZ)%M&w5MP`Cd_VdBBL~pDk3~>z!j=s1 zz(M1f2C7tmZ%}5_7#BGIU5D`Y?L>}i=eG0q)4eNevz-WU3JnNZvw)aiWMues(3YdI zAl`gaDP`tc|0lEESzqQx0Az~g?6369oUxIS6y8YRq?ajjJX@6C26CtE zEF?kBL}m;gH)x54cdO~>2efNeX!qCE-BN(Vb12yk&zwuMu_a|?Fck2ktSr&*q3&*O zg4zpp=94;eF8EnN-DZIxqn2jIO5hMxPIu(Qlx<9N!{n7ja)kC5lSh1h4Pzqf4M=Wn z;;>LC!tG(I7I$oaDiH)c=7$e3ArWh4Cl`auOMnu1ueD7{Y#N+}E8isf>Pi?QsXXhT)tbvt))(PvOnQ<+qzY%Nc7d$Z2OzqUsWN9rZt<;cJ~&X~f~l}*#37R&k@ zoU9@+AW6u=r@coLrW&66gMIo9D^_A zqRqf!@c9cNVlP1UQ32H-f*@)7UwD&(b)bH)yo&goxfL@Rh9YM*1OHqLvsOM5EBYa^ zq_VrQzg~{AKHDAA%=f8J?3L%7zU({W&`X42#QJ%Rt|0f znSMcE4A7Stn}?}rG$$5dXqmdd&HtXf6GG{eDMsKM)(^n4i%oxDrddvFA1@-yyWV_l zuG{bkHI15%MOLx(j%>iXz?G}NQH7-GK_GK{u9d>_U*V<-uWhW+v~l@v;RWqBWgR7> z+|wFK3wx{455DwuS@@2O(S7s~-74SB)vCC!a8Ag4k#^tv7q7IlxJ99`3*iz8yV{_V z)!aY<47h6=di#e$1Y5NXP@`R1?;|rd=fqmXLTcG{WY*u=ETrS*g=gm8|6xl&R9dBwq z-u=Y0fVlA@jK6yqsD?ko#M|rkYf2&ya{&q*s7YFSGB`?sk~zM14Lj4OrZC}!c3~2o z{`%}f-2A@RS3D;dhnBJCJK1*?#Hl{C%!;wg9gN(d53=-e$o$q;7!v1@1x_6s1^j!? zpjXb&XZzC(66!hLUg7bmWIIx}s)@UMie>P-koM2*BTlQ;5^%Vda9U z9*?u_$d{(D!a#Wlz8IylvGpuu{^O8k$HJI>*+Y@48xr0`tX!;b-@Tp5`Aeku`VIg}wI3y=<8)pzL882+CQF z{+Q;3oj7qC?qMn4jMe0hyQ?6gLofPl^>ai^RN8WZx||_~m<%d~J9!zWXJi$nK8%mg zIbfyGXnE|iCATY$N_fOY7|Qmt2$J5c#k_7u#9?Ex4eL)Ol&k75)lI&wNWDJWL9(li zXtoT8%DBFTD_RSAW3BUDthZ(TWxqoQqiL(s>gu*Fdk@^M%!O)3hTV8bWLP9F^v5<$ z*EYOq`ehXuKIaMl&`c%#BX`PXV`tM0C;XobR|v%3$L6>dP=?Bba(;*G& z*-Y#I`dyjMT%T)~8S{>ui*7B3`fg{ZF|Hq^`lNS_LXWvu+DK?@i%ttN z<`bIF=<2UWr_H`Qbu{2rR%+@az+=cuhV^Au0=KS{nUV$tbEdr_xu**H z#)mIysP8t6qMuq`w&kV)Q`eOZk=P{Lu2ntxlq~8B?|3`Xhx0T`8DCz^mRP}M7yX?@ zew-H06VxT6uSX|_i?G&C+=VaWaQ<;K{=Xl61=u$As97Fo2p63RNIH)M^&lxHhGPkPcQ z?1+3`Q!zR}mDTZMdPvZRq7^3+m;EN>&a`{8^RhJ&sav&GcCL_!Bd>|{3+9G_HI`pN z;dlINs8RUY==+vbsF0hX(}Xs5=4{%>RE_3naOlbk>iaLNWiJA_H&A{l7aaLxwfeH3 z6^6OgYUcogqV#6!U1@SEw6vGl=M?2f#QM^{l$VP(v)0J~eoF1jus>haw}YWP(qqiW zm2D%ImXXdrqKF1(#&pf}?FECAp}9Cgat==}`WCMw;zflAt-TJ+x!U^nWoKK3SUU^-sSBIg;Vf;s!WR%7QSf0)^GRI@-*@!om&b$+Zofy_~}oQ~9h2Us6V>?^Xe& zx4>}8Kd(t@B(&Va^>ts{+CC~g&&$dA5y)5p>gmx}ud`B19-;IBR~Jr8%NL~&Wbv73 zxo?80al^Vj-=WE-tqvt%=t^v6H(Oz^oATwfH_QO-b zx5Fdjau%p-tBLk2FU9_)i3*Unkiu4`ad~8L0v$Fqkn|%u&*o=O{2~G&C0CnI`?R97 zGgS?gi-DR2w>o{AraO3qO&)dl#e<8)QjA2xQZ6_nixtKergLGTbnw|eSSTMOP}wNd z`Bzc;nmTH^AO-;ch{zkjBGE;rQ%_GbxTFAASxZ?fLeQ(UTulJU4HrFIrMqi;IeB?m zoi$GQy1$gXu)`y8s#@8zorgLA4VjP`Z z*Uy6P<9cI?pE8B^HmRNCCJgFe99dVvDoW; ze2Q8#bt-x$REv?{=b3b!AFDj~@F;7=+vqoQRIGnr7;_NKyKh$gDob1^hh!SVDX*Z3 z)Jq-x$RGR&7T!NcBB15xdde&9B6c5_eIEk2;oq;v>}Mg;eYqL^5`V`*=oSi_ zXDC;3eb%DZ{akY!kEMTp6>`;h)#=xghCuvk{v(EN@E;+D^8bjayB+^CQn7gcPdGNj z`e)ptTH((yyeZrB^(HH42V5S@=tVYl@7a0>0 z%VC{RSO!?93oA_Cl)Arfns>YtIdSR~uyC{oQY&j>%pnYYI3_30@4Li}+!*#`h!ayT zmJI@IQ2MuW*>h@Y(^FHV=j5a4TVfsqBZ{!ruJ&4Lxc28lyC{OO)?QH*!yP`E^;~6I z>%kjV(iJGVGz&$8N|N_x?swa%ul);Md-@4YmKJRn)29W9PD^$Q3!?IoiNPX z{QDf|t)A;Cp`q#D%4AU=-^bnne?vL=Z|J=xa7>%qX*lV{{y2Xg#5J8#C;im#%5nKT zM7@(>BilFe^+rc)7THDe)tfe{BOG-Wen(+*dH$+i6b|b}B%M2l=H!Jxa{H8QWMq<+ z7glr4WNbWZ^l?%M6LW*oRaKN~mIuWgu7 zz{0wGaxpTkve+&mJHK?=+$!Ane&UUkWY*F#7yOtJUsF3dCsi%WvWTBu@VXl5D^)LE zl=kBJW-BQFDcDp&IhvAxoW-~hIW}U1YOj|&+FyLI zwg66i@h)ZWAP+QMq?@;6@_YFqPfHuyi1zx-kaa;~ zY$ghuWB`O8JU^jQZ)GZR!)bH3ZiILHU0~2cOfw_xg}m)P4OD8wC+$)_WgSNDz_&qR z#ExqjDRSTtffHv=&(Zx>#?_Q_klGOs=~g8DDRr<$UY;XZX6Ho`tRvbdS@!)PuU@|5 z;PQ;+RA}{0AV-+SfThMMD4|AiT^q3K=DntRPVJ7oJWRvP6aV6c^u@Cmp|BIjPJP6- zC;#w&m0@-k*VNw0QrMgQGSwLLt!Z*3W%F-iI1`tKgJl_zK`US^vCd>pXJ?nj_D;t` z_4K?7`uq1u-K{FNINj$pHS&teYCCVB@Cc^xP{J)BhkJW_CxYLoj`vu@Bf{fzFJye} zy#7p4Z^8O;WM@)!;`>g4T>;x={!%iJ4tK;!UzXp?nt0c}?9eq%L4%0SyZSLUN`VSj zlD@tcb#`^m0t;eX&o|{ePb4s?Af>@20cT)Us05aKAKno^s~?B*SU7r*&CY935J%p4 zf1=n%y&Y&my%I!cZmHImMtW9dv8*o1>lTbJs@cJ5qe0z}%h%VJ7>|zVoKltZjNvPE z{1_)GCF`$NFCUuu$*7}7@bDz`|9Az0MB zkxgl+)jj@7;t3KZ#Uq4Sc zh~_q2rVEQ=I5i!kfA8`YakJNe{VZvqFaNfA^yfvJ4kK5qf4%{kkpGJ<_zh=QKp9uF z;=7(=(d(nfu{eGjnD-w@rP}{R?G1iDacSoa<*f0C;Tiq(s`pht%LZRf8A+3CId z_Qpq4RNB{VBvC8jegE9LYGf_gG@uF;?7^2BSy-jdA9g%${;NgR{y)OP;Eu`iadS5D zwqpl2UQ^fk!4iz6Rhup$Hu-fl63gFv%(t~>&IOZ3U{g@aIWL=jhH&{0#NmMa^f=k6X)gL_|Sf5`3{2#KLhPmdRF?>&i!dh zYbi8Xv3+*NR@DNQzwTA654J4dQ+K4hHH#xRb{nc8%<2=@S|_Tp)`q07(+D0 zPM3E^v?f=i$#6FpS58Q`tzT*DNdmAuIQIdyZlmxm7@ z##+_8z!6t9!s>1m_Ii=FQyd)x*j!^3*$OSuD&`aG%?={^jV+9M&%!d~Q6X1(ItE%L z!=NT1&1&O4SFk`R*?6SJrhhtA=)5N^g6_XWK$LiS=NyZ7FdU|J|Wrl-UWAiQU+G$w6&xY0`l zGR2KZvBTt~$$-N+I?HG12vd`4nu^(46&qTE>j0_sm5*OAd3O~9HlAV1mU~337`@+} zIDWc&q92!)Q=6kP97Il|`n~6OQ;bGN9ZI{b3(@&WQg@aR zc93$%CbnMdiby|OJF74#u{&0MET3;o`BSR6m}_QAMTMOwCQVA8i3y#Tqh`DJaBFk3 zVah2UTii6I?uygDkggmFjoRJ0c=qfyAU-aQ1HBw_Dy{SsXP2TTQ!F|s4X$oyukr_( zo|ur^a>hn`?ZX$Almj7Z7jYML$b1AamX495rXw0D7eqra6(8IMQ2~HsOg6-!%*-iB z>*7N==9a#GWa}{m*_PuryEadThLlvz5xU#4l!DIu<8K+lVlp-c-IM^BA(uGyvaXq5 ze*7-!;UAAa<#^}Wl7sLSG`l!wO3lHH(w~+k#-g=krrJ;DssVoo1R*sa8W))wc*c2o z?~c0QY0ooo0>t6xcV9+U29rhL#5Dn)E3x7n?%i@kPt zSYd~x4i$6>oYLk30o*eI(kLMNAIY`|50bgeLm4Yd`dYNO@AD8u1cuPzDLFFvNf@{U z>>{ji0Q?=|2XGnn*8^&k0K^etIs>w6q7*C6S=v8(^X0}3z;^Zt**-G=1UAAeR#pNH zscNiQ)YpfkUUM$f`;P^B=>lEe_v2xs3(Sd)fqcZcY%L_|GLQl$ZV4wTfp-$JApSEw zndEP2Wdk>p3;1punLP3X3Il5FBNVifi&b2j%g|RwKaR=Y<4U-R$@G*9`wc#M)WHou z7M&6y^BjQ7>9{*qSyrktz12zU+3wwI;yj$+F$FAjjR~SkfGZ|tU4V;fd1!W;HWQ<1 zwB%9NBw3|6aRfNr79gQ|Lrn*aefLCTjId7c$g*?x>Km82o?MNa%9DMs6f_N8(SwR3 zOB(4M7RK@mVV|^v6_vWd%H!Ryqks5kU*TWI9I~?V)s!=&l`~pAdnYP)V|gmpelSzw z#p0AJw!S1JRPF8D^&gn&jm<`P5zvj56T=@qplT9R0)lwV_igdJu@#k+#vt!d*M*(| zJN?iUxdWv~+HI6SgUKGXuQKTu$`zX_?ib1yH?vCv+bsf8CITzs&7}VnEu+)USk6A2 zoVd8S_w$92X2ww$&yswp#i{f)gz*&>a%lI3KllZ|C%H+v#e*xkEy^^`4r^PhR|?%L z!rMDf|FX~!2o?1on#r$biM6b2dF*ndg8F~h)2_bnHzXx}RdCO0c6N4&PYdJn%Yo97 zs=0o3a&r2@#VZb^Zu{GRk{MSueV1Q8J%66|?AggFtro6p*Hppku>>`$-#MSoK-1DQ z<@hCDqj7Qxzy0WtRLzOdw;$4qO&`6!eHsS;-8{O~v@A7Q=9J{8Klu5;p0v4BnZ1^9 za+W2QUm!leg=GGrW-|q`wwb!7ZhIWlj8z2mXg~F<}{u5IB$51^gAM+3%F4bO`b~6lg>S zU^bxyW5Jn*B>$`P$9}dVHmKK{^tZ*`77yk9Ajdtt>wHOSA85LLIOPX*&GQO8YZmV@ zw!eNp;;|c8eh*Cz2k*8_?T?A<2X?STYJ!@Ukld%fTmD15M+_f4{(0-yINp|F-)G>y z^}gOM`%lk7j#R@rxgA$^e9!KT(Y(8g*RO93@j%P`yx_K9)tTqKLObC=tcTEJ4kGXp z{Qb1LfEI1n(Ke}4J)Y9%%siU?lz z@OM`p6gCh4`2_I$s>~m24D$b++B+bmAeFOx1&;T~hkxGxU;N+y)LH-er2l)yuzKc} zwo{5jeei}8BVFC75vc^G@i9!Yy))+&JMfS@Ck!y}KijL|el}kCB=i2zCuaAuw@K## zU)Fb_UK~hPtj3pyi#m)9E%>;EgoMi7iUlriacSxk8!*(38!Xr#`Ss5IajqP!2F z$iFTlbF~=rO|9c2FclR_&4T?$7jV{F;$V-0sMq4qS(lqKvT`#N$*n8~?$c;YR_UlH zRf<~ofPKmr78baHdiMIdAdE`s6Q5G&_%{vULj%7X-Am$s90v{>Y_72V0QL}|dtN@& znVunb+C&f$sr;Glt0{Y`Q@y>ex%+{uITpWr$eV8 zi05fd^B;TbQ(Xr=3hjCW>#NfJs_z4%NaG?{1n?f4VtjVV%a=iY3xht}c^)%F#Oq9q zq$B>jzq*;GNBV;=wOETaPGa{O6(NhBUY^jPS+kzQDXE^ERXENGD$vIsSih+7r$n4S3nm(Uyoa^ptrEgGJw6K<;)|?Z^1+tQbzG&}eZ=NJu@GlIkn54W9R2 zd;%ay)0k6MdA26+{#2*~UT@+Gr5GQ<#d23eUtd2kFocxfpG=p9kjepmuPPmxjo zr5wWwuqz6y7nY$M4h_E|ni?7Jn`^hTC3LInn}{Ruhn$nAOALIcWYWw`r{k%wb~sk; z8!~Zmb-s`Z;x`-c+MUjjj7Z4KoA;jN3JeO;u+qg8TlXZsXmvSA^D*3-z7QB3)Y*>u z5#%M*%EQK^jJ=5gZpk{gm6c8Vyb2C8K6+e00QoUSQtf$-l%<`WxK(gs;@PdEn==i= zH=K)bGd=Ar(R_}|b~%?~NZvcom)R6iz1{_FgLVjXRSO zzqgRlMeNP$?QRK!lHHoP3j_tHbGi*a43^3?fZKZcB|`*d5wdEhG2pxn8W~8jgj1Y#7N2}P0m__@w3=FEyOOst)#LK zY6VR+cMG^r^N)ov=Q(2}+8KGPZo&HUoiPSmoh!&HQ)j~i)4V%1l>v8IePjA9-qQom z?J=g(ifQlgO}BcgUNCOx>o4Ip!L++q<%{|BNt^uH?QP)t0zys~zx;JV0oB3B2NqkZ zXkVZ6Oo7;#lkh4)N3YIYn(zJ*V;3G83Ukbj%IGN(_TC&21KKm|oqKX)A~G!u)}L20UKae5*qL^i}@%8!RR zt*U;I@R|_-?ora@ryidfF)^{RnVFl+7pfF~PDt%>Gn+$?FUPny>%DsYa(XLcUj_A1 z(xQN2dIs!MTt!)FX@11y7R!PRF@&+^$5XN?4<0-yvKf)3og2)%(<{Ot!U@M>1^DQd zV$iaGlzHajJU9U<;qc)jMLRXrCRUam!^!@lI&kNK{QmwvO{9AEh4Apk zmS#X_$*Hxs14!K#m?yylb68zvhe999P&S&>2R(g9sT3;C(5+P^*nuIiw6fAHF~foE zS&-}rN9d-M^)WOXmV6#8KK}MN-{n(f7E|glR44)JE9nbUH!*o7o0itp-L3NWEv&E1 zJq5~f>y{n>pxb>y`w6G0QocKIu?s%}S!iImJL6v*hF`_B6-C|U-KvO|8C+S}fn$GPkQ~QLxQQ>rH=`-y8TQL<__g0OQ+Q z7FT0aGJ5By4e}2KhX3^)Nkhpf@8)fiYt>B{9|Q0Hm(#C1pNzcjEVMX%q|4gEM$JPu z;tVrSM=C+%;>F9^7wSWSY$djYD5sgGa#1=)c*$bvC}XJ(o0tv9Ap3o#gt1JOmL z?!3KVVpBAUtJ)*hF}=a#NW;lDn0PqL67_v{I};j)?N@bOCWj7j<2_4FTcTK)!_+)a zoY*EY@rb&~%(H&)>|_bs`o>JiUwRu25*lge2hz}ve|`3ydN_6`4xQWa>H9N=@c5+0 z0)>5<=W~oCP7tZOo|GgHQ-Fg~G!o?UB)f{dUW9Un#+eKwKhA%;?Z*{-(CvJEG1qA~ z8JWQqYG(JMg{7WZy{*k?gR_RYCQ#QBNcLTau~wGQX)vE!HO_7 zM~yIOR-LJa*VAO>+`Wfk8H!=;qbafq{<*p(kD_!^)`mS78YHi&5;!Jr_)>ZYsqjecJphXLr)OG`6J@$;MpBCmTwv5yy|- ztGLI`{;+b-2QW@y1Z%B_!1F{#Q^%^^+l}5ri)!V9@;@L)A}}y`1}7nSM~z!aiNSvR z=O(hDKo$V{o@Douy67J5Vf*LH6r^fuP^q!s?~RR)PfbW}Cjr-<*CQ6r?3MURA!4${ zb3QCBNh-nXvpTA)%NQ;{%?`4w8g2Jic3;!X4`#%cKl9kJ+tcESRLDSMu=t^sAj$hM z#_l`~y{E~x_z_!?*fVov_%$%@sRQ;N3%UA@3H-1THs!9GFApmAmV+j;vF3zkh7Yl~ zU_e)>HD+qsXyauWyK~#qovj3nTJ)3>L=dX?q9_|G_e~mUdXTi!OpK=sxnrouHh(%!{`F@s zMb2S0TmkAWTIkG)w><)BvG|f*3Id4@oi>jzA3GV^RV3m_R7LdD6`zq?ddtFZv#vKc zSf~&_W)g4vGw8gCIKX1nx7(}>E$0Hb#wM7DrnIQKdfF0c2HmB3ChGJpul%#x>`e|F z&D-yK@S@`6FMc2~K>QcnehiUS5&Ef&!0*dffaCJ(^*@Tce@Os7bakY@tV>A7?0RqPDC2&nhq=0--MK;i0Jk&l+k|J^UE5$X}S3_ucl3 z;m>Z`PsN@I_*Pj7dOlSqrPvwWlspr2UGv= zm*0~hpbyLS9%{b3G~f{cwIIZ8a6)f=uVsphAsCZ(L%rY@Q95S&36k!CY$^%vUzdx% z-6HQdAWZn8C=mx>UqyW5!Jy>7?=~3AJbJoKyEhPyFUosxT-8FUqcq5E?} zWoC6O{sW;I-(tm7gn03tps&>+1M7%iWYC*H6bK^XbU{fNgjHd4CwClBDx|Kc!jGRm zI+4~?B-awQw`lgJ-i;mLVo}Ek#c@gM>NL5)wVj21M1pNEzwz$BeW6n~d3T2QSGP~L z(&%{ODC(|Px&-g>aEa+|g{8ZdorVbC{5MXID~D+aJnK^gI@n}vlwd7rwf;h;uhIvb zp(|F~U9}s^5EsV{E1TI1aO&Qr0oxFEJ+`ZSQV5-9lQs46@1X)ZjBB-3`&xrOlKXSM zT*6RI)auOsmL#mBexV{qfZ03K8!v%)`0#I?`X>5>Jp6+1BdO~(1zp`UYjp7l8TVe* zt2Yit?eQC>I1ydkExg9{Cr_rQXS>#$8P|pniaN@gO_*=_b6vc8E{P2TU#Q$e1LPJ4 z1)IV2ao?XsKKSwgZm63P8Sjm}siFx(`B1*CaB_3BXBIj2&gpxM)J-^lwoiciS1x1i z*v-BRgHQwKcf6ckxv*0Wqy6<0t_$jJ#$7tytnVIm90?WAE!lL#;)BY`+uj6Dyh@p~0Heio!aagKWFL#Mp)d4pYO(s47}$piFb+(yfo}lPQfx zV;*}ORT>~D37tv;?ip}v;JS{}FDNu1l`BQXM+2C}=}Gf$Qt%9Ryq1P)*0(QPq--oi z3z-4kW<~B~23W^QmHmYHU9v_WcBOD7#I;r0 zuszA2vX(bU$wlfSo$9@5PW@>A*D|^Hq-AFY#5Skv2X{Sf3~*Wmj+AW@nX<@YX<&G}l2E1?dU{k8v8{!Vu@07UmG$!;|fHK6@7cqi(gAT!%_!w5x#A zrxdQnBNoT+ zxoaZJ*p%XO=VFAW3T<>RGF)_(QxM&E6$X(Ej8-K^fY~SU830RG zv)X`)2PNM;<>k&WYiSsz9E|S4$P?5Jd12As&G+UwHuWU8GJM-UplTa0i*F|nus|-~ z`UX@sFCEyjYN{K?cfkS7xkp)?qo{#eE&%2*b#MKgGqdDQTrOZmsn_S#S~k5{_lQ1q z)HLjzqDYhzfTV!9h;_Zi%pCTh_6z^BM*iRgVVHyjn?V2Tg|z&CSqZvy0D{YRj(e=m z__AQq)Ijp-f-W7yrF5o#L94;}!{Ha1)$Q%=gn>su3qC!KkpM{HXd|H&f%MR-DjQ3a z({u!-R$S-QovgE=9HN5Chn`DqZ{zmC?uE&z%Axls7hg6suruXlw#C1Q%RbZmta*3M7jLw%R&I=K zm9$!Wz9>>J`-ta;`HwCO2jS%HxGEG>S0fBCGs)**1WWVGnHZVV5Cj9Dvfc7y7Rpqv z4-X^Pt50lgZ-eZq%%ohc40MQR8TQHWE^eSLBq!#8#yZfF@5@)eG4n5M&w#`x7zam| z$6|ioR6^C7&~$M>#m4Nt6kDfEEQ7fBeg}M^s^2a@tx{Q%vL~r;+wWIT_NXVLF*(G$ z`zyNK+T{<0$S(Cq7bv`gTM<`6;;&CN)z`~W`9FDNsX({ERQXKS>0C&bsnOe-X#Sbp|{|;t#$E6oL1Q zi*Ka{2vu4Em5KfF_NIWz*ITfT8Qwj$rQ^pve%Mu|RaalL(ZQ`ZUcL3N*=l3z!OHg(-FWR;%=x9{Gb}o7KzcDlH)ZZQ1|!Osps{T==k`n z6_jnv1e4X8+``OajeprhQr=`Aqe6dT)_!jx02^t9x(IwdK>Dswd5yX{qT`A)fOK`0gAi9Db#9 znr5K;TWR;?p4?T9l)B`&{^Eb_WGu2nJU2D;%t>#J;)+>oy>K27Fp6xBRlcbMy;!^Q zotrw0jLw6Basr}aau`WB6&r5uiMf4sy%twDN_sHRD;>L`_tL@8aeySSQhlEAD?A%)Kj_@9#!{4b{jlKP)!IX6La&Y^LUv*Zi{l5>tt zrjeX!a?VZ8nLB!|v-de?fBQVo{hoWTKNO*vJ$lX>HLBkCt*WTd#FiV?g)c!nAg!>{ z)m^ptFY+D8F2VoJSTqc38!-u`KhhyQhKN?_-Katn0&pS{4#_8s8 zXwWH~JJodAA!knv|7zfJ5J7<3L02+<)lS3ZCLtOdpc*%kIIm2;HlD3%Z`hLvBIU^0 zIfGs9uY!sI!r`IK>I0ia#>%zwXia$;?G%DHH8RMz0875Sy6KoPMI!6Z>^C+yhnd_C zg?JM2uDbf%QZT(P$^a(IlyzPGZof5Ltn2q$rOE6zfU%DhFOmu!F7KtM8?0g9>?U>* zqYBm8VBgJ@>Xc9luBkmFqbH1gy*(q%)LaZNS!IuV-#*)(P74uK;>m*I+Y??Wqd{@v z(1^U`>$zkm=grA&m4eMFwX?JHoB^Eyk)1+$$MpdW!3&RdCc%qkz4Yj>4E(R;xESFQ z04*%Bx6fUY4xMpaJPIgaQ!3oi1f9vgk0TWaidk6Wv2O~`2Uv>zgZ)C28yaeAcrT(1 zR#(>ReH6d-v{M+OGJ>MjZkz?r{Q$;!)O~Z^r&Y$ciM#9!jP%;%vemCRzG!G3je{Y6|{mNQ<&Zt_i z=JzTL$V23nH43;i97XMFr(4u9Ay`ig$RUkg>Awt&djIsYs!dnCW_FRvqImr}v}Hb` zp`kECJUKh3Q;e)IPhQoy%kgBo*fc<#Msqocf{Ez7aI)4pI#^MGUT-+dZGKv7@8ksO zDH>j0tF`)but4>(WDJNnSDLx;pBAdST^${8mYvb{XyB0kzqR6 z0@bu-AN+ho%8h-_0A^8*oju*{zm0n>u#l^ii!O* zefF=N)e6isYQ)n;g0ler7B)OF0Tf=&7ss#pWnX4rT5|u);wz$WkgW?eFXsb*eSO}tbiOx zrsUC8R5?(0d|C@$J~0%QEm1Rz4vurJY=KIAesMFD}OZ8hY^5t=D_pwXHmO%e1<5ayGG2% z7iUj10B7)&fV|+z*LKiaKgHc00>8YZ_-b3XU$^+SW}OC9B7nr~qEAawj6A!s@xAGE zmBu8ed6aH{h}+(m^guB_DTqnGJ?vD-w#;@d`{uNqYWOO0pjIh_pZ+-oJBmx}*)(1;TuG<~coBHw zq9|nE=y%tP-V5dZ6a0S6kavFtxMfP`J;8OPufjw+m#x;@R+GS%_)(rM11+%zn-|!e zCh;kUi&on!vA)j1kn42{YEgWF{TSJyp`*neS4G*Kyv4e`MZL;N+sm0Uv4PI~o4gJ`r77wzf(i&Cw(=#WsUTFP*n1nov`<5-M?Z+ZNwYg}Tq zMVp+p*61cW_**8s26|?Newg1x{iX=_y09?eT$t56^M!P;7{2%f;L+2XC-Cy}9yalr z=PvE09E_5!@pC;7syRvViAV~i*3{Gl6;_7GRlah!qnv|!E=i8d+)#sqL!h?d5W&Ed(_u6M_@tWECZC9?&}zrg+S=bZ ze$oZpK+TpN{CEK;>{peiLy(wMgB3QG+D}hUVGiYdr>jUpaJy-pE7h%6)pLi-*a0gd zD{hj|DHgJp7P%w3ab-eF6})SK1f@&}G_V)|z-!mbQ53J;ud$(gwTg86nf%sAugbKy z=v^yZj*GA=_S+$%ZHwlMFzv5dUe?^hdzijlD@R?Ebrp{?4k>~$)Kq@`^Q#x zaf*yBhk=GsHyG_S3%#v~pu~mg)^S??cy38j6FJ7AfX2tEIJfT($V>0QD_=JVej@(y zD6L7W>vuBpVAp-6m;c1NkLQFnt&e~8r!;*mi}7*RG7mTJV?kG}D_7UL-SWbNt!NGX z&f#@PmOR25wL|fOW9zlc)m1<0i0*5rj2MRn3h`iypMUp=OEQgs{Mknl5xz6U0pBm)Yv567vM*OE|*hMzW^ffiL+~KZ|y*{)} z9FY`{eET$QKR=j$8|#jo1&Rh#gNAJ3l*wi{Ycc;EAr8+qC@npkOuqhXZ-C6YP?7a{ zb?-rl7NR?ros->SSqIMz1EZw^HjI+V=af{;httYjuH0P5K4}kzAeL%0-$NXunPeOe zXjqCZ^VGtzVhU#m&cmqRy@OX-tgwT-)U8@}HwbQ7_Iu(1Nl~m;OEH+cm6M}2nn0zq zxQL-t;zBK!{^y}OACKMIi{7`rZ&XUU7oauOHP)zeTS+~=g_Zf<1-&i|r8*a)y`hZo zXy;f==OIf=TWHIQf%pXv58pg$$NU^>u%k6$H@`_#!p64#T>IGbV?dCt!^O%2|NHlM zkN4m^{Jp(zNoQ(9dV`O(kAB!6v5v>a%70bBbB5U)5Q49lmWf3=o=(+>+Ue7P|9&gy z1=XB^Y4{r`(b@9w>+cwYoMx;N>h&&1Ml_OEFIT6Oai8~p^9~tgX;+&JL`+OLX!4br zGtsAqMH-K)$QM*|O2u%*16^dns`~P@skw}*s?freZbE`OxStBw^X1u9+}>;?tNR}vdA~PysW6P+@*QpyU|IYht`Bakr z&=M_5IRmPnLq;<6)DkZ|A1($3LI^(iTIOY>lDdob_CiTJ(hd#}Q|szXEN;`cN+$gY z)9RSHUIj!KQrW7<8Ag!12L(L<{eIHR%i9*Xr3~~~_$j|D zTZgS}ZM6*zbsg%$D=WE<@$g)JSO$I}d~3nKL(EcGCnhXU#Z|Z(?#$xD5dAjx({h_s zymxNyWYK;=!2N2AW85|`uhv!x#Pl@T^4vFBV-gO@-d^xD+pZ67k(K znV~m7pLxCEMY}D(lhcK?`d88O0(Hpg9jtlOD)xVve6Oy7<$CiS+{Vj~0ei>C=~;7} z6uP?o(wZWAjy%tv>3Mz>Uf9|)cJXcMyq_-XR~o?Z;OMCCdcxSo)=tT#zDGhLW9ejg zoz23Ebtd=f5_4^1Q+J0P%76Qg*F!Qwg9-ETPWgpxQJb0C0`<|oMTqbxk!kyPT=@3q z+eGCH%cy`%I#$1aEbyK}Z_>RV-0E-RrlUk;Vn4-A7lH_(mk? zdB3;@9pdi<>g!u262-QB$a8vllfJi5i9p`*!((G(es^*hkDVQJvW6HueDq9W0&6jk zg@0OobL{wfQ4oWYJdLO0wXm>=_0#9hA+GP=>gWC4 z(<5XB?NN>*B&G2!?-%$=q~& zJupj=Ax%Fp&DPl%=6TTG6UIyGXJn!4SpkE%fB*hnds46fHK39%%x6(KbLfILvK0T2ptE#Rpw&-9r;i$-{k)sR5CraS9i_pteV1o_l$bm)}8P@aNL;=Cs zwW~?RTRmL;Mz$Wy4B)&FKgyNO5#NI>B?toJtzKUZ8=RN35%i7x@O{Rj67T3$-YbEh z92MneMQ%I%+afGwH`YvbcfD(EGs#IY^5p5f^9>4+D)klB)fGfRONJPFlaEA^IK!%6q4{DJxj*Y{EmGkQ#?bDp-iO>e)>2*xwtw5D zm?*W~Ns_}un}cS>`twHU^Fyaju|VTD43YGb26~oTYSq|NU`4Ds;)E@+5X~`h_}pN7!;9ETx$Pv|eM z7!77p+tlhELWgKeEiA2<*ZW{iWml3ils5+xOww6TZ)0JV>R&lM)~8iTfYc-5__S+B zyfw8or>JB%!3F0492~m0ZyeU3Hg-15P5QUko~-r{kNNs!t_nr(X}v0(<{R#_uZIUk zt= z5o~>$o=gB7(CO*fBQ75DNU^pE!=dV===SgM^^B9U%F4yX)%F?*)wT8QjEam2_Gt_2 zG?u*|HQTR^a&p$!w`owq2&f<9$-+m4Uj=Q~Nw(ZR=y*YUp;h$qst{Jpt6GNMdsRS5<HIUCn(EWDbiCThMu{S>x;BVR^suy1riKgpt0gr@zK0r8SMdeS7ha)ju=&>K577mV@KPROR+qM!xF32RQBR zvmqz;TV-o5IrQ|t@sImT`(S<(6T}&kiNOkmBo$b@pIvV@meopal@y$O08O0adhJL| zLcEJ}mpO<&pEN z9pl{GyLbJ)Rz-U=yj0^wul>_xD6E@m8Wmkyxd9sX?bB9 za{YI2r*OV(T9NEe5{JXk*=Ngoo}ON824<{`jEv%b$&!kSw6Lqi-}mMzjmjV3L=z*^ z$cW29cu5TOCck;z669hj9+E#o2k_6=D1Mfg6J0c+pzI)1NG&eq3UXI2v7*M}*VQLY ztE}|NK+xb~VOs9V4UCPaAq{z))?R=Xs@SYfx?z%C1~`oW8LJcnJ_yypPG(+I3mFGI*G942JLHOQ1HV_1+gWi4JyqaR?{6SGI};s)kqohX zFbr3?YeGlw%AgkxL6q4~;Bj6^(5*@)*I(pl^lg*vl+fEUeo@FvEzFFrV~CcxSKIxB zh>E%o+R+KxGZ75x&C_jw`%ofDYJligephbDhIw@rF;i`=2_q5(;U4vtSq2z@}j#PRiOU8OZP#H-RgG~W9AScjZN z0(WRw>Ps3Pp4j8^B`233{FAeKwiCSi)YJpBvwh0}gdN@7SkEu!&wKhF3cB(-c_g9E zkm6}f-G3hv(n=l0vb zxm|A48W8F%X6odZWYpIOLp_E{pq0z{rN> z6^g+Lw7Ip#=x?aMK$@_vEahhAzsF73o0tN&5MbHgE-x|j2#}joP=NEC8|R#1pkR#_fu`_f~ksovqVQGnCLF%BTQ(iSKJAXKLfHabIl5^#}9&9E`a!Flr+BS2hW)tkKR5eV&0Nc_BidB>)#vXse{3sl5H>MEgph9q1pwx4eCCI*w7 zosmu%Tnaj#)b13ybq$Fp@ji=`6_ta&x|p53%1+)Abvbr$a7vY@FaA0a7LlOi1h34D z-yeKzx8o4~AU>IflI4+yhLlW`>G9UMX@)R5IC`1uM?UbX56Ow=`KjIF>@Ylf>EQ<# zJ8=nCw}%u=Cpkcd`EziU^!nCvKGD6{=kKq4Ek8VN{MT>ZWs&@ROX*);d6yD#@9&lUx0knaQ{L11$J+n- zljpSZP%?M0u9&z8)=|oLoGAk=P_jS&W1+sZ2`-gSlWnaYfcJ2Cie8ql)c3ATsbJf? zA#KCIp8A`qQJ|RrvHEvS;Fd1crk{$38@~tPb=uva;Lz7U(O&$&y|GT+fBD$nqI5v` z^LJl>f4=Jf@hxznNjIHpjjrGSN+VuGhLRR22O!L8=gk$2sxMh^H08f8_suV26a;)i zU+44;{f?gCU>X=2YT41aSr*|%gt#5!_~YDnK$*j?K3~8T zs%okiH&(oRJntPIA47IM6k*-~0DaD)JqTFiTgu9kZNbxI6qnFC$i-)xOYr>vo~`CuAh;qpS75LoqLS z&YJvuW^T0kjp{<0#ZuD65VE4HQBiN{xVd&lFEA>nhCU|~vVQFXC)I0ONpf{K$2#lwn zTSWOJ!dsxPLAURa`g(y)GP0tfu^}YVCpVYx_}I?I-j+WKdbjIx`J@59Q_eQ7oF#9x zkRgtdJ3nc~v?8sbBKBTuu1L7oAqsXxf2LR%Z2LS}G&FQzY;3H5c2)`$SiHuVni>`c z$X}915`byKqT|1)I$y-JjgLu-fbT-A!@}F&1WVP@?p<4=5Vjy7kj@CRV)Mac zECkYgJPBZ&%&1S-95uB;v-tr3^bHP5&&hf0Ui6y|Krv!^j(4h8t$mY7zZgw8-8Y}j zfajaOX(3oB_VW$a-z#~>K0IR0CYU_d5iUAe725o#D!|rC-MR=svRmbFO$vfUIfL#O zN7+Z4PODqRcqoH|A5Gf`BmBVzl-^l=BoO#0`Yd8%L#zUef zEx9*W43I(lZK~DFahXN2$tpikydytq6h{)zUA5!tf8PxA;bUS%PMK|0Rn6e+WP5oX z!{&4;33G5N-UIyA(Ib>_8)6V_LXa_er2WbtJMCrzfDsf#2N^m3>XWl9<*E+yPjh9F z3rh=cI1Ix^*`!mf4fA@;wnl`hfq{?Rg-Rxi=2$+mrvI|~bpN!QVS$lem?4sRO>CJxO+5;!N?a8hN*v>_URl$;m z&g$eO$r|RX2kwORjLH?4-vZ=8Z!`;Wg*H*JlWlGWJRfa6yPZEp?E?RO^y%*eYWq$ZdOr z@jy__MP0VFNj6qy%W#eH{W&fc$PmZQdMlbV8{-;aZ`AAkiAoJpic8ZP8j@3+Z_S*w z&$6r?>7%rpZ>tL2TpobaVPJUdTO5YgZ;$OSO(`kwZk7uzwhvz)!z;1f(I>?BCd$i8 zTEUFU+KcbD+!I$V9pipS@ySh-NbdWKl9rG7uFnWmwx;WC&IUh%G^wbhWZ|&mjU*|* z4(H6k#1!z)u}m)CfAm`n8*zY+322-RF)swk;JmfSk;rV!3A(1T4848{|YL>irz$^f7#;wizSN6$DG z+&G_@NGs>YFl+zW*1oZ^(cIgMhb>o?}m|4M{hS3A6s~*|Go?~j?Y{G z1lDq2zqXyRWfqrKLR+FTB_@$(W9~h-NrK7Veg69OPU#BOBN7Vpi2~W|ev(5{fg*~? z4;_Qc43K|IJ3*lPrdJt^bP@D3v+(ee5?O*b8Xx4vH?x-GhDHbf3@>GCYDxht$o#^} zpOuC9;9ixnbA|qsa|%`&T@16HCml61Ug_ot{*fSHO#t$ngr?hF=RKJp4Bmf^9SubMU;aofV9jT1`p=0+vt zZbpr48%1)3Kq4R_f(_;v0nn^}axwrczqg>E<&*n6x|y<|_`T!3`O^WR1pY_~@hM$} zUm19O-le5DJ}290rD=(d0R$<e&hARo`lFFZKb8B z#{$#f2D}}`b6rwuX-z3$JcszWKPoK44aICATwL}bD(UU$egc+ItYe!KoA#WCr?yDv zE4^ucKIwP^#a1JPK@OR!K++`v0M@x5())!PlslbzpgvN$((;Mc^)*<#~57e_dr89=4FG-LT1OuUR7}FKld#(?ltB!=*frqIfUy z^%;D6nqXw!BM*dLfc{)kuNR*0iEnL16kAD56rF(i0+!!qFW9-bSYY!nK^|AKCUE~% zrDJp6xNv)`CI1fnj+t`+z@i?n(kw1*T1j2-JbF$V2v9@d5|1lJW%@pXVBwU#NI?~S z!sEI>!vf$Xgbur5XZ#=J-(Kmj@=m9`56>2gyWS-=6}nx^Z5RjPZ&&|slX~!cuT7{= z7G1RvRGn-{zprhkDYW-kYIRs4Wquy=bf!k4d9zhJZ3c}H(?@dGRt-vP_Mr;lcC&~5 zoJJ&3`5HZ~qT!!stF4D+w1fbCrg^neDK2<&I7Rj#15hAIupkLlK_7&q^=y5nlzyl^ zPjqmwWI$hOZSIqxPaYm=uekOLACVJz2^W}f;0%=y1z$P5<-;QLog9C4vak#88VJh0IL%&MDB$&T;55P{Gu#+4^U3%s11p1 z$0i~I9#TeGL-ONCB7oC5IA7qA1l1Z`*nwk7d;XE9r#Dg85&qBI(r~!59md0_Pe0hG zkwRu>X2$rqcmF`Jyj8DiJgPHpt=p%6BojJSmtq>@YA5(*If4Jnb{nb57RMXSYGNjH z3J{M<(>*2SsY(WiJAk*0k>)Snyd0GGkq8P(;MOO#B^G4FFhE`)y|0<`?c5KiYXP+X zE5G~>wg|Q?!Q19Zqz_0cc6awv>kERXCui^cEUqVyZ^Aa}o)(NyKxj%UPi9$K*=5X) zG9G7U#(z49UtHOiglQ%lQdLHW;FBjIF4n%Cqyro|Lp;$tyc9>^+6_PivH*#JXwT25 zjm~>G{0Bw*cCq^WFN&6HlYg}@X?`Dk4pR<*)_Z8W3xd*4f@u*Eqk|N~Z4SF*?g_rI zSj#|AY@prlaz4(qu!st1(t2@l%A!mt31aOhEkC(_B-=j=`qXk5TN(>8v4)#vn8c*3 zi>qHeukDyUGbQ3bdCGF_*-3~_X6q0y_fQN-ZT3XaAOTD8h{814{BvTWp7$_8i3iCu z*(9!4mjFWlnOPg3agL=!BZX*c`VJ^UfYf!Ce9et*_{IVOP6J3DB;s+m=}xj3L@vx$ibUA47O z_Pu*!l11r@Nv(AXnY9<@a6GTb$IQV>2?E9hT?+Z1vSm{$Dl%YNb1A`sk0WLMBr`=a z*=VEy=1RhupBEobf)o9wMFAQR8OdV&Q+mqv!bKj&RA=x!Wo2?|?y`B=ZNX}lx0Vzij7+HUcj zW2IX{eR9 z=oiQdKEh_b*%4d-eX8{dLflt193J7?_sO_QEoi{{ggCG~@VxG%-F9+z22g{3hkvA! zs%n}%@s6HY+uW?!9ry{Asg#~x+_mZU^}xVD)A&$kOcHZ=I)efRB6Pw0dRZzhcw3P! za&4O@+BqDNHXXfRpr*fZNF@H{bK^+cvqZ`EHk?(gS!iGnI%Y2y^Rt^XBXxrJKJ9ua zr%6nj{Y##nu_mPXx9N-^^Lud+)&d#0)Y-uf=|AV}R=axDTTlD~R`9s>k z+`^gro-BY>R;7|}{j6+{ zk(bA#u`=O6=<46hmGd$)Gv}G+<>wC=GJZLauQgMdRJnKeekwdaC}V{NbeIE=322p+ z9X`FXXSa4;9|&^k9@ywl06%oOyecj)U0ykISy;$SEgq8Q;^vRz;Z0168w*Ll!fd|x5@;K4yI1xtYKG_5mIjnaLQ|dT?$sP@nSuZ{c4lb8<)rD}h}J$q zpr|~2Td4HSb7uY*thxZ5Xl-pPzPYm5e)^2r*zR%Z>WqZ^hAq~Re4v(E=_tbPR(l93 zr}K?8{nv!v&V{w_SKN|u!os>#xuXS8eVxZUTT^Dobw|8poz4Zb&f)vOxbK_I{7Oqp z1SQ6#WVAA>azY}`wU(MV8@qp;gka>GDUqTn=EmJ}KT|AEB#0`Iu-i z;B`t2-pmsprsufNaHr<`yqv3oq9V|*L2h>3La4hGf549XKMs9YS=et2XqAe0n?+f# zWE5F#seqfjhe*EGl2P6=&FALk?jIiZRmlCAQq(*#5l4U%7C$;_ls94o4q^}=HBL`o z)t?+59?vcAwEJ@yGp|tsZ5oJtKhbR!_?NKiEYKWmHe54sd>v_(O2)z(t2H33sHlK& z|HW7?eMeD-D497DQEJb3$Ht3)`GO<2kU2Cm(xG{C>ij>@yZnR0?O!7!*UD59)YY=+ zn9|^BWQtr|LzozUvy<&T)0pnm42nAaLiz|6C+DDh(Ez3c19X%s4RL_#ba+%g{@C1% zoyJZU$^TK}D+lhly2-J7)L zfTjSVmu~MH5VAVHnw(jjg3;g(p=T6Ffb&5mUUe7$?k^BIY#5_r!V^A-IAd!yB4+`p zwujqW5)faD-KAKVl2H?u>w((E%MY!6$q||1O#^DyxM3@0)knqwaA&p#wB|XQxY8Lq!D^g`nU9O*_y|#ju+4 zA`kYti@2^rdxrp#1^Avp`<>fbD|y18iqyiw=Jt!%dICur2yDRxtjt8WnAfu+vP#m8 zmu+9rD<0TV1pwsy=0YdHkH0+cPUGXL{ZXO)L@YAQ?+LAp(`s)KD=#14ED( zcEJG+{2vrFXsNBm22EW)H2X*`YAC8o2+OmhxXk~^9bskE&d8ny(N%(4!Wp8n;ftsx zOEi;uYg3aF*A;=d%v68>dk5X8Qi2zEcqb+S7Qhl@RzgSQe2&tE3BU7A`4nTxG^>Md;ZabQUbl4Qk{vH;nwK>V3^F4#_?E+xs4S`kgI?pWRpTc_f7oIr>H1cqsWGO~bn z0N_o}ak>a-Rn(H6KuXizzPPp6(%1+Q!M+Hu20Iietjbj+oK;D%;7Ql@0wAmXW^N2! zxLb-b#qjTl|5u4%yEgZ|?Z}Y04I@@O3Q`5Yb@(VH#fdFURVyhg4@?gAU=y|P?j0DMcgF%OUrs~8 z$m#Uf+?6`t_-Xg5Z{lNoEX-$mdKtDBJ=21~d^>n869CMff-Q{6 zTwY%K1qP=Sr+nY&6dS7Pjhc$yKPY%iND-n@xT@3Z<&)EbJuP^=J>K@;n04-|lPhgY z#i(dD>t2&0*&nu-RqK?2Ax;!M|DKQTX|h*(^q4@vq|6uaf_qeB@%29Uh*bf43DUjc z5ry#ju2U`b`TTgaGB>vLiD*)TJFq5nka5*O-|8?ozwRfS-Kt>tMb^rH{b(l1tn|-?4=$A+1Bn>ekfTp^a(K;+bAXaD(H7|XzsB8vZqXo1PryW$Y1>R z>C-Bg^CcypT_te|v6MB$Q8Av-f4sc)$s2awPxY$)eeBg(=%?Th2>;kyD*w3JKko_x z=l=&k{(tFXw^sd<%|1om9GK_L?jI`oylkZv`&*Ln*GFwNh&THCxotbICTeouphAHPNC$SYHReq{|YNe|_{_Inc|m>~Z_|lTFR*_mo2R47CeF z1jJ?u(GT}I6VNbs1DO)KA_LSDh!^&`MHR^WLkj>Dx4#?@ic3q=^2@!TKKP;bXC;Og zB_r7&ehd^#U+8PNc%Vm34SiJqFhqAI^5T1D-Mz+i#^=NcR5 z>mM0s$=Czbj*H7xQK`Mdrk-X8Tv*kb0fX|7?ih}MiV6jgVF(uvu?-A_b_`|kA4A=u zfEPYEpt$)498L01M;yY%^<}^b7_4n?r&iQBCU`W800^Ig=85j^4SW<9DRmgXPrR{F z9h)q*xzzE?bn3Hq6Qfg2t#X4Nj>e3D+B+Ct`Gj{ioBogUVJAEI!LgFhTM((R{KbO@ zLZ7AEj~$H87Rl0mRw?r=IL1477KBULsJwn!<>(-*VC4f0NQb69_R}FkGPb!SGF#j# z&Q~%M1gTMEJ0@wx_1E=QVX`a5Ry`^u!3GwG{Y@hN*?{Z1z827@?oCOp+pOOLbsYLY zopm3_Oz`k?OFUOWIBfa8!u>mf*W*keh@NX5c=hzz6b&!uHpV?I22OzkTyPpI<>qB) z=jb4h?ZuCN#3YFC*WDQ#pBx$=_+!*>QH|SJlq`-3nULRig#*BcsT#M$tT81gCnpdM zyIMq)omoY{)ocqKF9j3_kc3IeXk+YLF78nE#rKtbwWrWHJ=t-kaQ8mvb-S8i`iIt` z(tM_Ms0$|u5e#O*&H!t^gX?mU9v#cxVK^or1Ym=IW%)RPAi;Z!@V~Rl$^jem$3Y~3 z$OVSeF>_*PeSvt;czW9oXuF8{_*7Kmc${`$oH;6d=XwXEktjc4UMj&-BxF8omHB(s(H5vEVZ_6>VzE(WI@d zODfR19{n{VU;k>pdV`0bMc&h;INj0|^4R((|*R;)MtG;U#qS<8-$;rrDkbnn=xs$m#H}}4?`6Kix{9y>9t1BKT z!e*wA?LnHhhT3_hcYW*6KRv2LlS4p;_R*_yJo%a&k~A{|*sj38{Q{RVCXiDhioajG zsi?;LNySJ=+2d1?j^jT^@aAFr2l^v`+>!)&u#Q5#;^rPMGws-q1bEM&{npZ0iU)Ts zcj>o|l8a7&Pf(?Ir=?eWK}GOXT}+tF&FkvmGTGjOBzi#MEDGv7WMp1#8?ZHDMV9;D zdqSh+l1F)bjOXCsRO~Qr1vrp=#{9JHQin6vg-i)rrW00BL$L?|An%?&$lTIqv;Ws@ zAh@*By>TnU#LN>{4^T11j42edURL>#E}O!&#^a(TNbePv-lZ6*Qt&^N@d>Xd^647r z%WA0HZv;Uvn#)|Bs@85lI^2JG;DB|f()=;OqYfZ=!l(j;Pk{5Zu_>D+G@kGdy6xi$ zlydhS72iI2`22TGP`vk6=FoapZZ(-JAr%k3#NrO>Z0P}l>GENv<3!$dI*6#+S1l@$6S-*{QUfr#C7oK%1W>8cHJ3O zcbvr6ug^e@4bYSaKkzU{od5gcL-K6${Q?adumoUdzzK>UIkO2;6kYP(6h)i`oNjP6 zd=!>{iWZKz9jLk-#m~O9oj%uQ2^t2ql8UN9-atp%W|{g5h?xM5jZS7i9zo_dHV`SU zJ3~`bt(RT_G2Af;>J5%KU?=w`3P^mBV|yJy0A$_wApy~h?L%Dwiz0Y?GrfsxwoY>V zfukZlN3PbUPeA{>!&o-MtlY&xuY=R`3ssk3^zrvFnFcR77+@uTz%(hCT((euxf@nn zUI?}Q_Rpbpuo=LuAp~ui*VormN~TVgH}V^F0_O7Ok z0KOx(r4YP2k#iwF4^{$^1QHB&DDWX8}6yq-woZ2rm0v?0TLI3X{n z*iDA5A{7u!F{7MDAbbV{YXE5Qn=udta%wb-dj0)-0>G0&ycKoKWL-_FicI0HCSG z?QOjGe;2dOCRd&OD=BpQy5FrdJPat-7eLV({#R^BZDm8iABD6p=_ewDad7ZOfY(`? zbEEI-lF63OQ*ZbVPR4)3;r)V}9%A46WNdA{xA^IwRICz1r~u&%9xU+0 z4?ui?w<&?meANv7{n>SRs+t(3^uxNz_kZN8^vO8=(tk{DbuyC84wa(#%3hL+9r zFX1pKJRO)czQp4`tbDlG29VU3scF@2TNAFc*-$`TO-!(U3cUxeSS5yna^uC1-jwHBwL5umdG0!+lO zZgefn>r@QDC*1j&Uabda_3fl1QQTF1F~YF|)=`G%!;~NI+_AB>eMIz(ZEzcaNM*ME zeMy}e1r<@?v=}O@O_QOE079m^!*E3m>DON~WV+yReqrH{rMhim06UkVkA%=YLp1b^ zq*PlmYBN9YUk~(~1jJc!Whn*64B*uMOWB<}5KYWnb|nKeuWYS~HxbW$WrgPYvUXO9 z-CreJzMn5f7mGVG(r{cm!IS0yt;WNe3555*r?dw8^vXE7 z>Ejb4e1q8n^~%6?1?1XvlCgmbV?IR5G#IqDJ?Oa&YT}V5_a&x>U~}ju4_QsLk!M0d7ct19c=q^ znK@lC!7NN@50>PlW>NjZ!b{}Rx0Hl`5u#9A9!*-mO6nrI2yrml1LrPSFgA6WA3l8Q zIc~CYM(8$S_s;P1{R{h@1($8*>(g9K9cCimz(D=&)Q^FrY!&J{Yjf9dhr_*>EIhFh z^RIrtbIJN*I=NLw9k}o$+zh~434HNFH^0|ZqfXWqMP1d&>}%@mG-kXi_&=LJdIpii z%Cr+P4jqHBb4gX2 zQ_!a;&UTwxUEcV+8^{n)h@{`6+L%?GU01oEXm{05RNM3E+6zbBsj$bW-9gC8+2veV zZAxw2Z82mxnJr0)uqrFraN9~T{0%=qV zX(Vf#%^Ga6?Ux01@VGS65))C=HBnl2oIIGp^~OdvR4zfi!BDg9U{8y#5hWv((dk71 zEImEluW0vfMo&V|kCYargKa*fBInwQaal>~E%%7|7DE#woyNu(NikpWXDYc{-{4I? zlHyPHYVLaL@`{Sb(La3KbhMY_86Z{i(!aTq&)$O3y<(6rg{)3$^lU5Li#pmEOz=}= zg^zaA-ix)MMV_<{&ygJL_aB9wNT}Vx-^IIG-@<%?UqBDAPtUQnDkrn*rJ_$nKZ`e; zaE3cBF=v)YE$DETYIVqhQJP~7&V*8K2ZkmJ47GN;TAZ;g+(bn)%vsoU^z;j-p$~-L zUGQf}CjT*7++EQ+InC>|_V9I!_pFV})TxbrZ+!dNl$yr*PJ`VSRY+S~+n5QbHy*|J z_;_px5rt`5(Tik^VoV|~fuPP#G4EfvnV=e_q2ZLUTc1r*QW8{`>DbxnH#Uyh+1d^J zkc~KV@#Y|b0^;Uk+MwEEn^Xj!qIqZt$31FgrDC6BWCYS3!{)R9zleM5u&UdxTXZ2R zDhL8fhqOU=qoN>EDpHaH(%lV;N`r`WiIhlpceiwdwB%yZ&6&&RefR$M+3$6(bFOo~ z>-_%kaq+ko>lgRD=Nxm)G5V|_QxnK_koPu=?qZd3{*|Y-QluK&Z_tyHmlsbtUSg9{ z>QnmRF%gT#C%BR$tuJ6MvV6`Wwn5YTf%I}k(#51t5j^uxPZ?3Pe zO~fV|j6#q??~|{&U?)adHPG0&+@Wn*WJ&~G@LyX|2|19ojpuOzqG5jS?3TZE8|baJUr%bEEt$&uIDJ=pa;> z`;vdtqlfNPa2W;$2H5!-E@ccpdwhO2vc6Z`qYtxsFtq+9&kdH}b&@z)73OgJj@P zi{I9@Yg^lQs$HX!A9@|Gh`GhpzrQd`NRT(aesggNlU?7H?DWWq(AiGt`wX3A=x1)9 zF6zv*@q}8!!vK1E1}>8+*VnJrN>x-^zb=mIJi3eUo1iMEJ{1a+Dp7!(yNB77+g$>#Ls%E_tD>FxmfR@?~c&KLU4cR2cX165P-y{Q@LlU&e73iZ3l+r1xqa2&9P;f9u~4CjSd^8 zxPyv{JKN@BLZwATx1=*ZE{3O?8!bfxuD!Q5(dNUEBo)Jt?@8y4n`^f1?Rb3fC6@E1 zK`0jkgYt;8olyZgzHuVMAh+iKsE)1KlFd??`^=)io(vjh`PS4HlznB|S;i8tH5z1>ttEd>ZHc}n8 zubidVwk7$L>dOV?^N|Ak!JqcXo{{1(h@I@BlP}~SPJOI+h9I8T&>r`WA&H5Wc(sEt z{+Tg~>gA0lBSW-UkAMyQz|a7Ut4Te5dZ#JEUoflW?=w0XhT;H^MS5Ja$9k{0(O2oD z)=EU3`Hpr+^Ys8}X(k?#xRsyJhO#uD%ndpY*X&aPtrq8*RGof-6)jh2R!oI^m7eLi zA842)H3v1cwOuV3?TlJmW1U`_OfRrm4?2-Pj%b(wAIi7u|75>AwL(^;!c3`oOqn-s3eH0{2HLK| z*RSt3HaFoD5R4Vu7Qv(0y3|z8lVNFPMZ+sf724JqHmftGHFtn}(i@J4+S;P$aAN1c z#CoZw*0P5uW_nD;>pFku(IfHk6*5udn+Q;vS}XSUeL?pNZ+q^ZE&E%j}OIJ5LLdOWH} zN6BpvNsWzvjuyJdeW^hw59lL7{22nhXnkx8CWW|0s<@KU8cOM?%_nNT$@y&0B+#FO zKFV@Podps9{Qcj5E>r#Mz3BJ9V{JoYXL;{mW^f^$1uy>dO%7xG z;q?FfbNcAaWnR?Mwx>HDH&G2oR+fqHSPy-@|2bV<4qquUwRYm@4GcIba(MOn!t2NX z^++y3f5d-1k|X~6e!{+Mi-2#&7tQ5C136n-X5rWA^Q|R~dt4AxVY_KQHc>*gO;tGz zOf>|H%BerPAm+MPfe_xC7b66XT+PGk)$@+uO1pwaz8=#Tv%@*W-U>yOjgj!$iXif1jrg zf1mHNoDWYv^!N3>56)quauaqDq=3i`2ATU$nD@CVCf()7$16;*DmXcz3Q(KI;w~QC(d+eJt z6JawbXBXaAd#OIL7r(V-ovC!+&dzTC=;mY5qSD64sWLGSb=@$%aVct>nmSJyq%Cb6 zu(W&g-vT&f4H9JeL6mg7qVWRQ#Jm4&PTZLAgkslbB=BuVczmR!Hm5(IFc50kG3O`6 zIl#Ic;xQu(_mKWN)c|i2pHu4%Nc+Uakku+#yr3TAw4ZegG*u>E$r~SC)bEaK30fZ? z$v2wQXd3A2dn7H*mDCahInsIRuw(#P!`dM>e~itiTRD}s%4QnSzwP>-(sA{wjc}mL znK~=78YSrKbve&*IpUyqzow*nn}SXF9J6}sKo3LS?sGt>k3lEJTu8K3rt$ZGC-19_GhOhn2f48QeTP`5;G$ z_>P5B+fdLW`&M^uHcG&Nb*j1={+IQ9?ZaZzDTI1l-o(HadmyRJKeOVvujv%Ea!-=e zseZmKKvuS4vcc_WDDUFh^=Va@(&+|KQf#NE@wZCain9<8pf-YOdP#Ks0%C>&-vvT>q>NxijW ziuXs$jp#(HMPbf(Jyj5jjr3*0ADKV&R=r~?ChRTIpG*@evz`!WZEwF=KdL@UKwz%g z-86V9wBV|;@-SAc=o3PaX3*^nK8gS#<}SBt4Yr8nXeGOyJ- z_v;ub?`UK79DZY1hn*0Fh6L_S_i?G3&3_SBGX-mwIMXIx1c* z#a_a`68xuUBTk6ldXrE`2aD6KJC-#}qtKRggNkZxy1=`A>slX^Jgw8_=i=eh(+m8t za*y{n80opc-tAAryn#;&svTT+Snj@A{~1qTfF3!}Qy4mWIixb*&P+9Or-PwASW_8Aiwy-Q?$p%hX86OHdVBCjnn{TD;mZ&M+V}flC<%J6WKLT2`_cyKf?$ zgietPJ6Rax4g6&@^g2(DkS2+JADlp)G3{8ECcgZtv-TY#R>bX7h;B0h0nyN2bZ97{ zL=rx=me@1tX9uS_?oZq_%qq56^@&rv;$^4ZPgN?c8SG=Sq}Ry;CE|~|xy;1)czKIY z$F@iJV;7pxWRIn=G)wY6+%FEZ*ymxERCZamEsi_3^_?cy3LUvo4?|J#sfK z@7=#=Xl~BPPaj$BcKp(L;TnEO$j+|qNd?`dL#LbbOB@a}I$-!WT4f_yA>v6#dki7B zbCvC!($jrv3KA*1Lv;ZDR4dw1wr)F~Bw)}?ktey62DEZJ6N)8*TRfhP553A?EdgfH zChQv7Kgxvhl#~}oOzd2)T#x(xNLb+=g^VaWNA~t5M2b z#`JCTLYELi_cPMup3G+lLjKCi5faKIS9na0c(C>P=FguS>&4IDHz4m|0O8)hY#*hk zXDoQkS**)WB1OvciO?Ib=(;nK52ham28a3}nRk-9E9HeXx4bN6X2wEoHd$Y&3e zX)U)c)Bfnpr1{N|g|?B7UmyNBs8e@n9Ha3j@AY_-N$Jr}Zk={x*JRw1`<8;FkVL<1 zL8e7Z*I?Y$P)2B@a$0f%*6#<2y!qn zSvKb!l6p*vaRFbSr^uv>fIGAC8Xi1tm(Ka@azu~ukOqgGD}HS*YX9wpkv8qyx9?nm z;$oZaq;TD_@AJ()7|TAKC^$hW*EDK#-XJCInt0+*BA{L7O7HRRf_3)ChjKUagMC9Ez34pWLAIbWOO&D=7az*@MPiNTmb0F2%`ei z%$w51t`eEr z$NVel-=`@UEt|wFVkB-U1(lny7rHI@#0j-O9j3km(PAiL`urS4GYFxq@7J%|_&Cyi zX7i8@?*A1iviHEsf1O1lyWVoHWHPMuoDgaayuUyZhk=2?1@U^vopj`m?VY%1{|^wN z;$nF{;#;?@PFgS1#-CCtr1jihRnf0_Te;EPEA9<}qI1>g|RV_O+!8)DXG*zhcFka~Rn)LJefHTmEg;4tY~=_wg)OF$e$=yyhm zI~fVUW=}Cv;r+hS^>Q=Q=B94&3q{Q~&k>bub;w~NtK8h8Y7S_CR_=DZoAkT>65<;6 z7U>P4&sKB&KQc4*p0-=AtgZqyN6GXd4(GCr1R)f&+ zcR0GlM=j8D;!%H3P5o4N_pVBo67A7`i+PESXvwxnZqMR8yH)$E=9H9BmqqS8tE&JH zp_ar>h_V-h2}48kRIuE%!DxF)^_ptDW5*+uCH2 zKjh+IT*ARfTJ}n%^<9dyt)=cl%lA!nHe;r$-oI8I@+<*T7{@W*l2I&6lvCQ!Q?@wezC_R0AYJUyv0BSG} zr?hK(<)1ISC6Jbv;@Z1Rbpt=7A`!NoR=3}O;^RapAC-_qN6VS-wZ-F#|AQ8Ywg4)@ zUHp}edlD0}20nOIc(L%GtM;!ypIV?l;=dkG+5TVs#8tnZ?ud(>CNZtyK-~&CSGV~h z36U0$`}fI0e=Sk(f39qqBy7b8%_Y^cV~xHdlV|v4EZt&0N^~sWzH$B z0zdh^jjE(QD)${Ls6h^93Z^gp&SN@{0!c4T$1^O*%)GEtWf;Ve7d(!)6M)LI)SDw# zr)E(pp`^b^nLzI8?~g5ZvfQJ(yQjt<6Bkut$#H%>e6I6g?SVuPRYTADoTTu7fhgn$ zn}a>hq`Md9H;+0zYLcuWsp~nPPb)1g-8@@Sgvzh`XiJXeb$I~nW?Lm<=f3Yxgc0%X zi_?}?b~D3lm57mws;(3~k0@}*J=+=A+6F=M1lT0b_H)jg_B~D#&|Ad1n&`=Z9h+ux zEPTpl=#u*b1%)}5>AAsSZ0JJ+v@dEW%p%;?NC3Rqpeg`rcZ-lkCA12b3)c$7 zPB=6*HDTUI;d4R@m?}V@%PeBteLk;+ge2j?Vo1Z<$pIaLQ7*n7ux*&`SaPU2Al)Wr z(?9sZp?MS%#(T>9jf<{h?AM&nr}rZw>-bh z67WJlO{zZ?^+!ykEy4Yq98wo#F**A2slFWxiqQgASAF?~gcQ_YHM$_H#jQ{a#SR}N z9&gT{A2OB+2vqLvpBo9C1zNbp{My{KF9OS&2s;y{NeFP|;*z={-OU`Z=!Fa+Ogv>H zA|-5@lNamX5cBFC>3?H)hnY4uJe5*2la z(eJq>;s*($RKUe>kS0%1a&@I;Wo0caEW9Cddy&fmnUtlL_c|+CguSiTU55Y=T0JV! zPJ@t>OFyzQn!38KBa+&DBojo@e8`uIiic5!PDy~T9<jO4tmdXh=^{)b?Ts zrzt-%_Le|MloUV$*b#2&lP>z5(c(4=T*xffv`Liw-um2}ncAV_xRM{MM!j(nbfG-h z8i>nG;sT!tlC?m|j7%i0rKPP>SJ1^&o6_pvD;U&iS{9vD>TA=k6=U~-S!Ulrex@n!@Xg-IrPwZk20vxZm6vgW*RO-{z|6w(6UDa-Q&Xa)W&4R|pDsd`@|*m8 zUkF6htx`%O0mG8n9lW^ko}x=qUTS9LSGx>lh0hM}kfQs-&_2Svk?^%q-eX$` zF_f*22Kxj9@9Y1505||K_O&aA-fs;O4$o}3d3kh7Mz7*r`(9ZXz^CQ$5hy88j;dC! zy#bZOyiv3HSkb0-zUfBeb;occP#HDoiDk6crT}b!lb0p%(cT19*j)ucm`D}0cm6GCC&h)YS zxJi^GZoyX9El=I>jT(`CVFS51+B^Itd=3uX@d8~jIn@_DGb)6%+}Et&eA1cO(h~FD z!R#$M0>`<2zj2e|F9=t$rGYq-d_qVx6WP1DnG{UOWqI2mzra`i8G20I4w2-3@ilU=CP;eby`*f4x{Nd8z7?>3ZO=bjI&VZhw0 z2q|zRME~LU4N0*}Sl-W7U(}7?*Gz$|zl)_SS>Dz2#~;J|f_zKZ7+X1X(GU{o9Zcq* zCVAs>nhh~Os;4cV*hg>lTDB0Qp%uB^etvS@6QoZ*eAGx7i~-86o-H?;ZZH-dZT}X} zEuY#G*4iABx)$7f1)Tkng|zzx-OaR=fx3?$C-47)&P#}9w|>D3rI!*J*mr=`3ubD1_iMKH=ceQy0>*d5!>$j9XU`Bygb zstIRQ?&~ZwF*Oz<8OA019JNd$K#D#6WA69scbY3tiQWD@UndR*1~C4U*s)$-CUCT> zp-}Y<>zRYXaQV^u9xd%TH+I$IYQPdmzwUxXnBf;*)j9MwnTf zn=G&RwUmc8fw*Kqqj8=#w_vrV0R&Stc=gOL2XW&!wP%-pQfVoP=Q7t4pf%4NAA7j( z6liURwVW@fg3Io%-7ZL`*pg+S^Edv=(<770gEX-VLEZt!fHCn6MGKo_2e(QG6 z>5_b;sEc{UmY2e(kmztZH*rd;c&dGF`;d)aqbkWsRsqn`r;0`+U>#*HJ2Sm$)v}O$ zFa=Z5uKt;c$6YSgxr}@9_u4WSn({Nr{0dfgfCS*x?q9>dZXRo$uB4tm)#zlEi4lpZ zK0V5_UwF30s}?cFLl!8!8)q=)Zf;sx?U4b|UT^3smGc4qgvf-&y$XXR+#qU^M`mUk z5j_Qo)wm804#HKHt=)okz#^ZRm;^3?oBU5`xesMqcaBlqAoR~k(CrxkkXotcRB61k zJ#vKqz4&{KF?~?Kl}*Y29t(_uRcjf@5i#Dqn_paft`gb9FOF`2*k~i;S2@BWwtJOY zsLI5>gKNjfu{^(h(+180JYEI+@e-eTt#$~;8|~q zf2PKQ3abDbW%U>dUX=@r2%nvwfBZ_18#+ZKG7|N4bVf$zsfpR~FLayVaFdPZThSTF zC!ixOsm&t6EfLSPOhU@N1|C?-fO%nM47PvTMPkAna_b`A&>PMuk_1sycpj9>4NS*- z)_J*~OFvwM=~e`crG6_biz?A{x#jsgmmTVS1f%^j3Xx@I#ry)BriU%aNLsD8YoB($xZ803;{a18A*AMo#}M? z7V-X30|}qey^l`BAb0g=rq!HeJYR)(x4m{#|}`Z5+~l<^>$CJBHA1 z3+&aaUt5!rHd&Q5n@EQ~TPG{)S54MLb}_t|E{Oq83_u-~#&;tj+aMtFpEF46eE^({ zp40g>1mqU&&!j6R_8=-B^hMOPr-!PphtJ#blI9g^YDtX!#f_^KZ)qsKe)%4-bbjU! zD=Wq_jD$3aiQL?R`X%L&T?nXG1kR?%E_kjEx_Qm)omzICpOzS4fXH^ak>@1->L3;o zGm&J>WiLA46+L$C0xkLEvCN?uY>#L56;{jig{DL z^nuk2d@5yw3^nHAoCq|I{x^Q!r#+I~T9Bj$?cp%+om);_=sMrRYO!9G7v0^FecKX5 z-Lo@lbBDQgY4Vl@;`8Uo4;dNvg^Defpu-GVJ`JnrJD;;ti+jiqg!ab<1x)BB_EU>u zy~75eS=FCSR*Y7dFd?o=NvSXsO}U@)WGZ1R-U<^w>`Ehz{QN5%(G9em%Izf#CihKh zF<_L)UDZBRFCSEym-w3v%x}wIMP~z@pdUsFIu*BGDTZ^I_q`H6-m73EtVIW+hY#Ui z#e2-8nYDy|O3wAzXYF2!UkHZo>gCXPt*wTOtgjm(Zy9Is#M_wmm!xJR2o04Y6@3p2 zw0xj=68G3%AlxxfUZ(sm22Rju)G1w(h3ZsNFw?G`9e>~3xQz64no19P-io*{vmK=s zE@5~48UfDagD0-c_9^S}95}@*$vY;Ra@U+Jj>Ke{K zWVIR}89{M2L1vtq%6M{edbhQsWpp&^^XKPeE0hb-YOk}0mQ<{V*VcZNEPqm+;VaLh z&Q`53X3%X(gKW>MBzT{aLCzv2yO>CsSXm;FQqoD46zaM-;_`N#JnhOizHfo1xPVJV za`3xq|4#WU$Cf3_b(>9WoNuKETe3Mqq!ca>gxpKrUAyZ)g82B>Q3o4Hkk%4TJFXO) zf%<2tmIDT&z<+ML9OWFv;~?79^n~JUK2*r>l=`FO&QeFPTOiOnmCu%%ir)^@hH&#u z{Yr&ZXq{^yU^^8H||tIVrN%!b&FIt z{?t7TIc{2Sru}uuF9EzDtbcfzXT2Oaqyo{wd~Oe*IfwvhoR#EPJx~81!R!eim0!JT zMA4D^IPST~#EE)k>PD^WUz`ertQe}u1KF0AKzW13N~hSKu7#BIGn0swpXu2^n+yeM zE2yR}dl7bbcfYcKQ~aZ#fYhKM3KZe$kN25w-~OGt59JjB8Gd&_nN8mK@84%`UnA^< z>G&YBHaANQWouro{n4xIOU90nXJa!q5tI|XMXbfhEgbvMOMyK~1_!QDXiM-kH|Dn7 zEn*E?LB?<(sldF?dnmUA(h4y6BV59PO43Ii`55$dfi>FyT)C&|eZAbOndy(T;56tT zyp7c81j?X7WCGR$fIb;z-9BR(bkQ0=!14N&{A*;O6~b>h#lA00=d^b??X1eP8=TQ< zx-5HK_4m2$WO+?lS)v)Tz~zD^>#{$zPD^aID$^SQ!K5S+wUtl&jm(TdWA;7hNoe?` z9BjS4+}Mn6JeQW2&MquG8OqbuxVJi3!gjT-4e*j_&fduouF*6o1@ART2CZ1Tz@leN zx(cOQeZ%n_HOWZ04^qZV_Bx1r(9<(<6&O*$L_U1^0yCT8eTtr(<2iH*WbFbuIo;b4OV~W}R5Hz6 zPV`+117j7^NVw@gg1_CxGJ_s={dHvvn^W0cpnrS;hT@Tv3zu&9gtoA|rkNR}vOclxb5w1|S zdYN^<3um!elcD7rPYkb>P8yd4P{v_k=B7sFQziY>xf;S2b`l(5%}p4|m?&2_gmpv! zqtmxHeeQ1A%g#M>62IWLYdMl_e{2 zFn3oK2EQBF$teseuauR6PSsZ&u;29l0=n$*uE0uPULILjLQ^Jn#ap=i&wI-X1cFZE z2nn9bP(9Yu<2E8>DqcS)CnJ&o+!lw5v#`IMmG~CwSnE8tWXds6>~w<zf{N*PCLTX8SB_isn+3K=eVjdpfFXMdkupQpBsebY1p(qfF0e7tJTL}KWZnK?v zXtomjCV12io*$RE zVMzm@mW@q5h(fTnJGdBlOtMFqp*-hN*_Mz7r9MK>p%yuq#vMZmJ>(-$8Nyp)}({}zPre* z<>k+UZ;M_#uBV(c&~gGmG#rn+WRsGe9R!X{)|<8NqJybZ=;et%wmzo*Z6CC{Z6Mjs zQqsf^2Ci)hPR*&94?!FR#LF4FIsZBiWBaHe-~F#g)dzG2{9lj%&Y%3#Fn}h>R6mVv zOk`tnJnlnuP7ghaC3KfW@SiRTx;;^bM=@DYkS6|z=wRq%7J;<7^S1Yw;3JSrNe^hdm!YecZ0! z7SnFuAr)qSd+*SR_+UKY{IRLJaIpL7)hXvWo_tO&0lsi4}W6UwWZ5}c!b zT3d?~JpQ44+DqD<94yt$tINq%xc?dNiScmRaKfb;=@|<{P8DaC1lapk%v6U4A8@53CgjU$=E7tda8O$_KCnYGCl!wC*hdjC;*+Xr9 z;2B5lF|Z(5vsIJ>r|t>Qec}8y>P)v_$eb&9%;8~u2lyYmz3b}=T_Bomi+LP!0W-(( zptohLYG`b%J^1`|)P?kWtARP1-zO#8(9qzu^3xb7rmd(>I>f=zVS(W&=c7jrxud4@ zanN|VubEa>R_2{Vgdehzj9xAi%JsDMMn*<;EyKjYqVWU6gL{U;z?Xrxl<<+Gy-5}9 z%4hE$qFV`MR8v`Y(`@a}a&qs}VR~8_8Bx|8afEtw}{UNnA>L zF}C2dkdSqPy8ZU%{o#DnY0-Y=jnw)5;N$fZA}5{^8S4!7i8;s)@X`E_vsWMH_IBf+C<_2^2vz!E=W${E%Z zF@A_S`VzDf*Z#R0>f;ljzq`t&TcGM97&~4bezU8_G9K6gUoPVr$MnVs>swl8KUTI| zz1r4S5m{;1ads*>B|62dxyKIl-;p(5;C<*U#8|vkebEN!2?jeO&u;iz>R3^KpwG{3 z%sd3mwK4-6$JHWb07*)+hK-ACNrGLd@s6B#!4Z=%rmMN`G|1#fb#--vW6q!unxLGT z3IjF|72jS`<29#WJ>UQWBv$RjM}H(g#>wPTe43V+1!6Yz%fYgRJ60{II<^Veka+^h zZp)(Q^af;c|3>B?z`g}og1wrCiE{S*ZwyIhc=kGKjubC9;xwA_DrhOUKolP>c2bC# zjjoxe`GR%5e%>_oduD9l>NFFyrE1M`QcSoi*oba|x@>FPTnh=e-kr1p`K>+j98^QX zS!{kET5p-(iaGS4ksj>I4m+qlyp?O*PgeJ<83ako@hwofhqYOq%T!>*M<}{cT zCb=JM>1xr5-c4UGGC7Tbi7poy>Vw*xC5TG2aiwJX0tMGAIw-e0&QI`QDn@8MZQP9) zXxFNHtr1tT@mg@vvxGw#Ieh~I2T|_42w$nTPOZX=o+3i_o2X(I1dfmI+o6+7uv&Zj z20DG`qB7MA$SgA*Z~UjW0|J}+wZztE8gM%J>@XwT=H3t?@r2&!i%IAB&;>{uQ!<*PtU6%#wnDkhyzSgWXh)O5mt$6>ug0)*Z>EWOlm z&|DYAh6!$9;FM2_H~nYgFjc_I(LylEQy832O`>_cZ;xzip@(G(!;nxUA+)t0T>$qyy|?-V zfW~7Pbbqf-jIXM&*I|#0EHOm)E#n5T6;kEVwL}oLK>H^<6HrkzK=mzX2u48MA|N1Z z-(!gxfyWPx)a!P~%5?y@^0rwY$ee|tHexK$!WKXYE@to-GpkxAWZE8Zh^Jwt!GO$D zVcO|aTJ<)L4H5H7;S@~2wuJUEFl1^JeF+~@T4Zy&LQEXNy4$qwns31d8px2)6?vi2gcRCuFi1E!KAMPtnj;`cz0#%jZaLAE-i6dw#=r zS*troP)0DrWlz?BaFvi$z!@ikRbv(ynK0I>jml@kuw8!LE*LKb%85WBq7bq6Nv`v< z>~k1%?jfc9W|2Do1_Wg(hPPc}zA@aqTGGsGG#|gf}Vb^AoFgayPni?`}}dFX?gp zn(hI=-Q2u_OWK1+yDG0$tsSRDSv5`dzAdY3I2bPvIy4AW)*o6=85*HLTj zwVo6^@&x_9`L@{BHZ*n);&xPOCkK(JAbU!QRcYP3tvwBobRVAl`Wl*NWdjx4&55rE zcDB}F{)N!e5(9O_VWBbP%4-;@zfte1bvz{Px{oC`uXTQ^c)?3t!gPFdhfBuZ@>@lQ zzf`E$v~;GAFVoyp!I~3fLf?cQh2fvYl~0;EY3b=#5#XX{{#b+xJIzATy_Y_c)O=Nr6KPp1+uq#S<26&bbMwcmd!TP# zIyTXnqv^69zMROy6V5Cv`!?STQ>ete>DzFOojN#s`Lnr=?;xk9$famfUP?KQ8pV(7 z;P4jnmaN6NF^BerHrd+SPY#wjA0Jp(C3$hBb%0bYj5S!(GL09WjujDceoAHZkHYsa z@b^bKMnyGt$9KgZTm&f*ONae$$vq#qXq~Hju5?@RJ-PC*Sa=~NS z!N^y-wr>c+3{)bS)F|DeUfbg}DR2|I9yL7%f;E zEhEfQa?x53503?b*}!EEF4W%cTO{k8ZC!(wyQB#pKmA2edZ=@ADgE`!^L3W~VEOJv z?@uq3oZB;3t%RZ^!PorRpW-2t)OJJmY%c8QicUdZF7`1$FHeeyU>N?$NdkkFQJY1y zgGK&KqQO}6P>_^;XzNokfKCEcISyrZ#dC&HLt1C=<k_qgGnORsQ*QLF@yb#

wUo{#>K#$S2MTBbblz{{cwm{#((tRQKi>X@LvC-s*T}>a zT5im9ek_&~HKhR4pkUPrj-kT)C)g)jH6F%CRJ4tc2@<}_7(TwZkS5YS*$IP(=>$dp ztEvVNbXeZl0LsCZJ&3xS^F};MNAugEq0G$844RY;{VsY|2 z!D1+K4-^{;akBDwqPx50tP6q(g@l4yB61Ml(lTOdP8aN0HA^jf)-}t2wWeSP!W(|S z-K62W-?8TC-E%m)q=oRZLLfXBMelodahzbMong$Kl8f#cUfbI83GibCOVeDRD+pGt z>PDpdZU+a}gCB}u7F=btvg()LpZe}X(r(Jk#mxrmG*M?U>tJewv+oQt2?B&gA1{Hc zO)N7rx68TEB)Q3b@w^CC>1& zpp|}R-8D=NNl@piVB7%Y6p6~E-|>?OW?9vTTlG&4E?o>#F&Fpo)z;LZ?ReR5X!^sT zqXIdRf4X18%j&RI?>~J|C{73xj(7jcD#~a-d=p~pVE-k|9brPQ7M`5FI5v2ndnj7@ zWN|Ex~H$e+=e>h8bZ^DU=p!SjzD8zu_ z^F6=F5!KZ8kvtNd$S)tj;i81z6T|rDy{Hvp%kfjQ^|j@Vl?yoflx)JZ7r-j#xuwst z`mVFcUMOR))9F#Y+PNXbct50(v$=% zEQ`uBmxAsYeb5Z=u(Mm6Dx2IH`(4ZQ<-=u}wjXcqg++sK6z=+D13eZNTqBh{kXBGI@g68gyhnoXZ4QeAzg9s-ozg}!B>1D zc#F7HWpSWTrSP`iFhM#&#?>qDLTUOk!IQ(o{nJCMv}*3cTZoTaLqXPuf_^uyG*i1{24M?>An(yWP>3Z-yd?W#e1drpEybfK}!pNX3})+}Z^ z4Wdh3V!}CcX^EJI>WR%PA?$d5*n!t84_m|{FRQ<|LL{%Gisrn`=w0rNc?hm@jRxK) zwxC{07+K|o8Ntf^%ejaYlvjBvDB`HvE?PQ1rU&g>@Kor2^;I{$H&?$w0-9TGLh()5 zTIZKRgFLenhuir2vyTLmzgzDWNJp@~cwI?69ijE6Eq~!_+&w4le#bawW_o@7HI|$f zCdSZw<6BD^8BW`~Vv&PN&wZ?R4x#sGh%{{J=}B<%m3k~2Be8*+(_J&mWLB@VC4~ph zYAcoA!EQl-h}9{!ML84A&HJ;=v9q`P(#3u4cyi>qytd^Pl&@4_Q4xm-WBA4f>(s&A z$kmzD)DFkPgBv0&my2G57FQm0#e#k`udb{#4qM#2uaxyLt^dUf`{?+1^XlEW2$-6f z(R%@MY@rAel4yd#SbJoX;kuHdQoc5d0IJ<|QHSu~zbqlEIatr}zz`Q`A0pD#;Wz7g z&8k)T*g_sJO0vI8(B49eO|x1Q%uEQpsIF~Ux2z@g>*&ueubV|*695q?17+oVauKt{ zH){KC!4UI8pNg{g!t){rt@9DzF|gdFO-e&Gd7Mb1KT~E+hP^hMa$I6v8j@|@Vz-uU zGJ8r)Os|3XoJI8~mk?#6 zExz#_m>(ZKd~xRMBI^C-S_(nYv%sRj>!P9xR&kt7U)izd*wm?-t4ITPe{rla$=8dq zZw8q}Ov_olp+QM)M+pc8MHS4!ROqbFdXfmAa*iegJ#%bY^#Oxmj#f)UzsX~U{VK9` zoAm7?@Gcy?66{BtVu5y$`XDJ0;{F@hSkbzL)gZd@0i^pR)|fN10!`QqC}h)e(!Ak8 zTQTl|#QTw%Y!?f->OFpvIJhihhR$MV>-tx(qlvcz#0e>&+6-x|VYN;y!I(Dt4IvncB2^^tkXXG8>S2*zD7v|{<8ehJQRr+hBb@uIDPb>YzPvt0JXi!5FtY?Y`TE|udF{yArIr7S++r_Xr(aCN7!xli zKl_8p!|hbJE~9gtm|K0)Ab;t8Q}@4Dd}DSb zXPuDt2KdL2TW!z2xO3Bxn@r(*7No~un*lza0$Lhw(@SrDt+w$;%RTCI4Np#fuAum2 zUv_xu&16jP*Rc56opge^=wi`o7^9gQJUlrYuA!x84uAy@^DvOGK1v(LND|{itK_t_ zM4+|ZvNadLGCS4o3$jHeL0X8{qtwXP;b93@b6MUEIzmxNs8L8zL8+3Ffj>wbD)MQ_4FBU)zt8~INY1@ z64%fRU@dA*9gxA>~=RJnSxE#QOR&-?AvuaE1WW+`pA?|VGm4r7Gb zfaw4S{ztBiP`9Agl;fF>RTz)$-MFV_guj5EC2DtHGUYjk$p!_Z5dT&IwQIt=cV{Tv zb*_bvIUbnGC3jEOu%;vQ(0i3t@OxU?1#kvd4>dqL1D{^;^Z9xWBncy1!Cz=p5;w$c z{w#yBDM@#)(h2-*6zo?996=-5pgB{(1`^--1-;1 zxp)k?IQ!!0>w>z%ALV9RDeib%pPpVpa1s#Y~~wR)?F7<3D%kk9{hv;W?=*^o3U&3p52bjwU|2p*pl^Ab8{}q#gW@D>)b|(X4Oi4JRRoioLUMUp6TByvN*#o-m^ccp+5gpJg%WW38OeoeeHhL)l>N6 z-*t4JN@=tuw}nD%TbnNOpKIaVaLoLwn1NpQr^mmiL@16A{$L6O_k5YD7G5)TI@H*W zu<+Pd1P`dg$sBjogYhcmsp{&Je!l7__Cp+dZiR$Q#KdR2VaS)3w83#|CEyV29thk{ z{9`DV^v1D}B0D1+O^%|$I=0wEEc$I*H+P&xhJ^${I^{Ofamdk|0UfY_A#1~!et%e7 z*PtUWNs_^pgAcQqql}2uf7SIP6Edi@TYvJI21h zvEKw2=DNIC!%b)fC@X{Wjfch9qR?RQ0FO!3>_(7WT2glECo{FFw6qKt3OabiP~ZM) zKr-g4qF@f?7T;`9yI((rycoY6eqa~qnZ0|50ji(iM3h#MVWU3BL4pI?z1k)Q=MTo$ zA)V`JA;%891UgQj?*IPu-NUAhj4!3!diWQv} zah&7g+d^T2VX+g7a>YQRWAMJ-TRjBKRM^U!k(l>uQ9Z7}6PL200q{V3C{|!+f7j}0 z;4az9Jh9X42G7v2f+a0p$|EUlOZK})_l+_$7G^(U&!KIruF!mv;Lc5LtV9 z9Dn=~9j!{Gt$=b4w@qqh0K_ttsyCR5VFt_V%WwK^dhqc{(Y_L(3Oi?e`OyT3BY4E0 zwr}I$;;{3xJ9g|b@rrnbg)x-11nU~5zgb-49}+{|w5U3au<}uYnA$*#_8*D-{W_c5 zYVDW%&1Vevhb-ouU5*{SZ6zVs8@{_SFdPq1OhBtqZ>rzakL7;V=r5nV=Jad@MY?2V zO`Xm)AV0D&Vxn;py?b9d#ECvm{CIy-Sq2jm69;F9%Ro~&@cM3vX~HeOh=D4~)!cJ;P}0E*e%KTZy@`Y_tK7>E_Gvxp3cl|kbB z(nPAvLr|uj8fpf3?5>cVAF}dDgaVu^ldt#(%rl*DOCunYc~<8;!J*r?dOcI~{2~XJ z?()X6&VCSOY}OsD+w}hjZ*Lt}WxH(+FGRrv5tRn%ROt>C1tb-aROyiJE=9T?xPh2e4y4Q7I*PLUFIR=A18Oe(%N|V;#~gXPL>>xgHcc%jRFKs64P(USl^K4opW4si`t;S zVM(dfbo8WC5 zlyG8M!!eIojdSqc^1LpqcPsn7k^15QU`8LPm~2tn*068!xM z=srzVyPhBxs3^wzElY-PJ#|8rGB(a;W!t_`c4o^MpXz3m?vxOic_tE&D0?$s#V=pFCZ@-}6F>12)Rpr+xA+SB_u z4-s3Nlb57}IVv!~chZp7r3Y}aA|P4Tmk08Iu13=dPde@1=`&};2O7gYl>-Zp&kyQ0 zE60*p^9K(Q?P8*2pDr{2XYA=8eho$G+~UGdRyM!6YXRGxDwA{Kws?pfhf8!wU*C;Z zITH~2)nFI&4=uoIq6REH&GX=BNdA3p+%02!a9erO9uqR`GA{R3-s_h(l3Z*KA{ZPT zXnlxPT8l6z7B$sSc5xo7e|&L|y{M?5xDX(F{#H>blt#Tph{o;=3&$pY@XFZuslD|& ztA3bUPh2!lQwGsKx5JKNVNq_v%9!HB>FFdQEj{~tO4&`u&SzV{SyU)!D8&D+H^}RU zhuwm{zkoEkqbBE*MXXU?UfxgohV!o0my+gv4P^B z1pR&23sVcjG=4k!W<|%KiruIBqSwLHvw%4}8Tl{U2O@JQot$Rxro;B^@p=Gi0nZz2 zFB~7wQ@$!F{-6=$imG?(79G80fVG14{fES#lanbQ%xmo(9%A1$(P$l@Y?FSI9h@EojWRf8*ckD+<*goMo}3OQ!Zo<2HAP0TgMuY&6yF zUab;)8>D$M|5(|BN=f4~jN?)+*kZxry2Py1E7SLO9y2p^X{vJKbcOdIyi;;c8)Bw9 z@_x(KL`0|@)(6wP)8ikh3I!KjV&#gjTg^0x-hs^8CTqH;04?eFe@VSDx!%^>+sONI zIXxI&xO-wi$XKeFc7jDqi@a#^Np9XnORDX5vN2pm&(RRtilg3QtjRRp7YX&3Pg+Ud% zq;LCDP=E4TQU+5=Pzg}ODd@Dewni+Hc}NFt=NA`FDNT)67!4b5udS_1I9e3w>^sqh ziW(Ri(l&QAzzZd}`E?~G2D7xuC-wA9bk_3OcVl1#1r^=&YYh5+h7J8IS*ir;BSy}v z_NT8?z9w@y?n%lS4|&2H62@4kKD2ol*wd#F7lwumLaZC_!`3H=PMAgO8y$p61$f| zQW|iT$o!}METzHhLP#UIP>2@S3)uwQVy$wx;Y z_k#&KGhab+V^DH>I&f#Iivw9HD=oP|ZhdrE9!+sRJeW|>kxQ4A{%942Jf{7!Iv$^D zle8u6X)?veT64JNizcTWoY?|A-CP<#Cq(gNoUgLPV*3hDu_0v=A^lh~gU>ZkRRLo^4j~ytdr=lHL^+k_Jld65^w|fXu||;J_iq zDFSxrRxv5;JVT3T+LdnqHdIf zxAI0#^vRW)ZQt9ipdPvS^-34LP*X?i${WY*ohMz#8~w6z0RFYvMit=d-g8!G4_UZbo>=a-#Lj#>R6&!OBnGn^3s{vycAm`x&cRU|@R;Tl854 zA&hCI^QgFjY5cz@{vv<4pja79_yP>gNfA=>ZHj3YZ?zQf@yGnQ{vV<{=H{>mihvdW zMqFHqp;%Zl=x2x#?;zGrT2^y_4e7aFpPHDHW4*?Kvi-UR(6Bd7C#;~iwJyxL8<2N# zalvEM2Xpu5OM=q!IYis`f93V|N|Ccd%NI|E>`&_#Ybel#D;!euoSVY7F|=d>O0=-F z>K*N?D_qEUDH-h!Hs`Uiv5-jOnM^OO2-Pw&5f}sxQ7N8i3SoMg8+uR#>9@|RL13w4 zxnE1uPzhJcrx1^K@^Zc7;}QxsbL&>A`MVo~v~oW}Akfg|*BLJWByZ@9#aq=9z!1`~=H<*qx&I3Y)OXJ%$4kVVALbJxR7Zg(kW+}kPppDnm!)6b_hsKEi3gS2PQ zsZa^kr7-l)F3uD6^I)kjFT5a^{-)bZ)hu2|$tgOK!WRqgA%mW{HPMd_<%8D=m^Igw@ zh2?H>bwy{xEu1$QkGofm_RwSHeB9g`Jgv|RT~iEQmP;^qCv-hJulYL4rsLbIy zJ!9SgN5@J?OZ};7dlSysG}*?BRQwf>{?JgMA7_`>U8|iDgGx$Z$4936k)#qkR1{>v zE}v9@fobc{K!n_X5S(Ym25FkNAqx-)S{Wlk3&ydF{H|&Qn)qTuY5En&O};JBaT|Gp zby}^pZsx{C_sp=ZDiW=DD6Q9Y^K+aOUx5_ea|5SC!@hzsWD9*{5D63cdB0il308)8 zHh5-<{O`v9fSm;(f0q8i_yWt-pZWQ-3XMJ67-FyG&t>pz+tbn=(Zs_%O061qCTWWP~?bz|yF1%!Ts zS>1zI;%f||-ZwkAi)vkHKjS{cvK706>)Wqd_s%k2Q(s5QS{_H0@zUYJ%>t#YPf5oe zXoY21E!UH!-K@Gf?^WinavPs*Lo(vt^!jXDZ-{J4S44~d<7i`9-e{7>$4rX447h~2 zFO#Js@0pG~*SJR~@HG7U7wnWnYiqn<)ld3^5PbM<;$k&=@8DqTZ17`+=@VDiG+9wu zIyUZDCew5R(Th7QxEoAUJWK1#KpU#6sa3ek$u+jF*M9yS9iYdnGe0hHx2{EAj9%l4 zJ||bk;Of%y#)99Vvw$`-DiCtsYZUIp#YVOyRN6<(O+C|9zy<1o)ac_C5~FcnIUY}G z%S3^+-+E~1=$pUyt|yL16V#eWy;j?QGlK=|?XpF4-Ed@mm5s{bo#0^iNMpoZV%#zg zh%|+fS1eq@FTwdNa_j@z4ZV{(gwsX|#8r!p=kC~PhlxKeOtovv`6q*W#u8qtvawLgjq=KE@2*kQ(Iz6Z?sEPFfk^UFvi=ye%}l$^9Mx3juB0!;^h4j^rb?W{rJ{hVk|GA z#02PtSRTwP=&@!F|HOhRfE|CG?O%h{pFgI8Z5gVclB;yWOAgK*pOa*MSj2cOI|ZR&x0*1xnx0+3#AhKRgALI!c)9sM zi`cWnqfJ@IGiiHWzX&QsMY)44W_G_+H8UFmGy$~!3VRv2w?zTRMPg^f+bt)l8{EN5iWfb2HiOw>?W{Mh3P@ zb$X^kAzG}Y@T=iZ_$zu%29rI*k^QUj&(dX?higB(j|85MrH`);=CC}bf~R?G{!WLp zxDzw$ZFIDG%h0Vee z28-_rE9=BEqjrxjEAS>`V=3Qqe?DT=oU>?wT-)#aBWz@;uM*$TaN73m)gO)sqeMkL znVp{%+$+EZRac)*BSb6dMP-*mt~qoJXRcRDyN7f|i~dI@5jBy>)Ix)gBeB6=U=YPu zChqhY{molB?H_2!yuA8Eat5+{)h^Er417_aS30KV!RJZ!_JOEh&4wTSw{K&ZB;*D* zv`Hhx1u{A%#DCS+_7q%|SX<+QMP{zrWwZe{ICtZjaX2`%A!y0B8arxjswVGu=zHBX zj>mQ1-_S)yM~Fb-d}=+pzVqikyY=^d_Wqd&u3q7_cY^vZ{6D_D@YRosYwk=z@{Gr~ zaH6YhHYY26l4fL$DVT z9;*#h31X<)nu8$DA*$&ipTB6<_x$`|=vw`U1jx@BeZrqm1Nwo0FI1b-rBDe8Mz;G& zeM?P^1}z<;QLi5ij8tEZ(1kImJa;xGNv5QhP$6UiZtgGEcuHE@-?Hy|9A#cm93Gjb z*x1~AK;)MbFA)Cp<6K=9c`8}gzpzc6?_}?CJS7&UrtUj+?}A`lo%X^~kQ|7QtXRU{ z_$??})d*EP$kl)eHIJlgjaELlq#{BQMrk?JbavdJSc0BEGKE0u-;j3% z`IQhq!yG`YCO1Ynz@Hmf`x#}WGk#IzgcQLqDF9QGx74tv)4n`LHqEih909}G&vQuj zCvNjpI151g8xbDi`6A(4PH|J_Rg>LNdT6?*U~`yn3+J>@ohzM4A18_yctmMPxqI*4 z^5*L7P+($8RY-hr-SLVZFJEOkuf4mo?eT+r`g&`l@m6TQ0Xym)9Btcf7ndn#V$s36 zd;h8n$X{RIdT5f@-MMzvq~Xn#l9V52^{PHSasBY#K~^Er`^61lU}TfI!B@Uf{%dY_ zuMVj9djvSbK#bqnw@i6{uMWf|UeP#G%KD?8_O>~W_o18W$aL1jhL`@%u>?U`Z2NCr zg59n$s06wfhO#Yoj-~k;re#o`PdP16Qb0a;^S(a@a|fXTQ`DcLrZRpNF$Hl;;IA(! zDfvDGN#tJNZoc8;t9cMpn&OOp^%}hU`oau(0FGZJORHt&QIXOP@5N2WzthlZnqHpQ zvg2cag5k1ox{(cK=MZAh#pe z|D*iYA8_q|eG5#_)0%h?@V*$yNo|43QU!{!iRbD+-e|n(&bYM0L<`F!qyXy=D@Ba* z=UcjtS^qcR*~D}EKcB7k94ip{3)%ni3&5YY-tR_U{C~O@kfiqZe=EQBzx*}ze=vZJ zvC*gZFO~@=HMjHTXNkORo-I&P?I1ZN$nJ)J|I<5+r(gN|+bU5USt)Fn5Kn@F0htpQ zS=a@tsLatL3X=69At%Ys4@Aa&`Ipb2s!;qrwLWr zVFKp|9RI=oE}nx|DmYzbcNr@DjqyG}zyYqTPY>FI#LT_le8o4m_MOi$tgNig4g;J# zpXW3|X9TW#^6BZ>GwU3eW-5jO3vM{opL60TJqPhu365rsoeZszqDxRt_1I9GGBoT^mEk84-cyt&|~I9iv}gqDiIM#|NpY)T}>d8LN1G$ z3EH8py*_B-pci=Fmn`N`qQxR15sorz-3i=EE`Y^}m982jBngk6TE}QSoT=T}+S9D- z>tbvek3|-i+f9?vMaPo+n}k z0eQSJ-+s($>N)BqxLh zEYgw%H{iL=t<6*Ff_12$E5IjK`Gi2?UP5qYib6<&OpYG#03 z^Pc5_AO{1Er?mS`*K*K3US2-M(>WOgMW;#)5V=rT1p^yZb@8!RE~mC_&^jg&E+=3x zi}aUgmH>3(5#m;8onlAF)wZ+*j?Ff4y?g&sRpk0=yp0|q*#p@17+?R9tgGHk4l1cX zzWViRA`xNIj4akXWy37d01<77==;5pMo+735NfaN$Ke%Uk59w|? ze{KzKHc;4nojXp-eE(`8&;nz9(prV-&h6WbjNM%^w%e@izbEq?VP^*jCgH~p;pWA9 zN4egq#WF20A?E8!x1i&r0^>husR?5V6`|nat*nH6;+ULt?KU3c#C|0i79tS)o z15jdEu?b)|K@CSfD02{rMW;y03O<&=(P22s(M)*t7iZN+0%sfa+OcAnH7@Dj545A> z&e6dkhg1ITa|KO`@ed!?PE2^9FNj#1YObz4sl?h80IYP>*-@k2Cf@!cLmaMQVf+OS z--q#|Bgy%U$s?+3)H`q%wWZ}goSV;MVDp3d1H#yt+@hid8|{=&_A_VKz;RbYUq@Kj zo?sar^NrmOh2)bbXRGv+^DiYa%B>9QIvj6Ko*lH!5qGI~bz(|{CQ&xLg4^WV8=B^> zj%lE?6B{)QHC!Q*5LUt;><-DXhjE2dGRj*bT#2$(lW zp8A^meI|HaX>{m~4v*+!fTbEAssEr7K_fP*SJK`^B?wgi98hvkk+gEBM zN-eFDQ8`%*zXIMM28#Y}i1H9W5J$J3(*fbCr{1c-T+{DECZB#pRRzW#`j__8&5Bpx zmo4SIEOr&m4S=Afjg{|HFXNU=v(vMg-{A^3)c*%PI=Lxm9t% zIZ7coIk~3S*HK+^ss&(j;B0??5Cv6-j_zpD`25z}p1wv$)r7mSvj&sPKT%n5wVqg5 zeOk$?J_>RL;NHjtIGXliTU&;&#Y?rXfNEeSUkX{6s9(8t`vy4;L(m={iF8CTq&~WF za+mx6cUJ1I=17sI;!V2HAOL;MY%ckM-&ZKmTz+hrCaZTZXt8f#q;Wc7E`STRgzc@p zms!MI?5)3keHrF)FzYVnO8qL<4|gVqk?RkZ{?}cF_{`Pp?Y#zqb`Mhe#3*mT81NmxR8q931BE`uj^JWhwG}zhjMw$?Tsb zW4m#?HbD)J_^Yb>?tV6Qwx)C4PG$i*NP>0#(9+Wr}%FvH@Te2XU|mcYNd(-Rn;OZ zATVHHqyCaWW{j`7t3~@;bv&q`)iiYU2Xdc&sPF{Cc4WfwN0O|kmIZ~=Kwmz4b{D`# z&T?)5H(x=Q2@7ASauMb#+P!@ep+*tCd21_@+p^wNK1(G4zEcly-u>Oi!>wL62dw7E)9 zY~yCr4P@}{iScEC|3Q&*k)^dI+@4*smk3yi;G?PS?Qt4`+6kw$!@=M4P^wB<7_pLK z!pig`wa;&()xDXYOr-s1UWr5E>5n%wZ_;HsxynrnOCwb(5AeqYRc1UC^%xYRqFOc4 z(Lwg${XB(zBMdxR3CEJaNf1Zi*ZyfLQ0l%W3 z=A-NghqJTogKZ}LNvJ#2j2y^dLQJ>HOshUB1-Z~cr{|ltP+7Wyt$MnE$+)x+yK+R3 z6e{XD`47%TDhgj+^8%YTQBhs7*W_eo_{-=Rz%sRlrcmYoz`A3{2WUfN^k1H$$)G>T zN-+dY1rT5u>!ZT`!z{qh=kgj-UZ8wVVXJGD{wrF{R1Iaoik(61HK>4miUyRcZK5+0 zvi;XdDvYBxs;cq!?^h$5e}OnH?WH?OwWhM z`x~-}8dq00Nkm>+6ezCy;~P5?-RXN8^Wz^{fPKsMIF`+@q_p($f1y(rRQ`gQx4rt# ziMW71Oqq~)Dcj{wWX@;Uuz_&Od~Cdri5Zpio+&G1tar?Jo*KK~2zH0iV&mW%GaELF-{yEH954_L)aru zxo#8y4Zg{yi^NpdSd0bq^_7k|xZS#Qhn0N*n-Jd}ehns+Ab$HEk3Bnx^Oqq0dVJh9 zh-@~blg8H>^dC$uM)&ZRJwT0)XPW&ld{E=~pSBQJfPjM!j!{$)WnO)D^4Zbm*e0KW zGE|GU@pC$Ntbbl#@+@A;T})YL=S!mEWecSPr#;g2j6we+J`u%qUQ}pjdj7OCR6omB z%)h=A%3VHo7D{*{E&W&1{-`g)Q5GgZdqI`~r{G{z&OI(ee84bZ63=XJi!>}-M633D z146e@>0o2zQxqA#s^X8_yxgop!G zh%4S=17M)^r-`c+8V$;Cosjeja7d;m7D%K)yXka0&_cT_R#;w#+U?jjW$-Z@J_7B; z?*RhU6&0bNs2n|h;4)CsC=Ew2zMlT4GK-cqN8_e%gV;Pe7-I5C-(ea;L4lEx(~Kx} zdS!WFK>uvnx;mk&luF!N`TW97l4^z$AYZw2LtTvDTc^FshdYUh4$4Jg6GdO zh;Y5W+`EcxVm48<+B1 zq;5I;{iiPpPq>v-^o*)rv}Y=oh?^!Cr9=&z&zhQ9d`}#=aTG3JtTX-OF|dPw_EN>f z(o$#REWam){fcF!swR}-p-VpZzNmfSF7qWmdSwlMMh@)8sVC&Zu&!|#_+KC zk1Eh7cR;8TTUnV0f#xo>jG<>q9wa52d~;oO)9|n|)}LJ?=u%0n&2vy#-`d3FF3@VC z$wH}p>S}7AC3%>0S@E+Z?Zti_JNa1>{p*RhpMC7uF`!Cw$CFOf8S*_;`69!Q_-T zF6?JTb0aD~T8gTSp!z?&MdvP`%Q7g_@Opf(T-k;01blas6n028N+rty}QAQyUwS4${mlI!#!7 zkKKC{3TJQaLJqF(Uw`J5NQrF;;wE0Uw<|z#lB=`mQEXtGmNDy<%E83R*<4#`-$?p` zv{7D4p5uv8ws;(G@Dipei>lXsVGy(`jtW$IlcAdRtCti=%Tcr?W?VWu5C|#a}I)|pUy87#u!XUr_ zeq|%O$k_m8ncZh}xf%3bxh5^Mm+_US{y8&cyO)=}mGYI}CJ54Sp52$BB>h42!o`%d zD1X&}y~T)qc#V64VwIEcVm>-^u>5q~A-`o~BzLyt%bgT!9}EcPzW2zBtmo^qd*7an z@0<$GTtTByyL#pL+=17|MSCL##&>jt+Rxj$>L3FJ7azNAEAUf6QK8vRy(y6NFmFsw zOPQ=sHyNP-zR02T^M|rJ0Of}h;ERYzYJc2#0WJt$Vj^?0*1!6DdTsy|4&E~$dtB*b zZ6EyoJBFHp?8`KHFSyzH67sqC3VJByn_WxI$nf;?(UG=8yL0D`uQ-9AxjA;uW!2$V z6Dgr2KQO=}1cvV0Dqp@63Q7nOe|;#u{6_j350~`@p@g3wMRHQ_Z<|nG!Q7TIOpn`DcaASHeU53*-ynn#yJi$keDfcBNkq}g&pusq|JVF{g zo%D~5T}$#Ku7kv5rs&7*oh{cM8Lw)OlwD%7Xu%k{gCi}kiOVfVhkl>tL>R96D|eO( zp~@PCJG0)g7W2MSR{pJ78t#(ab>|m$-0SP>naYKEsWXr^f@NvEyYA)LEVwQzNHiVT zbJfiqi-;hgIOpjd%W%6%6GVL@HR7l7;1lFVu6WGa%sBP zK135pODZeV+bVN_msnlQaq0QP$!%}5)4fcNm9@3{u}>+LiR;;IgiLmXKwvpr-5lHrbXmJ?>(XYc2t8IdD3%juewF{&l!T9*Z@P{@Ha->^ z6Y15Vtu`;*w$_pzAaLfAA&-wI@QL}OV8u|GDS6W=Y2eW|`evWSKHV&}6gX#l|3XD? zUXAOuYiryGH7$!}4;m$DgH6m9bB7e;mzm<)`gA8mOW~ zBnTP`B8L?W9mSX0~%=DlME6$ZmH#HRH$HX4uA4VKK3FnJ0o>jxE}Sy+cEgJD#w; z@-CZ|bqdUEJC3uLf7$EpdTR*N4#i7>6A)Z09RYNND8>Wxk`hmlN~Y*^E$qyXQjQt^ zjuG&HtnJP04+qISMe|^&{>!uAE$_wNJ$DQrwabah5E3r+OYyy*xZgF@A&_UiiJTg& z&3dcBrKS85;}JQ1+eK4b8}^c@gI_#vB)CQnWLF)YG6Z@^nCPZePV#W^%!2E@kle%9 zxAN&*u;@fvH*meu&kaw{M7EIPAXTzoH&2Lo-(B_^s|PR%znfU>1~( z(ZW_$RwgEW{JNQYOwl~F^iRGWxi7yx9ZhSAl(h;_f3WN`%vH+C`3z3$w>^T2`Rdoo ztq;x}AcEyG&ZXv&(|%vPYVKZ_u5n;(yC(CtYy6q-$St4E48nU^ZCCrVK%UlW}+`OYtFVBaQF|4?(FZM9i3kO4(Rc`?PPDY zrrPCCgi7?sx)f=1HYRKbmNftTXnypsp*8bl{>hF1Uw@J$1-{G9=f%!VGn6X$OK<+`FU?_yqas6zz*z37L(Glk z<@aSafzGGJG)-PoBdT`%s!73dRpnyI zqdkJpBb`NC+H!^B@_h7?;t6TsV)cRL1my34D6(wTvAjpX0a9JhPK})$rRK*vrJVQm z{lmj|4@gw1GuDG-Ja*T1Rn+RD`VB5ERv)ht#m0c=cumjSOUI)Me&bQz>l_E?6Pgn7 zwe4KykiYW2(#(x$bZ4mCyb0A)8u@9GbRhbciHUDEMJrV@X3E*=a1_N`WUltsjXU!# zI&tJ+>5UCDLKml#!-L01CwWK9Pq9G3(yu*l^XeK&)hT-{Q7kGlMSG9K(UqQzx!JER zLi9ze30P`Ux}kGAFgkw|TzPAwd6kHW2<)Z6r|Y%3%&beJM*i^iTLCrWb>`1zZE(R# zYRlQ_pzkw=An_I0tcI$MpQ53oGMSpT$HuoU%TROKFSI}Nph7O8D>a?#wnLd8F0;#R zOjTX6Y+c9_J$B9pt0Z-Vn+$`?r1*9T6Q-vLpU^?zOYj^p#0yX6g0;lZA1T3os)BSQ z#H*JU@*|}p^^(ZoZ|vxBr3E+H+y!1X9Vtu;-Qsx|*S&jRyuSq-EZT#Z)k_>-8m}}5 zYIem26nEWact{VjV27g#p7%epDwAVcB4r|?%UukW+4D`uN9?`R6BAwi{jD0MV(OPy zekczF5OI8taq~%|5oqKwt}>Of`~W6rEkS^g+q}HWK4oF~V6$@np`l?GjI3_$nX6DS z(p-mJ*?D&~_RJ43(8F}Ow-c~+aDeiNiPBB}qvIWy2V&uQ&XeE{w79z2W$nBbbiTM| z%ca@XhB8Gha73(~f1Hx{bl~I9fcI7GbSL7LY$(s4hY-_gA2q)vd`v%oE^v9nWD34p zQc^BF;b8K`t~jk>^v&_2aijY%r9A0$%5$HXw?=rg8r{P0ji0ag!l1w<9=yRMsTOr< zAu7m!eP23Ovv6mXOIAU5G9Fx$^LJ*oz(Hv{7N@!^E|y23QvH}{)dE67hc6GE6%K0c zOG@n-ou|nrj?SGy+tX0ug?$_@?^Nsav{GDOnVvnv4e*Gd(E4T0}DjJAxjb(P^ z#-`SpTG;5Ecei8D{vg(pppNjDmourzyW;Y@fVFCGOyw>?d>YcO(9@Hb730BuljEIG z6z4RBx#zpv`_sRUcPlOzi;oX(Jsr!N=o$9<{^d%T^ASHn;OzM6jXQVjyVblQnk>Z{ zcD&o_7td>B_$_0i@^v`hnufH2^E~>sI~EGoArT?I`S~nb$&>}f#ViI2nU3S_!{$u* zcQO@CH*cEu4dJqrD7-cr)e#om3i%Lrqs&ku z^!&DY0JC5>Z(;n!tj>vnhRUL?6AZP7$IY9HP-BDIiFbRCrIOe+zrR05z}g>jLTXTO zaO9!!Pv^G%QdA@d5oi%?*2Itvvo?`S1i2z#8l+}c76u0E9BxJTi)v_)qkMjT6&<~2 zU_c1cXTbdu_OphIQpDvm|FEz;b7f+%&TDUuy8~8*`M7)sOg|*!W@@S&kxTQaPt1th zsaT%?-Su;W)ZFV zQDGhGTk#GzA#w9mXN-63#*I5#_06mZFgQLd4X8veBoXJ+1%ZkhF@bZu$@9fdGdqrnBYF)7sy|e&zZRRsPgh9@dtc}{9yKE`&jkD zLY&ZFQnI9^bb6WXYld|RiVbdkqxE=*JRx7B1~%0_d}1S&#i=P5NFoG;#HXM>m8O$^`cqjIsO?wfb11khImv|r7Us5Riz`r%l!m=pilx2|#^fX7;zzv6d!+OJw81r zLt{1N4#F3o--N4XH=c|lRYqkciQCP zM4uD+^g3X>u^yQka%|D24cFrvm;zI!=s-*i3fMW#jt#S9Dhybjk$?BNM~sC6+{7cI z^>r}sj7EI@>V|cn@XE9I4!mIUbVpy_Jf#dmfsw2JZunoiB-eP&58gLQL|lK?kehg) zi1)}Aqx8?RsitG#6fs=C1_(cIWJu)e&M$6fO&QgAQ_U}leF6F8ckFEF@T2T<#532S zjyIaHh)=wS6^Jf@%sY6#)?MrHrLNBQVAUC&vwL9VSENiT8h0ko%>d7&^xQzOIatwq z3a8%HxVSj@rt>WOgz^^W|6+4QLultmveC;ArFx=8#P+d?79~_AG|>hKwCNT8w0bB1 z!l=Du`ykye2N`MwsVDVGA)`ih<_sg~tcZ z)w>G>2XA|+g30B4j!zcbwF!xc?6dlQpGUUfMT$qnI60QKq+^a+5w-bm5S;lG;;gk; zA%ugm%oq0~GUa?K`CWTF=iNOh+80*i%LjzIoX-hV>m~+cjBrubT>K6WtoUsf4gEty z_x}#|X?8U!DvQeRAJln%^Tr*>2{T2I-?Ke}`*eHI`BVZJ5QSU=+Qm-Zn4Fu)gx)`K z6wlkohHFQ(HfOo&qhqM!r@KEpWO7jC5L3Z^3K_DTTwL3UDpl$#am>tql|0ra-}Am) z9(Cj}McjtuEpqE^b>e8o?Ubuq7nS9vhg)PY-(A3@LCbCPP0DiA;HOR#2I5|@jL~ZZ zDq#){X#Iu^i>(j0l1kHW{2Xr}o*X`FB1zqtc{On{OHfc$w6$;S)K-<9yG)mJc~QNz zq)X0A7PMB%_qk~C}LWQB+$C%W?*ih<*5eTtgiQ%#K7rdtLd3J#r!DWvDpdp8! zUImUDI>uk@cI}VbsFQV=t!uAH%F6A)!02jrtA(khmX&1o`J%Z_r^(S9EJ!ba3_CKi z@7J&2%%kQ)c_>i&Rn63N&T#mpnE5RsVQge^xSXv#ssyS-RY{{K?DT7J3CqNA?EO+V zq>0$0vv`)5KliI^&z2R!Vq-CsE8^33fmXSoh~0dneVDk7_rr%*;_rFk3hV0Xs%nnl zMny;4oF6)hUEdro44zIDnx2}fsXbe5>1o~35Rc~aQQTc%VxLih<8*?CL%sW3omZx^^Uucs$Az9}&t6y!O=OYxbCSZ2z)vR#0$+esnf=Yc)X>xf596V!6?B;Jmf`R{m z6^sDDKSXmzoyu&<;TB@FSYm91&;Y}ZYfzfkO2n6b7#+%#<3HJQG?1fbS!^dKB?ahR zu#(Cd1saZgr+qrm6N$t#U$f@0hNhq`a)WmBzX6Pje7CG0rhX?lhjfH2U&RFP5hT>+2hs z?8Z3t^gAbaF3kdK88}&gJ7I3lt@%P;AfBQkMRLlOso7QZX9n*p&dsrV`|RnUgC~BD zA^0T-eVvd70I2&LBmCXq%|F%yU<$%@L5WSzj4D(s8PKBJWDpX|dsuYbyJKl7*e ze~DK7-!Lp>SxH8QnUg!)q*16eRBk``%mdkV|NYnz>E=OVQ*#OX6Y&%HOLzYZ5Fw`h z`&a+*RM-_okh|hPKmK?ABm#{a0dDnx{-JY!b;6F0VeTeHUSHVE$t4fNc3!2LBO?mj zkQob@pMQNAMLvz`Kd;ZE(O)J4L5|M>{4eF1gUKR*JW z|9|;O@3?^1KePbjKoAUv?z{_sQp;o7eAs~6Ju1THQFP_{yi z&+e#AW1Z~?3urd3af!z=1^q&s8E9=*+pDaG#@*RIn6`gtggxw1+RmR^7q zn^>79WM%Dt9=!bKu*-AlS)Pi1xzna{+k(dN;M-_Q^~nV^Ph2oCb{s!>UZgUE@5vt( z71lTw^S;9Uc5Q9#XG@UM9!?6!3)^WwG&eKhmZDgqMZYpPwbG>f|BpqXJ1D25^yV;(unHkRX!gS|Bmh#X~D?i5% zBDyr-m#&BNLXp|7Z zUnrG!j!cV4@Ffz6g9Ori%ULwDc$+T?OicH2?yKf1;jwAohLXm+_~Ou6S5Hsp?k)$FMmio#3HyWZYj;x6NlY`ab#1G?} zHI`*e%&Zc=uQA#eJKo&e3?DrFRjc|4rr>@AQ+tYuP-xYgoO(|D4kT}h;~_DQCskmO z)6>^G+JY}zR@q*RE0`sfk;58gw8#Ki_8i`q5f(-#B3k#2=k)69e^;DI0>?I>q;KCk z`C3mnBuZ&v`1v(JpSj+bb$_iZHFJ)!Pg`qto$sr;j^zIU?(v?UsbCS1bmitT-;S{=A;cD^H=fn=FTYsa`kg0GlYci zSFiPCgF4gb>|=T^@zyOYNXYoPlc)t4U&G*J{N}|J<-z(yM{7X%u(0m>aH(rQeb{I* zpOTWOv>qL#M8PfjCFncZsmRY?uIM7-lE~ZT!)P%asAvethmYhDzyYXjWJHN}s5stl zwLI=*GwZ2DB!8?|FpG(~^`e;|AHiUD^4uHKc>lid)bUhWHgr_M*x@Tr@^%sfPGU53 z0ACyDDKbwg2my&0=`>a#VS86`ao^XLVB=vb^A%R;E4MnMos-}KD)#9xns>gRaGJIB z4-1{hHFQ6+*&QdT(0od5{}E$&*9>vgf?4GOS+tI#51|}`=4PsO9*x~t!Pr@StZC4r zK}tXnW(4FiLb03ZkGHyvXXnSwO9yY`F@N2xJktQL<}^;L5bH_1{P4utnl^z;F3a$h zqnyjrO@w%KXvd!7FoXRi-%ZT5&D@Uav(TKNh#>W+>m&RhS(x}@_cGHVimT`MQ1iz6 z=sNkM+2EiE4rdf_I6-D0R9j;zvuAEnPOK)z1`u%}9sMD#DTdoNhU0S48KE37e{mG5 zVhUnQWJ<~V_b=7WZpuGZnYO;%RthlO9X@xM?;mu@{yGfbCkmm>PNWV{*^NDO%}AOO zz|-PNeax-J2FwxQOD5hhNCPeLi`!Bd!JbomC+#g@VSZ5O*2N= zRr!A`N5gqQNI^=A2k;LPKLkRea$rR~Gn$u_yU%q@PRZ!NC z@BgLFKD#z^`goTAA>0;-gOOvYhn! z?-=JVxaC+GeBq;mSOr7cJwUbd&NeqU_m!VU{i5PRAhklhtiB>{|~7yfUH* z5TyYE&w-frxQQukI(MBmy)H7k{O6!q&W$^_QcKeQ0$dtGe!ui+kgRG+8OX-+z5>da z&po1qQ)yI*mX7oK-q?bN_pM>Tu7_E4jA%i``IT!IM|ERKbFs(}fDLB-30^pVO&M_& z&VJv!ErcEKP!RIthYYd^N(%YSU;G^IVOwQ(8K<@DPz*s`wJB2yPyxjFeJwe|CHEdlJ@N{z{;i;NougA1o~3XmzK*| z$?e%|Nl6WcfBMe@-dd<&Z0}eV8#jVxS3Pmf!!58_i$z#eOhi&bYb@zC-@xD?za4eH zxf!S~>Mknnf2!4Wte>QPkIN=O-#t{z9~Qx5x&k^Q8vrypKPvXDnwF?I?s-vmZDrwn ztcM-3=G&vH{a-!~t8O^Zck*`ca#_OgD9NgP*7t;jIH0Yzw)d9{CnlVl_8aT!f&u;3 z*6eE3Wi>0EX70AUQ>c(#JPn73rNB{l11OH+|Dl~Tv9L%=Pfzc%1Ue&8>-@(%hrQZU zg{%SP0iwr`=P|3#tD)XuLC39{C|@ zIL-ElEc#(pNP!5-bJBzPj}sFL?b@wv7^rW|4_E~q9MS38N4@<5(7(+rF#)m_2-U?Y zH|#NxU=4!X_nBGqVA>U}oZ>W>Ti>3-ll_Gmw-fj!{Y z*!e$yt*~U!%^1jT8S&++a*%^ zCU4(XSHv$%8bb5m3b6ZYsJA_P61i;8jwCjp`~43-kV?K zWOk1aqr7)C3=}HiOQ*S5*sKP-N!^@NX*s)y`jGoV0gk?BmE~}6F8=nKg^v2m7ePCN z-I*^}yl>q^o@O`7r^}Eg;~qdR^gWJ7ZtA~KPl2`j+@nju$_n~wDgN;aF90z@h`GgE zpQ@0O()RFs=W{gC(>G7%N6$WZkaU~mxvHvad~2oI{7rD4_`j%o>!>K#wr?0jK@nji zN{5PqNQZQoAW|X*-67o_gQ6fch;*w6h;&PLGa#V!&@lAS9q%#j=YHSkyPy01-tUiR zJ!^gQ$KK0XdyjL?b)DyV9KSk-e1=7SO9YIx4yHF3mlh}0>+9FlPDLsolZPs6CBKqd zF)R6e-{29WWQEc}cduh>Z7u#k5ffeFZyi`Aicq&Dw6Mr1CT2vJ)h#50-foKk=*8SJ zb8;YC%ERMG7_rTf@sfjRda=jT>y8fGB}jKNLRLE3lc#NX zRZ)nHuZy(COm{t4J@**;!@!n4c%r4D zQV;aoexVka;dJ)bbxu9edD%59X$5kbkiD!UlH4N-I;-&J{Mn>S(=<&0vG{78yjlxvsey*Z-H0= zcVDrQ4Q@DfU#6yB5~!q|6#LJ90g4fHQ@t3stQY6a zUpn4++!O?Qt{oI}G+=h7R#q&$Y%@-Ay@2v#*_<404cZFl#q$i$2~)$NS3BWboIhx> zJzdrnoT@*&dti3OF^ki3`-eB0M5bNKXmw^&1t0t*Xb+1jl5==X^b)|kfNS;MrvAQZaea9}RRPb6}RTc8&7;(}% zO4Try_yH**azNHRfP_v^wdI!>)xJLR*gSUkyj9Lx zsfFc0FN%tGYx7E2%t7 ziCONw`;JRPiD^5MfKj!4x@|ln%Gr~G+hH3>orYWg6+z@^Ic9z1Vr5!hZCsfABCo)W5V(&hV$K_Y0R zG0@ebt^tO>AMC6&q3Z)du+h^LlrlH|TJpDLf!@ia7_Z1o zr8GE_km+Ezw0}*4&+TS!LBU{&IV+&C9f(6)&=O29OI6)9H;2&w*^>QdD?ScW0x6V% z5gTcWd1j3=+eSiOc`HDQf?o`J(C8qRgJ%|?kQ}fOq%RMnHmS%SK$Rcm6 zTH#r!v?95WKJ4$yad=F!ff?8xy%L)d#clsB_rv{n?||cwmG>AyoztZ&xh|U>tZTE9 z_~uaE4w9Zz7F{-b1f3TOmeI{^t?BHxjsTB4h9I#58di_#X-T9z5`-ibMo+MmC8{0q z*`g0!o;~X?FC89c6aP^ymYq0U!P-A`sQ$4N#GA77Fe-|%VI-lZ>p$3%5%lmtJ>s`SIs@q?>yjJBs{m2K;MG|H*23IkGx!@u@-Ya}abRy1TojVYI@ay*;&v znE+t0cau!?cPp|LcoEB5IejZc(j3O;o9OnxwZ8gNu+en9y0`!Bw^`$>ibO-f=O;1ORULmNqm!ZOD>m4Q;&^JH(MA!=)`V0kEE-xvVr)?sPwm4 zX}YBylTHv!OY)?h!@*P2Q%2$Rw_dEnruTrb2o$y*#sx*~}gA6o~926Vj-uq=S$$f~tYxZf&CofX$3CnsSF^=&oOpPu7|qp=}2 zg54WLl1n;X@6O-8O%fbj#ERR@|DlN{9{z_W+B4f-Uz)|M3jZteaXri})N%}f@m@At z3(uv$rs(CV!YrFQ7%BJVKr2pSDs(w%D#Fa%*dEnLhqNFDh-TzbcrrGNJgN5pwG$t1Q945 zaQ!5tES8(paC5Ty8f(`{6lJ(YpLH?;Yt$hZv^Kr z)bPvL8`=MYrRiW?OlYfo3HlfiX7LFK`tqkK4TlL+fjVel7HI5=*_FHC{lfzxaij6O z3RIl%zovlx4Qu3@qw;2FTDxsI%MuSrEl37p-dSsO01^HAgB#6lZNmSW`I2CL>t4>q z>1B7WesZ#9INv{VmNE#*(qU|$^s!o^NI|EesWB{pKM86lyv~GqT4i@AuW;>JcbL-D z!fXK0oN3lBm_f{PGAKPk6u`^vd=+ZnrE@NGNBgjyi@=m^DE8^0f*~ejT4SA-n@5Q*~x}d}d3k$d{VcNMB#Su#ckgWkZ46&fJ0TTgJnq^54kUmH!8qW~T3pn#Rjhw~{lBT#{Q5lmE)*iF)-F+X;w$76-f=CRXVBT%7 zKBfhEysZ4=CU|1XzMFlz4`embTx|yp8vyCBG}(_|*Fp%d0S`4u51UZ+VX(s)2*kWs zVpP<9L|yxtTr)ifbS=yJQxtduCFWFM>i`@mttz|on5*IcN>^D`H#%2*iD!?pW;io6 zIOt#6YmwAe%+2*H-UL7fVNo%DHf93gmw=$DFXd0mQ_GsRL{!vNq{EjsW3@^q)8eKM{%)SQ{C<2yT7j zg&-QR5!g-Cy_3We-GQLM4N5MYKxRe;nY%C*Vx?YfiWU_`QL?0_g@r~m=0;O<{qD=x zL*0V0k+2%?n#d5fM|tWd36_@>gZCg2NbxDAzwUs1I*c!EAY`$r$lS)+-o(zBMKJDN z1QTa+(SdO0p$iRYEg#YG`@(e2$8w|vPBW~Pk?uKwf~6%_GQ6aEiDY0aH`P+Il(d?> z4&C2Uf7oUR2d)j=ut|d*3RFCG-L3wcY$~`9pBgHPPtR^LE?V#Q)50btz=fVWCmT-5 zREFUu!lsOj4iT1p^o`=yDaJbA)91tcFD#%6)5pY0t*E{%wTG4p7hr_uHCTT?%H4BK z(Xo;Yfr&$@+~48*GDv=0T|Emi_e;GeIqFsM0Qk`)MmFUR2$ND>&NDsQ@;s{WbO7d4 zK)bRI1(Fx@uuvUOdMT;5`GHPoB0C1N~1RI%poCs9rtW5$HH_%?ePEXR+@aiHl?q{m}IqJ?t<0Xf|(C9!Sn_!cUtL zEj9KXFRlKqn%>rMU7vH`-mAWLl{b{>WZeBo-Rf_~!xg(+a+9r3A+v=F^_MkM)y{ed zPCBU+$;kj(GtmDgHL|45jXtgV=|BplUgdibU0?cn?V69mOgG=HkVv!>ddbenp@N@;_xuC#w)@h>*^&5+5zkrjm z6aMeX=b?TdNB;+D!T&E5JNar@`zze!H`=OZRI+&v(R*gMaJiFm0q#Z-OL^24JvaeZf44_JA51 zm`V6pgIDq-{Kj1qNr-iRJV+omI$mL_9ySn>^g4!dav(e`?{eHp85yPlh>Ja^stF*? zvPDbxjkb)Oyy?>FxgEQi74*PP&Km9HJ4np}$cKyrIntao4xe4$e=;j7<(@4Wq`g1i zwKpVG?Krl$cN~If!+nyH_TFWky?r5@oz)5~fK||eK>yOc#l=8{x`}JY#grR zkUX`wmvi#2dUv6pQ1lXjv3RMkNr5Qd*LfySPs5*|H#nYfa-8K^T9PBxJKNDb+!Znd zVHWq%jrc+9+y9Qldr*Bt73M6OT3a{Qw^KL^k-;C}JZPw|Pk^8g$*6+uu*;c8h7YS7 ze!UcoTYlZgN|5vQNAw>b$W-Xsr_NAt4FSng-`*Rz`}I1d)Rq9kZ3@Bk2#urDLjv|f zq>zB+wMThDj$Qj5Kj!rsRE$v4cCiyQ9J-(G!!v^a2{&2%3IzZFnS&d`h*^O@5L;)q z)wJXh2S)Mb#4<+6n|w3|M4sRme9np!9ResYF^wI)aOb~E@7|rpr=g(^uJ$^(lJ*N1 zc6WC{-FJ86!Z}@t*%vyQI0KwW=@XTDG3(<{(7U$8iw1+3eY*>0(}o`%Y!4t3|Ao4{ z-@MdwVq&7z`DD)sQVzaxaF<|n{*B<9AlIce>d|AxrdM{;b$hhHFMG$vZj^*G!FZ@K zFAS5g*7L^2>JzP;HTjN~D+X=PVAKIlM?T!gIgOoP;O4H{A3oo&xJCH|9wd*f?U~*;`=3Z#l~$=>~if=@QX6?&;6gu53Fw zC_yaS>f{s+<1Q8|Wy6aJjbZ=L0{rdKa6Jg_7g2vPWKcODqt?-iO8GW^1?<_v!onY_ zO@!$BG6{9tHs|3CcnyGk6vW^DaN@k-SN5?OSYr;?mG-wX4|EBD$zB`Pum+iQ08XxU zyzmmfh0^W6)AD3)xjy$7Q)!rggQ4aw$(kl|1k-HrzEvw1YdxM z_JXF>E8Y5`+uMeRO+^{Yj)!O|uc-0dTy2BPu<`9(^Y;%n*c@oSDdiRpcp(7;vV|Zj zKKAiuu3qM`;TaHakva&2@&r%dOd&k{2F1~81)H9V^kR0sc0N7??j@E+UBy`hm(;NT z#PtLg<;01&a{(xIxji!96s_)YA=8k(1r!HI&2gu zBaz7X%x^$@%@+@glnWc!2~12*_F&4Od9ZbMZiea;(X&W;DOGB&6gR*Dw5z788pRL*Oeac5Zi_-X*dtEDTQ= zUI+Q0p|n$f6_>}lDNMN>$hT#1cUrk(w0m~8BWcV$p}g2Kxw0}L)SwBENB`GNSc4)x zXiDdToFu=0rWmfmZRgL&*yI&Q!cW`NJ=hAneBEH_qVRupB%mvEdW})n+~#=T37ME) zdwlO+4lB7vY%EYY&b{>nNtef&9)VP930)cXGndC*Csr~!W5htF4R!#SCkbG$bC&hX zB+)Z9Rp@e@bpd#j zkcLids6^cOhri&NZeCB3%Tv!R(ZoXg{)mD1B9o3z@E@H}DS+DgwG>J{qeD&WWMiyQ zO-^EMq*(b>6}l4dySt0^nsiLgB%Qp0Zl8eRBb-aRf0X#;X) zecR!i*)wSHCizIHa(eQ>tMbrImVYPypnT_eCAu4%X#eA>axJ^m$=-$D`|i;a(FtMo zcMymdTv`EWV|&wT>EzHH1V#;m<>c&_zDG+!h{P~WwRR!!xv_Np!9#hL>@s8wUq65D zo|&?+GHYmWKMz`b;`NZw==e8jQLIKO{nCvuUcSh;8+7-cn&0}=x%EV@GbwrcP^1Z& z^vKN3Ey~NUi4|1!doJz9q)Y={pN|frg-!XSlk@t$w3MH@1b~u=;xFokg07SEKB6)V zzGMN@>nVYmn#CmEbJ40_z9i#Q)APSAE*2d1SbmNN;v&%RFZATp8eYFGk?{GPKQ2%n zqEohM0~>p4+jgRC%f7uY8={4cpcPE^ca=lq#q67GGoL^AC^RL&W0ncIdZorz>8+p4 zlc#ox%b>9NO2$+>9zCGFGdMIC|^>ubiU(u5HDx-^uBo-wFo0LA9y__3$U zz6-C3HYvH!HGk?${q=%He9zT7|$BM-4?Cynrh#r^{S&{{)B_)b0&v=FyPkXnu z=yte!dv~H;D++Z%NJt1cG*e5P%|9Z3(@2`XvRqn8W-r>IXgEP+BG|&f3<-meW!CL`>`C8 zwE8~Jl9O0mf4QJpc~Q|j05gp{6a30y?`p9W&=h0LSRTr&+Dens&lC0%qP@`2(6m+; z!q6yMFepEBxxcS|wA`L5-LxKls+fTvE}cnIi}arJZF!?eCpjWK2s{2fy`0Y+KnHg3)SWJ z0~E=%-dkl;1!~zxBO1u@UX*` z6xK{qPkVb?sU>{tiMGoNt;-plES-ZYwL`{uzxJHU4{)Zq_9w6BO=EOT^fu66#qvtZA)63)JZ0+GwN|(Z(9of^zWJ1Im8bs z-EEd7%Mw#I#IfkgK!Ss9VI6BThxoBXNhvomKZ(3S3oYpZI{ALkoy)klrT8|vX&)_H z1E+c8mK#q2W`;+9`etPHPPVHhVp1E+cRzZ>ww91%j+44kR$x;F8^+*)2XD zXbbS_LaH2ppK;)Z`?sR0PKkJSkQYkfZu>q>2!7)3{)Gk@QUe{0%`0IPN}*6thyq3q zM1>dxw|RfMvLr}Xbo+Vbri=C0uc>;1aUve8c&x<8DLuiB0SYB@3cB_crQ!{EqWn>2 zMhAW39W4BWLIi!tY-UPsovMy*A9I?+N=&qf3D=$s>DcZBm$WNQ}*`=^2% zjGp2Ajg5zE&egW*Is0Ym9-f}*-@iBL=jrnNm{?g+L@A_}9~Dl}BvW6yJQHsv1cqK1 zED&gaYrmPE%)YowCz+2500N z8d*Oa?COgXy1?+6I}@#^@E&(2u=0w$>w{WPV39chU7(yRsZz$_0@B7HhHE0roCDD#f!&=4g&SQCc1nv)VyW_&9EAmzejKt zbxAn^k74q2-3m%V0#>9nm>~47IHXBmoY{ zg6pbu zdgciXm+GD05x2~~XABhB%Y;~R=~T%Z+$Uf&orjcD3QFGhyA2QeGF9&$cQZ?Pd2Kq7 znqo!zVi(M=U1N?(D*phJ8l%yu&K=Fx?iD-JZVEXNj9#&BX93k4Z&_TfDo5vJ&REUs zuV2%qK+M|{K96g_$-;sc`zK}`E%y>>3T8L;1g`C9Pxw=i(1q4goousTqDs(rX?g@& zEMdDJ7_1#G_JZ1N44!Jn>)pJ0(_DL}l35HVtpvl$r_X;SW%5re5h|6dstJm3#)}qZ z^=swFCUMuT`6G*-?ko-5J)WqiA1IGnfap1~e*EKH`+(Va8770-3Ri*Kg85#{3v~N% z)Lz9Vqjrf-^ElsKVF<)JC|`9f5<;F`0*P^t-sh~!-!oNa8D>0jC;`W8x{=X7-|kmm zD>5_ti|hILqQxD*+aHbn+H_!1N_Z@s$~6NACFY464a-(Ty{;Y~gUv zo`f#(E*!YTNG5|Zt7d`Wj7aV&us<6HF)Dzrw0R>W&+0c3o=1f%v)?wBRZtMgOThxu z0XhSAMk`HEKughVRZyTiF;&^LzBa3%38@L)Q%#{FB5^=N!9tzsac1M@G+O^<8q^j0 z;GruG0P+r{p0#<&-ps7oIwoal23eWkphf)c;^Oi_#1y7YFK4Q5bG=wxmiY9 zAcPv5?qtK9eiJ`c*~Lc+BGz7OvHts){+_0#zrcdHWfMbf0bs;Vz{pJL-pZx zA{KC7Y0FV~CuRDV0K_TLj8Dk+g~KR*Wxfqu+rS(6GqWCWw^C}UZr&Mo_``vwkSCu;v|ek*>#3E=Wyvp z)KCzu81kVK=Y-EpJ7kGqIG3>-I){9+Y-}DU?qg@h<+=_fLY2D@ryCJ^P4T7TdO-cBA3yF*p6n4@LnFCP##A+90ORjg#}A}D{f)2{!R3PqGE6!hC&#ldNfaI# zF72MH*i2?xUE1LO+0#>(qwTuKzg+*k>tt1@6xvZHucP+zvZV5PKklQT-goaR_J%Tq zDlk@p5MBAE{GbT2(&6rKRV}O_q1sxt+}Dx`F@1Ohf7LngvEZ4Ro9~7s9S+Q>N+!td zJaxv@MrabBC1$yK{q5`HV`s4rZFJU1^~;@KS!HU-(Js&-bnJG>YlGP#xh%gYMXLWRGgJ^`VV-agTaNVF3TZlGg+dgVvYD;hXRAnMrV|6{#iLEC zwl9EN-F51>)TSe#Rdyi~)Cfy(X!}Y38h-^yF{HNE4L3)nHu*{hH(QlZ&|D5K3BfYV z=Ro%a{j0~J$J+Kf_+o;`$Deq3RDhbJjQPMO0&P{Dc2M3ALzMP*n2vJW&EK&q>J|)9 z&taNZm6NSr71$rVkZ0kqmkz=!>B{XTT8+;>(7mxJsXExNCydUjs9@SSG8P#c8`+lF zqR|pYBzn3#8QAdSstMQgcBM8e98p}_70!3z@qCoT8z<2cFCG(k1M~ba!mn>+@BAxs zOM}K9=K~yyK2LyqYB%rS_hsR6ZL(N$a#`Hzmv&}JB{i6SE8oFLAndwy_CT_AvHXg4 z9ZL7gb&mKAlP(~#<%d@FI>{^NnWcH$M^7CR5b75VeY?p%Rar6y0cw-JUitZHJls3V z#a4qIO=SJ(7xIul25A|*UivIlk2}X!kE3lVTGV!_AHGX-SyVzeq<6u{4-e0y)s3xW zND%h+z9U}g@v1Bv&jR8}7NorVa#wBI+S}m2%~5`-(QYrbi;oIM9acvnNNYMuH=;#7 zedUrr5;ZsEyR=>;+$VbCvVPsEjIx1}bB~@aJ)K%%B|IuJ&u+dvJR)Ly08`hfbWub& zR_AEasA^;6B;|9}YpKKisKbpwDc$~UON*{{2oy|WVY_|VIZO=KJujh4tliL(S!w3S zXwdDBN#S`<7YcaoCspI=&h(@#4HsmzAHaaxy_}>I67R`6l}l8K*KT_bD4ef}>(3#& zVm0@q!qd|&c&*n$Q0zRFlx)+tZh_lE`EGl5ij?%M2cf1NiAnVu2)E!jhX$S9{?^B9 z&q1ycBWO>Ft=

h=E}I!%4at5Ljj;Am7$OL_YusC~o(j+}jBMz6Xg|#$)EsCh_ zHiUg8qw{S=%R3rfUVMSLV>`iy$D)|nG0he-zC3jw>PZc$p}J8mG3%BHgxks<-K5u& zf7&CuNMx&FYW@Oo#wa4`qrHiHWg1MaRNeg53)hNM*vvZcVvqI|I4I8(R8;I{aC^o; zh??2=@2{*(Ss(%`sbZHKuOpT}iI<{jYGzph;K9a+?{I+4fTf@!6_rSrjGHuJ(m|aL zMN)L;DM+7bxv#INNNP+*_M&1(TgUHO4=Z%85FBEFB4P(r0=o#D?pLx`7a-}ui$#F2Dit-&)5OSrxZaYY;K-P%G!BEr|-!hC56WlsV_ zh;c^@!GMU`6BzM9t?WZY@FDu+J(yo9cP3XvM1*9MOm}QWYanlGW@gy~8w$BDw~aX< zvd92rwQqg>)^=6o+?ETzuM>M!d3n<@G7?bFF?q+;dWVFN8KtCjMDxc%e6U2~Zk>9xVX?CaYNrRlY2z zprw>{Rilw1W72L_oD^+T*+(3DKbYNv+v(-$w=8f3%Hoh3Qt)};(ykVZ2-u(-Lnkm_!0 z%5dFCN#z5}advo=y)Kp!vuD%zl}&|4%lMDVtkMrz^51GCwMnzyoHH2hxTtmhS1*CK;YpFW*Gp4Y4u zzy?B&2V^vL-S>%Z!cs5X)az*1I$N_zQ}EtDcjQys|c*Vuy(kW1bTa zrGx0v{d)c*D!nFMDR4y2^Bb?#RUb!-h?IKb;Pw#%9Nga1rJ70E$K^?MQgi2C-L?3f z;bp;XtCQ%%`$V?(K27Jgc6To<)jzVnlmzK3-K{D?2|S^9mHUqeu(Pw!IpL=DvR}Sj zvA&Ts#v@VaHwfB2cvN>xV8@1)8?|i?IQ71BqT}&sPtWAxpe~P%_zAU=*YSC{W$2$y z&Ba+Tcl3j=uXI#ML1{WUH#avdlAA43(qIis)J_bK&}JWci9^FudurP$kBfGJ%3YkgLgOAwE7@Zxo#n4r{iOW*$^wvYn@Y zK;{pLCF@Nm$J{S6-a)YfO7ORSengaVMC@ZaP4i!_Etr|Z-+RM-$bs z1h!%q;DPbMmwZjUt~;k2wML&&?ib@-bB9Izd3B z86XQ?2BQV2DeKVa1ay)`+V}4tY3yh7#`E4yGfBMpZ8l#?5K5$Jw$B5KC75x783?^^ zs2E!Zi~gplYh8+(4;&r{Tx0b$iEWvF55q(~Ftg=bCW>Tox`gnlzqWe*?5CxkcU5Qe zG?cr2AUXLHNQJ)#uz$V4gv^1E*9#Yb8(}WMV0aw&N$}v*gH6{#k^BM=s|h~d?ccXM z(=D|03e?m}hLnZrB&;gz)%!AF<(rzBT@#s^Wlp7|wX#f@gs%9FkIx!(1xqpfLG)sj zUHFNR`YBQZQ6c?a#cI4iXz-iEGpOWn%Et%x_7q?MtSr|Qd+`Tr_OgsLmx_~L8OS~` zc>i0!7LBg#m*kEY^NWk4o3H1G-J?;L=Yyz)FeLYa6-<|h8WMEvD9IZ@eDy?nKX7d6yUTOx<5yd~x?MrO%!on@D zlZ=zk#i^7hcm_yv%71795HiD^8$WwSh`k3bR&MX?ERQMxH!w*-A*-lx=2PJ&U$xr| z6_-T3e#vmcuvU^BVY0zhEe*`=JPl3vpJxDUgQ__mvC9D)%H3mL8HAI}XV=*gS71R6 z1Vq;xUd>7902Z3u9AdJ4NDtt%v9t4#n5bqzE84K3$9B1(87PW{!zEjO>fFH`hNR^( z^MRi~VfJAX7*B+a9g(wERu+>=CkJ8}fi9~72>Y5smy9|nCUHU|e>658t=iW1IH4W? z%o$%Eqb3I!miYYequ;&9>a?H`1_w0(#06P8Ug+|eio2frbq>G-*Z1G>AVBBC+SZPV zapyha^GNi|GrB@PufgyINs`>!LVUL^9}t#H4R*#%UOPU(NY#UVfPzA1<;z3ZoAcy& zZN^p-AmAi4Hc_!@j+ZNhv~XCj->Lak`}D6uI^r6+Q-)?eO&kr>SL0V<}Lk2vb`JpaY@Pt!E2uf-N7E#Tc zjGX#XL=pVm>-Xm6M4Bc~y#K*Xt~ z$TV0AU>SJ`L%VwQGxW!B4!y_MPVC&FrCoI0DuD?Al@Z@SnwuC^|2{NX^%#hn%aRKH zm~XZ3m&+#CO;AUp`<01k> zddp_1s91&n2Vc=Ha$(!i1e1C+E51!#TYD8!j~OBKmP7OK`e(ffEe$7oB}d>y7>Rjt zoCtjZ4~*O8sWHHtVljUDTuoMWw@5NrnnJAD$_Om6xa{=s_>MyWKt~!lUT}C)c^|p& z*nR%`piu`$8wCw6jn3fnhxtv7*=2iFlh2clpp2WHRsJ_?P(LIm2MwwcjyrUH4?`dM zoF^#4wQuP)M=E$SC{nSdn*y0b$|PRn|7OZ18YRBnpaKAT{z2HX_(rfb#N-WD-6kt& z4XQgecv|9&e^m4lkZ3YMjcJv#im#9)cL5Xj|VjzP%%623E5jt0K^L*mv06OzwARxjZ} zH_R_^HMB!E4E&mU51L-Z#?rzwQc3kzt8|t#i}L{~(%8z1%ZYAjxH8ap-z^nomnkAv z)2kdE56HWmT$ue3IzOKekPV=^YkPb1vMm8ZHC?86)X>pU0=ghXqVz5F)@_fu%Mb6= zVoqk|!XqNd#RL+EI`z@>lh*+LZt*gt{S40%7>4W(D5&JJCEkW2mTrQw_fu(l48g%p zSz%6M=l$n15sbqmUDS=AzTL!x|MX{LgDJyLY?i=dI9#+r0g)T)GbYE0Wkc%faXAWc zRdfD01Hgw8BMOuPiW(-mb5KU58N$h~KQYM)Y7eNy(!Lf@pHGt5abGMEn=wj(?v`Ji z8TOsF@vHZ9!I(YoVOEtk!ju%#2n;dENdnJfIw!hg0<$bRqfv~Nv#*>1S5=ywX2T&} z$_CB0d+Rr%x@zBTU}T}ns6H;QPTuS>;*$oCe_Z_jf~~48Hg3)m*S;d1)GuvDdgHUyn3XP4U+FK&e8k zBuZSIH0>#`|CBg{OI=>Zov5hjH%QI!A(6I4%4^3xUcxi>KGF8n@SdAHrk-**};DWYffBJ%M_F zIF{>ask-tuX%&S*5edn2ZYnQT>Ob8L4Uf=jdc}upd7nSOj8mXrxx({)Gbr>&+(`Pj znXUSejx=adDHHW=3|VVRNx%Pz=v# z>2mFnd;FPkg~k4h5cl+rHyQRZ05s}SPUS+rdUi4LT#TB4kWil2GA-UM_FIq}a~nQ~ z*}lgRN=CIxGTh74X{(Ce*3@Gf5 zPj{6sC5qRURPWF`l^ZzB`I*1mX!w}sYPio4#KH^(n8m(LR(tbPWo<=hE@Ar!kJL7v z+F#t5DVXuX9ywX>m1B9V?{ZNTuypqgwH0$Rg@VxJr~QicSgg$E2WnrFAROpgSSXzO zjtd@@*T?v{#Q@bp^>NNiNC`OzJ;eY?x_%=~U!LD?zU~aJa|8o~TJEYXV+^kk zR1IzI?dQ&8%Lr|pcYb}JX~#h+z$^u$tfpL!c_Fp{&%38R%5_Fc8@FzH0;7P)Kg-0# z1VS9kqgUq*nu0NFtVv(~fIOYKMjO%?NrOq>ixgBcy1G}Qa9cjP>nq%X1pxTs$1vU) zd0s7-<+HpA2{IH~VN>MMsfe#X~5JZRn^Y-9lI|R5(wn z^a>XmXz2J|z1EWjFh8F2X2C5s$bmTq%0GD<8^clXI z`mjtk6(II!U*=SdKtBxKvetj4ADD5(dE8{!nM+9(dv1P+L&S+|NOEYo-co}8~w0MCP?c5viQ8ZbM# ze=|Gx&j9>(Q1h8#cpvB@eZv=mjc1w<{^5Xd^=?c{oi9%j|K&giw`KV~kZ3r^#eaSs zz5AOL`# z>prsJ&;en-)xfb%;!!8VAdKddf}x*)DLR#+Fx9(8FbHG!c&7@$7b%Za2zPqrP?U@sg%LdP9nOa^}(6VHRlhka6a`=Ep zJ+z$JZdErCF7GCM?ckRuKl>-(Zc3yAO8ZDk!0^?nFq4iZE58yi?9F%>1+-dPeRRMz zY^ipDk5Qu9diY*wYamQXPkWye86CpX6b$;}U4Q-Vn|S9Owe#_*N(`?%*UL6` z;m{aDU1w3cf5iw!HWRhco|OEdX-C>)7e>m|Gio zoVq!0zk-zCk_CJ@Tu-SY-XOeNdzFM<_(Q^QNdX81aL{d*Nwo}Y53I!N z49v^w8o9$u0H~;FD|aTH?8?B=h}Wz#0_PMC7`Ifo4PH^^lR0wSe%Hla(UMNV3WCNO z&{%%~TX6d#!fr)Ol9wEGevKb50steTWBo111WaHc|MLN#Fp@#y9`wRdNDPi@g#8F4 z*nof3Lz$qgqtOgOP*l)bY$$a}U`MuBYY8}x+BG`I{GjlkOYh?SIhNG>5D0kbr&?p~QSo4BYXSQOt zTyn4zjK6M`vl69V0r+ zPPsV&8uQAU#Yo8r>U=*k#w%<$E`u@?rr@Z&zUL+;Z9q4d;{US zq4ey9=0qveq4#W)@$p!@6p=2V8@L-?a&kxr3W;)u3f#`QQ~v3bE>0_4dvt)~yw#(2 zu3aMpP!lC)T?xWH5zA#uLnY6*Fgcib9lPSwd~N5cnVTp~oxq9hE;z5=b%J`q=5IEo zNgq;Wmwz3K6*nHtAjS)4mv6rF(F;sKw4H>5s{Z?nTAR&ws# zxfzHzw`f0j501szSq?ntTeoIOkOL(1NCn;t;Qf&7X4FF3RUP-X_eLUr!sY@>hLOfg+` zYrFB%u22kw%q(s#f5G!{r`w<6YYLeG3;@HUj#WvxtGZGD29QX`s5m7RdkV1<>v~-t zP-?TT0(Q8~baCm2wd7!|3<$2Ff5%^n=eT)AKs@MMtq=YqdD+jOKWpQ_3G(@uaFwV7 zY?TknxO}1#Zueee^$Fc&qZz!nzHjvl25+*nm-p)hj6DCpkQd=jl&>I8*m~b<;l1)M z=_V$$^!z}fn@A)Q=}t3h3DV5zWCc3B7V6uPHM-5QvFH5#p^<}?T@RZhobtHV64GX< z9@Ar{Kq&?f#5Ba(fC2e0$ya}ktDXo!uGr+{JuXdQrPQl&zzRSDd$VP;#>ExEj%d%5CS#nW#xL`r!OP3LFUug9*)E7qs0Y63F}IdJ#J?b2 z5OxL?Nza}8D_9||6r@{uFg~^~NA2MqUA!*IlWVqX=Q_ztofe{uNF)1hQqENbCQg^@YJm{~NbNX}y)!*IT5V-m>+k z8qDYB8XUa93sAaT_RHDP=mvXKB~i`K-P0yqTMkKdX!f`Ie z@dTxa!R|L@XzR<`X>0CNQ1H?QTWFRbzl5>kTxctAH1(%^MNMvg%l>XRD)hJOVC}>Q zxOhIdCDkSqV;EHN*u~|vAK8-gyzn25*d^f0xh$hVQup=OGbEFkG>H7QkdLQFWfhnp z!{anuG8m%XcgU(l3m6eUWL2^$+dWnzln3yD3#VXWD{qGs_J!;0fuB+{Eq(M>_VsFB2{|kz#OZvkFf!R^*-z= zmoyR4^z*axSG+^D(uuw;)hw+f&643|he9#p9T+#_%25IxvMhU2f;AQp^k z<@a*?R|3@W%q931lu|R=5gZ+<~1j0OOS4k z7CJL_y{>e>DdHZP-yY>|*-KTr3GzZHGx)jqdk4qh1aLV?C~>zOR^bA=2W^WJQ5vHjn$YHJ<-sr=LbR)kT9H% zM*P7au<{Yf>LzX)U%nibso6IOP$1>TiU~c(E}NM;iKkc!hz77S5{L%UFE4jm$~T$6 zyA1ORP;Nz6=5H?Hsu|GliIk*gWiRt_E}#Ib#m8ausU6XzHJ@5qhD9TXe~FCK0diQEE$8ZE5=+a@MM7Pk(iifUrdCZ>C7_Dk#k6?i zBh7zL)ZNC)ng=HH7%y?Gy1I!F*Y#t1mUD-#k52D|CzpIL&GX*~Hqja`CbLWboR|0# zaX>dTtO27CJHYW7L@g2k=yTu^OYf>yPMT&}0{wEXYWbx=i0+Rh?U(i)xd6fG@Yut2 z58A`SBiYA_#>dGayjJ>@?2%Q&rN2>1UK%D4p^Nk*>R3T`we>~DF?FS#Zv%yk0lHcJCZc3j&6MN}-Fc-aq0{V1Jlc(Q6vAs5S7O z63fFW%`<`9_+XxiR;n`Qa{Tx(;HM%)`sBrP?a$fS$O#&nfn`BLU=XcJ z?2Eq*lq!IA2DCc<-G+wacMzQkA_RAo^{%RzbX?a+Bj?$Il1dpkR} zN{>)xBC>pQ4D0kX*K|AR@*Inb3I)g1KYvdtde>6h-GM?iTKT}auKe6JrCIRbqQ=9p zW&6JmGW1%xM@UF0eEw-=)8L4_g5za2Q&S|Hg&%I9*G;Yp!7VG?iv3rRYw3L@QK8$n z!D1~7@$s*$u|V(XD_*{|Igr{+4--c>kD}!Q6IJhN-a7@+i`^r?g1XUfAvw&dKu^$} z$1>7DVmyQS1r#DZJv|M5oEmN&DZ{PZu-e}TD#3`JMgT1V%=4}blh7#`{@q(t>ace0 zWEYLK-QF}MWf%y_$(hyFi|YO)DKodXp2Z8vxB~8vkRV_9IU$gWi^rf-91r|$%66SaejE>1oI#AoWAT7c2hzEpXgUN;&@j)>&5gHA z_;@nJ0`_tLk6?};%=T<7=G6eU5v(*%+jDzCDFZ!J2;FT4W+?7%7m;XbLG>qde(Iz)F`OA9PUSFb`BML{PNzF#I< z>{S@kH)|~3fmX^h7l=K3?mSMsJ)W?RAkRBjcwar-QnWtGVp3(pfFnMi~?P zmD8ip)*y;4y{vq;a{FLK3{+t44VkiqMaB7+?J`{8pN@lUAAq2ZMjGTnC;+1NN=k3{ zw(enDso9=?g@|(EC2DJHO`ZXv`>mp)+ZO2jlxExxqgCWV6PV~08`PbgH)u)UCDl~+ zoau)Lqh#P{HmWbA7^pWFM#MUsD8%i6aTg~=x6;vm(e~Q&fEuudPc1l&Kko72iVV-S zMXU3%nuJ9p08nrtV^l{vu)WkUEpwAEPkU`?wA)z)jZ^lHaJHJ7LZWu$m!$Rl9>DS8sJ@C* zcKzlPUx<_W_zVEs2>$=Y4JR<(7T_uh<(v0jk=NO2_B|Mzy zHSgR?q-sD@V{*~xuJ+tP-;C}@$m7vH>0w)zKG})pn4lkB9+S7RIXA(T+Y9c+x5F!X zdY%p`6AbWFYJHHg6M+ySAVOZcI%Rlx9DdS)K{nvXA0y5BwGXVA*02Bi7l9drAWl}n z-l@BXW{}I?ZhB&FO3qD-99S9Po8zGC+sQzcZ0=FW7(VH$&mdm|fjoydos8~d7Q)|; zK@>Mw7k(!A7Yg`LjqHe#KxhaXh_ONdw6bqH5MqkC|9aRNV{nImKH3%j?>!T-|2tOz zP+oV+ACyG#QE;Yz4*e&#{0Pg`(-b$bi?H&=z;intFx>c;>T0q%1wSaa7cOqKjWxP@Ke%F1;RJ zc~Vyh-Y>AI z@A4DT%Y9mJysER;C&QYLfz$otG=G3WQMS`ei&p>0KcK%0-^1hf+#mvOufhN1$6En= z7lS%kaDhj!p!UQ-2D?#vvT+royMQSQiLT!^Jy~tGzQp5v4wzw(7C2nCbWHVl*@&wu zfu^W*q!bkf>WPT8$jGw8l@rXqS7czNnx3Ek)#y7tAeW|s?9<`EI3D#PEbN-cRwH`n zx?qp{mexq!K#%XqZbJ}MR5lM8p+{p9rfV`c%KfXe;# z5l5Gdq$F<)U)24|dkEV+gBcBz6_y0onH3kO#2(K_{iaA-WJe~6vac=4eGNnER#$#Se)i~Wko4n9|_ z$c&y3DCYp&ysNB_jkCQ%oh|r^@ZMl?HBK&jG&8D4w^FpE>Kw=U^B2y4S#cRHE-f|x zka+3dIom?1Q|jkvmc_@~vYVnR&*hSKpQNq?ZAmA+xf&$)V5*BVkQzc1Z&0XPE9EWP zF=eme(gu*5FZqQDdkFi7v4W=qc4FIoO9vk6vO;J`_j^n=$;LOgH(jOZtqc+oa=Lgs zIWv>Bq(m^1_hx9?l;KggLY!di+fV{!2cA_L=XM;Bpcd7dG}HtEYPvG(c7?JA1^spUM*{o7n3{ z;z2LhU3nCiKQnSOD3i|R(7B|vq{y!L!=&wm%LYN^jFQya$LwS=?(hd_&h)I4DR1I~ zu2^0-{M6ibTU&=I3FVt0KD=?VX&PN$Ro@d-52+Cx$H!kDOGlBB_m%4loiT1f0O4QQ zs42!f*Z+cC03JA&dc8!VONwglhq36s2oEBFCU6W`_#c%z^`&nJwH_lR85qELqF7VM zCnbd#99a*KGWeL-N?(Q-5~opVNh&@(M<3$XE<=Z0-Em?kx%fG$^{JE*y-RV*YlY4P zMMi#G?&zU`!oIgoj0(a>4$m7J+{1?YI|RYGISI`L%Ke1I#Mr?JhQ3^Lx5}gQ=W!E~ zOQLp;x5Ju;tEu924p)=Hixt%$0zaKKGxG`atsI>YaY`I-rG}C$kI>l&{ya^V{kT^x z71}~B^X4N^2sUW8rd94y>LzJ-n*O4`rc7{q+8EZ?q*-1p#R);6?u^wF`K2a*%x)BPz;F8pp|I}?_`X$Y{zFUE@*cppt|Cr+1rH1)@^R?B@@n?@N8ClVL z`o8ILJpm~SP#zAx;ZiPW2GaknuZmS4V*ER>w_5C5dZ)K_MD)6Hr5`#^oP%Y|!Ox5bl` zxVYST1MmVC^KZWBz70$)KruV#D_SK?xye|G!wKUf_(vV_1M$D`m_g9sQs#y0^rHA7 z4fk6bh!{hqpX=9eX=JIUaYV`i=75*41dR(BL`0?YB_<+<_wjB~OIo}Wz|@_u@9s;_ zs#q3Wwp#W)g@Yq0EL^V07z+O3O4=$8^;4&q8-CUd4S5mu^*wiR7@v3LT3h>d=q(!~ z?45&F`zhcN!+~`yyxyz1uumkJEAS!ofsD+Cr{Td~;MiavGSHBk9{d;f{E4v%vpP6T z=O1VGblS|<*n&)V@y(XBDH9An#!9<0o)dkN{2xMV;afuhsA@dcZa6!zX+SObS}E12 z_A3v+fY1Q5+wrGbK&o?4JMyB#MVCU_3@j6$UV0BcFRvEz^DTz+-e)dbsb;!d0Vm5V z(sXH5+WtyO(;)@SHgofnK4Uj)YHCNzAxMVB=IStpMiGxeSwT!QdO}fEHGTq_rV^A<+gIzY zFB$ktedNx5Suri}m$gTtAER4^

e#FN87YF7P8xpT-HvM^VqTUi~N|Z)9fnwRwUa z;wqm@=?jFTeDD@V5=u(mkecSMu5Z(vG@0TX8bTDvL$~PR65W{#=Mm`(w==cLx#>Z) z>1f#}4fTKSOmlT#*BO`#Uecl2NdhQ@kmpW3Jw*pDc7<7JWV`afuvi?*_ImRsO;#pW z%1*k`GF0f7duMmW*DkY*64-8z7WGvP?;pr8Hxvk!t727bl^gF(iy;X-vnQ0Dw~J?7 z;J=LOoqjVJuOUgxY?WoboumW`0UOVj7Wq1bsMFtzaEWXj>~jl}5}?NYX3%G6#m$rL zHo$vvXoy+6;#5X=m7`Y9#IUF$d4AWn+e(r*cFhVk;m_cy+w9LB?03IoLGMwc$RbjE zM$~efB3U+C{=tJY^|?W#K1knK zU(-MQ%(U3If9b6F4&wvE~iFjT+(8$ zHmlg|P|H~OapT9_;$j~DnMKgfTOi9E+*jBmaZ6qhEpBZ&7%UB3xYPJb3dmun2q`Q` zdEG|hhCq2PnV|GubcQB6J1kr~p=|MdWKcRi^Np9)I0T!K*!+U5_@UCZag;)gtb#$X zNYJ6V`~WZbHoExE@b;DSSI(b_iyH>Z+x6vudBnkioG5KoFC_iS z(zo7M;r=8mV@%UUKrJim5_$X`Ma6SxTwEMOg?imP<3M$Igcl)4KThP(Z7>q6lZGfQ zw5)FE^MhRyBMVc)YRnW_XJJ8aSD4=D!K~sUlhe0@c11zKeo#%k@9jMuqpeL69emG8 zjZZR&BBwZ`>R0nL0iSJZQ3SbMKv8k&dr>E+(}Jf-|&S?M4YosTRxTCeEknL*7>&O|ikK#hAj-vr@sd z9KB=AW=;L|)~()xJ$;0Z>(sPy8{F0}e@|Pmb76y@%la4Pu zva#|S%H8Tu*bZ+UWnCE=^G~4INA1)9#Kq6*H zrp9{Jeu9eZJR`V+KvZ%6K>wGla{2Zm+wO$-Vne0AaAh&(W(bf3zyhk}`}(YUOg4pQ zoll*p_@n-3oTPo(UF#FupHn;1#V_yNDt5k9uA^}8S^J%6EnlmG@O!BSvUdx=CJWG>I_2KT6WPpoHSF|D zCBugPNLQbaJmiZq+XLgjLim^F7rz}2a47^QhJ-X*iVYNob6{b~%E>)Q&AXTr9Bm&= zz*lB05~hGU5YnqF(ODSvESYg`iV1Dmj5O_D?=)Nbwj-IS`gFF!P0K=b8b<<%%7w58J$G+hsX*Y?8NiqHDKQwh7er7fso;wZq(1 zZ?P;HewnaY@8t*%uE)^mUdrR#QBk3*JlM)w^muK+I3#jlwrHAWmQR+{e>ptWSgAxy z-z#Atn8m}xqe=VQIR;~fE9cP;?OHw}Q^Rxaosc;f6y9c%7bX^CzBRd)SX5M!ZK81& zh>K9TaA}w+Xpt?73SMz*q+F~pK>IBw&IZ>7NAddq{6f;$$U49iZ!0M&wB{#xjalOj zSbxzgsYr)57Z|jbyMN>rq%aFGJjiU3|IS(CVSTE9y5QDTiNpri;qw<-G^s1H9Z;%F zp(NJjC=#n<%b?){-zq((!a_WPEmC6*y*=ZV%vcJ6hzCwRuw_WiwOLxeYD9Q)gs2xp0Ht=9z1f!b-M-BZas?Q-gg&nEot*g0-V{ z!QnZfr~R@~WMs>cr){j29;bD!ud|dp2G^z7EUwZ>%e>i(@9_v!%79M9n4ML&%YC}d`-8J`KvZm^uB4HNs`f>Bq*}>u3E1V zql%Xu1fkC0$hPfv=ZTbsIe}o8+Y0Ku{P3?02A}1!W&*@2tkks2VNx;eSb!t`ytr-% zdoRdI87#8ZSD!kSH@CIB7eFJ(iw~PAidbuU89X1W4_~8Ch7?n~o;wko)UOQ-yj223 z2dKZZMI_`}$l>oZUvrJE9%Xa~&vu$I6i&&5ubH0`d-y$ckD_nN;1!H z!b2vyKZ+d{ZB0l>cxOKSIlX*jW3Me!cN_!+xc3y4&zqUCM?#AeeAKSheU76kb;E;_ zMOs?2zK+9f7%4w9X)`&B1=9Kq5hBabfd%=ML@(0gd_i`%{`L&3@}NM2Vr-7+W=7Z2 zu#r!@_bx#j1t`Io;Q5xg0ugGC?=Y1;Bohj=jJHV6o4nBhapkU2Q%^5xS(@_iY!AB^ zYnSf?4dX~4>)+Dwu*8CM{UgV{^>+hgauSbk(cKCqOKkIm?>(aEw4?Qi*~YO2XXO4S z=dxTNL62g*Ey7TZb)!Kt8YF@@8+2)26-lN)DJOGsQaIk8)M%o7Wgj`y&B8ro0x)4PY@#1h z@dYOO`o=}?nYoa{p6_#V^QY|W_iIcczZSGyCI|{pgOzPaY+YS3c}lTB>7*OnbTPsH z#6H@~ZHv_g2APu!BYUiTQBkudrIC8fl}Zv|LacyXGUx8%yG%(gBNuA;QzN7MMezle zjiBxAQO%h5Qf{Tgg4~;Wc5sxjJkfs2$(**0kKs%#>Ri&M<7#$-r_iaDItu#YBCx|% zv|Br6Pt0sEmScEdqMqFmd47p<=?QDOL2i?ZdH3b3a&O7nL(0&Q4iZIZ>FGN9+ux$}2!U5*aj>f&UClB8G_t#o zWtk&`)Th0-*0-VBO=w>7c|&}#p?3r&dfVV&Q_+Vjka7j=DNv)pe37vNh{V&WdC5n& zLYHPNS6V-qAp&C69>EE^#lY3#8I zEUQh+O7Z-p1pcj><>@hbgXhmHi_uG%ZOUxy@`6oPS5b&<$4*kP6Gw%EKLllkus#;_%<&AD|cP#D+V_{)U_GedOcFQ2h$U<&JKUR4h z%xQWf;wf4(+G04KoSY2eCX6(urG?AN({Z1{^x;PRimVB9^W3GOp`{B-s@N6`_vt%^ z+u`lSkOtW@`T7Z6mni6lebS!*S`z8fw^v2x(C7xp)Nm<8;gP1R-x?DUgtUHJaLa(5 z&4Dkir#Ioa=)~yktLRdk%;h-P86)dY|LRUofy_X#KS%FZgeo8%UMnqEKp9f@tv-kX zvjs=w&a@P^@D$rGT)W1iEm8Nz7iJRf&aQ0pgKm$h=g;#(w&p}RRfU^^ry?zmb`vl8 ztthQMfQoHwuB*_=#>t7##|k@Eo6<4->SZ!%t+cpmoE!urq-&a{rh-9ipDei8<&(p{ zEm)cU<0JDg85vJkS|}a6+!C|j0|V}B+U-ZFDj3WWZmLB)1p{McO{IIVQziCq*=QAW zt?D;l%yoBLUE89&8~*y1s<@mAPc)yVE4iS65U}=QL=BsxxG*sv(YSiK4K)kk{%ebi zo0mW57ZAk2$VigdP(dS>OF(%;C*`K-UEf<$4{E#8C|X5-K*g}V*eegSu~Bl0ePZf+ z7HX>;^N4QXfaVx22~tHB5{7C59&y3V$qMJ=VWS~P$Q#~9=3+XSdv$pD$daJII6JXJ zJ#2JXmR?n`;qwBgckxcHy$!nGXysHz3Ibu7WRH}Kxy_FbWQp$`Y*8)SZZ}~mXA}~& zqL&qQMPbW?8*}O#k;PI{QVgD$#=B=^q|#hxfA@V<59C*Ux#$YVbBa2u66?Kd(DQ$! zuBb=(!x=U_Fy|$VU3x1M`Tc`w2T|KA$8#NmDZ3ilz@gq!&Zu4Z_C7G<+i|0d7mWesa;cby8z`6b~=) zx>#kas~ehfR@61+Kyc99fw7>!-6XWssmBqCL`L$vTn1SB!c40c(RXhV+)noFee9WuieoxZ)SkO7M%dB;x2KbOz=wB z_zU_TPnb8xUboRn5$M60k3bZv(zANPEbEhPH76RfwU1DpTx2jNE)f(eeyr4#nQ`Q1 z9FzyBx>URn0bqsp8+eXZL+f|wKP>ZZauD2oIRry|UpwGU~C7I(NUR_}lXcJ@|E^Jky!Saf*dd+(q(QT4n zR9w>bOHpjp6`(87*3B)?AK#k~2cYG(+YoUZwlnwd!~W|vbmi2wUh?%iLX|N9_* z{}_M4{t0)~mWfCs*NRd)slB8Lr0Xju=nc^FepJ=^%0+S!q~8|HE-`Ji{IB-0TBaxr?Qko(W7@L3i%|{oen2!I~Z^)ToJxLpU-|ng6TG}6g;0p$JcEPd`=0SU0>0?f^^<95<(aM^$E{lirBMaqB60=gUdk@NTS`o>g&0^v9nSro20s> zmHe2|hgmYCZBuJ{iADU*g}-0;uX8W=iA6X*f4*4Q1nJgrUu9%DH0av`GFssX)7GPK z3wIHZAG8z{6#Jo&#nf*d`HxHf*JXQw=XTD7!8ipgTx@$%S++9fEOgckDz_Hmj&G?+ zvn49t@*~j``DOjk#wB`(pLdO5)aFu(qlCJ&lg~m zZxjBajHNsZcX0#%XN*w`bq=}M*SzYh;M)|&4=L)g34sAI0% zYGQ9tdY%rE4F=*#3zQtA<_3$DJ7mRzu< zhaEwff@pt@-{RuH*A>5%N_ph78z;w!s57JHP&8E0B$TbMS8|}%E>lHSdgj~?-|MhG z3F_TF9e3Pa=(4hcO1#dtQm}*f9mWa@wPkG4ze+`x;d3=8eVVQEgc6Ds*+|~l_@nwD z3_cAWwllzpoTBXFh#*F-pNx&qH)^5wZ_*L7t;QOoJT(*d?#&nLXrZAsyY#Jb@6h&J z;oyq!0rrm@H`23Ed%7o5P^b@W9nX%SUY3>$X~)KX2-hC-avFIs(r+huaQ)BiUvyBX z5c5!Cx|+YV#AdbQXmL1usDu^TO@LU|0OhPb`10^>^+F;^D&bAGyWus;x+fCxh9I%P zoNIs*W(Jd}eogD?=HTdH2d~HUZ03_@r>7R|l#`8%Nu^ zq2^d<_Nt2Plc3x-*ltpP`7;ck)ig&5g?syl+a=DOZ7JH+AciJk$H+eKkhb=7Cx;-V zSN8@fz0aKK+!2Q61`A~-W&!4cMMcMFdEkKHF=pkz{aW?x-&rnbTf7 z-O6fO16eVVbGaH(#gI+D1L50&Pis57x*n*hF?1MxwsY__*n_P}gZdsjl!o7qm-v=$ z<(6lFDZ10((4eWA1(@HHGZ?FF7Sei#O4GH1+y{JH6+xAPUc{{?{*h9S18KLDo;6-GDvvcXYk) zb^$MD7jryRia-Z3ruAgjR(JUOKX?#P9EsRo+nUH`h=2CBQtVbJCJGjCeR)_19BYL> z^leOY=ub04ivoD(daZ$!S0>}fCbJU}2BJBx-%qb@uvOf5lN2%viS+bDn3O`IwCLwHmu4-@1PFvgATvg=)TYXLT8sMTzB_Y zyyEzGU#j8u{9%9QxufIdt5@~43-#8N078l8vowIJ2P~_&tgAkG7=C$dW|Z8ToSpE# zTm)Cz4cY;hNUprn9NOt)43Mav8ovy7Dma5JRc%=L5&?;TG&#&|xjuRF1X6cW3QEYF z6bNEsV@=DG3L(^jI0JCSzCp}syM6^=bDEi5+q%=c8$b2UmoiIp zKAkc)HvY{dXw@xy{lPEfXRAmv;Ktw;roW}XfRK6S(UoZa=xZl(eN3XUF?03T;Tc+b zjYjpD_b*@z$^dTeZ%K`3q80jDb@L*i>Ak%&+)z)>_lz^@tgyA$BPNw@`$WaTLu(oJ z`?MRxEMu;gEO6qV(@LX5&8cdus;V;Wjt=V-fkuLpD@u3$`a3#O^g$-|gu;5!8hB52 z40jtjmHoA_wdI>HsEQ&{*z_T(BPE~gXLcv7PkQ!OQwVo*y=B7J5B=HJ+7)!^EVpCY z@L`Im(cbpnL;y_B;rbUoFEY9>8MjL|q#gS~mv!pru}FmMPRr^603C=c#M+QlLkdO? z>OD+X&Og3&6^vJ)S2ER;Ro-pwY=V=4?a#@%y1HqwQ5O(_v-?Ag5E@gtts>U$L&L*X zM_Q?m?J`H1gGAS8TUc9;3Pk>H!I|c}i9vP4FC+xJLiwjv8snEQ+uAvPDw#K88wRf; zUTYAE15W~pbjLd9e=Y^)C8uFmY=iijpv)3*7(YF;-Wt5wmVv>JAAX;s7I8+v)y)A z&!0K(eM&*WT2N5XWyczoRM#@xh&XIP-x%KBOI%i8TKWjq$T-!M1?LEe2 z)KxX~-shRpa*2$m^KTzdvuXZ_>?qFLe0vTypX0|2xKLv_-vK;fqfN*fYjkqFX)x*b zmo7TngzKmeH%poRd(Q+)-ZpSmO#yK^VDR?S%{U<1`{s@|S|Dsg_`A8ntmFO{-(6|c|^XZSA)s7OfIsECfsDD3#yEvm<{N3dS7SfWAWBx>7?^e zbm{D;(z&Fmre>5Ubcsy0{?*pV=`>?O+)BDU!Lk;0k?-UfI*)ayPqXvzTuo|k_u}K5 zp{2HRZq0OFSXdBn-Mx<3xW-bEWF=$qr%9q&(A`4yy>R<1dvpM!iaX8&4s1}tEcS2X z2H>>|-T7-TRTC~QBO?<(B7KEXJvdUz*Qp4*n6~d;38WOgZz{!cveDoA=xZqOHQyJTT~$tQ zo!v;9p3Js*@?@xujv<88l+z`}Zt?4Yg-@a{KGwUBGV|exvqjKqTYdcntI)~TL42hD zeBtI7N@;t0F2ExqnvBfS(rg?Z@1}LN|1tp$pH~8T()@INp>#%aY3V?wt6MBTNa(LI z*Hm|)!FljsEr8+5mbi5VSQb)4>NC(=8I~dgQHrULyQieLnk%(5qXBoVgp^OOcfZ)L zu{7%)zVbtERvkEQ{aRj}{T3JPJIzu=8d4Q}dSrLmm5h8o1078kW!2YjC+ZqfU8pod zmL=`o(90JF2D{MaRgpS|GXMALy{i=Y-!SQ0h<*2!tI+C0h5TvtQBcI%*zbJr8X`(k z@>_{O^!IP_3kn7oZ%g4X_xV-ipRv}hygP$Sh38j73wR5Vr}%Z9@o_T3e0zi??iA#KzpRyE$ zFF#)>3?O{cZB<20r619#!*Xpyo)MEDpc>!b7X-16bkeB+32}Yx*k(&~)`v^s?|u^L z9zZ5!!2S9nG^7A|@snx*R`&!o$$fBF z9}qo`czMVLE=Q1#-IUV=c&=MQmq~_0hGuTqmtJ-7{Ya7<@sUof(_`-y5#G^z!=_`< za(L!*i*(B5y-V3^eo!2*4~!gMc1VI?(BT?mZuvPWyUbLA zH-zbJAVQ@Bd{Y?wxj2heb&Pr*bKXOef`8zp%hwwF!DJ(E^YVl;{javRs;PFFL`vXp zzAk-;xlewxt7zTFlol46@)d&P?O(<$dc_DMJsY@;6I9cR?NTHBXIcZEeRi*{(U{H_ z@t8aZ9altzh?8iQ$Od9%u*Ca;O!)ik@uy(@1u0~}kIL5-01B0Xdr8pSs|2|QF7#Sr z$0qm3OW|H2my>gL-CCjq6ViZ$fjh=(zC(sQU3{Oq%-VLE$OpUn{2&aLr>l#%@W^6> z3RVTFUv!_|bp1ts92sswJeX+#nQyKnY;{Z5fZ`)yc#16Fr@x;J(#o+s`wYgb33$I* z?45_6qlB>=&Ynw3hS)nesL(ERYGX6ATg3ivel2Wu+c{Z{G)CnwIGYUL0}O(Ng=LZQ zg@6M(>xmI~lQl&MKoip>%6f40d&SftQxAd|IWP@tZf@>AZDVPPr+?}Y z7auq2Yfi9xsiS(~#@5D7PQj?DjX{l^(I% zEsjRbk^0&*6QkdOY6Iv19j>132qOS6FBEpTfZV0jVPp$1>=3n8%2C(~8s2Leb)Enf z>pr34fm=Hp%P35OSW*!@QJ=v2wRn?H^zQ=Dc=)JjB3cf8P4f ziNdo*3J)=y-T(IVGEp#QEAsD8zdm?{f$0C+)8nEvn3eIrJ^g?7wyt^D@Omt`9zl-h zZqiGHbNAEy{o%X8AprK>W%vX3z56|_VgCj;Y2LoZIqv-M1~Y zil-k{Y&GS=3?1OexRVZE7npxG>W&fk*O-8-U*oPI(vO8X<3i1f^-IYqNspY41S^mC zS{M6`#y_N{yIQcsBlG-#v{ zH=%9w#QFmuzCiEgfv##@RjVjvn`=1|xwf`ZUEN`SA5GaPb~s9ni+h0qxXHu1CxH%o zd=&>50ikgpc7r4iIr8Ch^X#F_CP`H;7M@Vu;~rGIq8i^P!-M?*uxTT}k(7kax@6uW zTYJV%=~zzJ_K?UR=G_PCoq8R%_8a*s9smXbY?K9%9St0Es7cF6rXw+5HnKSNvDxvO zF6uP|6ISl6#KYd4x1R>rR*iNx*m-_oWHvXwyxjf%@dz7c2O^G{S!tG;Xr3lO6K`y3 z!plF6e7`&FQ9!)~*xg@#TtxwT@b+a>)=*!iPavFic~E_$hDozSx$W?5p~k^UNzdb8QB^C!u0%(gMUGGytNfg1bmV&mWWu+aIct)nv5VJW_ z9~Ud+b5$A6QCmA!Hu`;I*Lse}0)s-Vd|jh2Q-$-3E$d2w^b%JW7q{&BYzHVzAnb;* z{P7PQ6bfgkH#^;9(bnT|`~vv>g#Z(OqY-^lr&e(+Cu>B6LYdF*Yd;xMKbTa8{Ksc! zGsD8yV6;d}N|xrU+374Z0mBR0LGl#MMmyVPkVuR(aZPsO;z&8VE{+kS ziBARtm6M|>a|E+`&If^wX)QOg`Z|Vh&t2$sL`5;JK(|9$H%CjHQC(eEQg@l#StqSo zSi5bNC$Go@4v6bj`a@f zxO}=Vp-IYQ;{}&t*5H5?g){o ztv!7fr$bS#K7Q$;Iz8>Ijg8GmU`qgW_Pf}4=5ig}o{11|j1per)HjF(a!?Tokh z?OW+kSeGxe;HLZyqBv}9Jgpi}0yze+bw9>D1jIz(@$}%RQ8Bd>^euAw;y2wa=^3rh zUp#+<*HTZBP(D7Ik9*^N7bx&U zQ2SSEXIeu(2!|y_-Y(Wu^^wk?XJ;g_rq%_%sm}0lk(*1qUOjQi6oHtmi8?>Vs%B>r z_t~=v^)jSO{0{7PzX4J~Mou0PDGF_FHbCnB7w)*xoAVb)iAEJ3s*~tR(H7=$Yx(}t z+3M8Hv{0RFJ( zVt-C(cbJh;YqW1}+66r+e#*wiPf1C|tp@{|TNI6rH^lgeJ^dfd0HeM(A)Wc+*_+^H z%KW6{qI-1QqBzc@TV3hu`DdY=H7E6`&}S5M3IvpUb%VP4@PR*8k&s#$eaZ7<4&92Fng zh62??N?t0Pbmg$tAILX;hl3p!BRQnhx?-wg1(^zc&?_@o8mXU>3CA!d{6bRHgLL;o zZzC{`dH8I3DxtHO=5`xhz|@mtQr>iwFW3;<&g;sYnl%TCs>v`b1_QU1b1W`m>*x8Hja?RRB?_U38WW5$Uvz~MruV_ObbXe8_Nsg_|!pKXx|4hZe;df@?$Ut#e2$jqyvc$Oz6A7*rs ze&HVbw@hO}S^Xh)_fRq$iIXNy95>50W+FM^A-->fzc3D{1-i|IGhp%wve9QVQ zk;3@m_@MOwDDvN-fb|;IJ=k%x2rZqE+R=fFTm;2^w&P1ppzJmj&;xKG~=2=oW_Otx`7{u}?6M40>< z)@4Bf3XS3mcf{RA;+Kbh=LoE=ub=%0>=~#HBRDP3mQ20~S@x=3m|J?FqH<=SP~9ic z0~7-N?ic?DLjLQa0fK4BtA^>b8dxZqIxIH<)c^RA@cjC^&s(s!8EnViyoq-4fBRN~ z&(R`2hwZBFWKEkzrgk}8q#Iaw@50sm3?Kdv_Ixb1`qRDozS^r!YEC)ZOH*(%j!Wps z!6(2V&oLSzIz3`nS<${YFG&!0h*CSj!_?27%k32*ote<`>ZK`zl- zmV8+EHX#kL$&-Cv1ekt73jkly4R!qDMQ3;C>evA}00M4g6j?9uZTs%tE0Jz$1;(p44y4K;ExmumolD?@y;zuJH^ zM?cN*+yFq08os+rDt2oap2n-1&o6ij@%`OO1C6Q2_O~=|BQ*wgjY^~Z_=2PjgK^P&(h4u*GQpja|-R@!ih$Yrh+EY)6szE5kx-oK zS1hB(Zo4llPt`)U^vg3EmmxzHjm{ce+zRIw_15<#c%-S+bW*l$|G^AG=pGqlYSw<3 zG+qemA_64eMf9ocGwJN7z;?Zrs`=jdQUu(7pW3PCLMk{rst%b6U?r2cyt}PkIQErw47TBoChOIYSKpTQ-zF|<-mA1lyzWjI$>!H{c50Ek? zEoJ>!nPQ+c$0%*ly2Zq>;ErXo%B;7TuzxC<;{T#zR^oO!rJAF2jk4ke09mb~ruq0` zD4wuaPb3e%Z{hQNUUkI&R{1v_+lmXaoCk|b34XimMM|X zbZ~gMJ2#`abt@uF6bFZ)UTgYPW%+?_)|gIE{L+wDgGKOU76y{pUnQSt6%#$Vxv{9EM z{KiJ=3~?d~IW=kp8A+ zYI^$T{3P$1&jy-WQELPjZ_u*_0;X=!qu30sL4A-{0>j^aKkPFSjCTMqd@CbWWx{>= z8Yb*Gc@v|)uZBGM!=TEfM{Hjbhu^&_A=LXyE0}zNy_YcDg2I@u&w{tFSse)rCH9c z;bDZAc%o8MO`(U+LGL0Axxv`SWzNM3Se|EO!T={02R|3cG6l-zm1!1D+370m7&g|r z3WmCZ?c)Wr{w586fznZ~95?5+;tRyjc<=Cz6|EY9ES;1=k0pB&9}PNSbkLthf(%Hz@9s z)6)EHiRd*Oy|oIDK-35>u-WqsLI-a*4Ufm4H?nGv)@18DAw_kdQ*kG}?PuTM3+tP} zwi;vg_)QHgk6KNExDID8&1* zcU^I%^dq=X6;qPg3o0tA&<+f{+q%JUo%Vg8=)B#*g`+e%Yl6UE8jyr07^1_tIlC#X7<@dZS)SC4C!v81(y6MJ zYdGOU-U!(tbow)n*VwdMUee83?5=vz_+_z+1wkOepor@Z{_^7D=d@h^?Z5(>K7#N2 z1jG8ZUm2vR#Hd30YEolDEHo?eJ?FnlFD@v;@mio3nN{iLK9wW6EbaKEl)>GNkf zEGCt%08{f*#~6BSwvA)=SG*8mipOXWku+ z#ujQ6(Z(_{VK}zgZuRmq#pI%ggkU&uIRs-G9@EtLY#>YydvGRWOQq7?_PN~+%euEZ z=ys!~j};Xy!H7&owu#xXYFau5a5#NvY|Nm=XFYz;lt~Ln3TFM>O38AG2^E1`E0vN9 zh`_tg?Ci3NQCWvW5E-&UIT(4cqx@L$&Ye4iF2?d3SwM9$vOf{w@p|cHYHC(+aYIW< z{paUYWn4V!TClv6qS|>qH7y3kH+=f&?xk=KqVEEI4E!!P(%e{kMhWe5+!(SC-Z&kE z1%a;q28|1I0dE2H#-NM+eW3bS#O-yU|4l$k#LHelSH|AtM09(x@j5^ETM${xMsP=V zcdJ4e2LDHaagfx!spqL)(v6(p-55RAvf!|xPxJ%1551gJLUEEG3$;7<$EAJ26i2H8 zX>b?fuw8qsreX^|?`Xmm0IHB>w%DdzMjSjm0r2(mBJ-#cvk&N_99A;Mz_gwIsVrwi za||0(cGJLxLaT$PPZM2Z`Ci<;3(O7M=}snCR~_qT^!aYz_#~nA3^FD!Vf}1qoZoWZ zPw%U~;`ej)XR|;m2nC-Jx;{!oa57dNb1?mmNgjF{-^DVd3nV0&hp|;5oBQD1a z2;|nD_4vX}&kXO?sj0)t_@m9_0RmNnC&KkROH{!*V6fzq&D4SL+0?vBN>raGNxZEY z=1v=O^T3IS&xk@QNVcY>C2;)5sqLjf-p}@kAh}41yUVFGw-u-^^78T`58Oslaz4e3 z9Pg`DQ?`iDy!Q*q&M&MT81R)+R^|_Od7W=QOu78cYR9k8~R+ zDQ57omX~qimy6&$1EaxC-lQgIj2*RhgCaI&&cr$eW*HW8t3`nmQ@hGqw;pv3Jg3tb z>mJO*F1{oUR}W)?jqSE=qt_ZYhCh+8)##*4woGV+KDxFtv^q^aLbCjq+d24wi}KRq zj?PqU8lr`5#K*eg%OxJ&#i~4MUJzGJ{$r2y*Uz6`Ev`k_f6{W{1Aaf=Cvech*=%-V zP6h9QZD9=8zlZtWw~`b2+YIS1yCW(>@pkN8RhUlKwl)@Wjcp!i>;}@ zRJUL{En*jo|D3JAcff|4YC-=*lmB=PLyJIPIT_FCoH#uvt4Gn_Nx}zzl7wdsOiZHn)~KV~pFZjD4vw5)TOVz;P8t{vZJU=q zgN3_ED~|+`*!B>D4F`CwZ!jFxP=@2Kww`R`0TFC>ji4f^&)^3{6`>Axh?$sw&ahb@ zj(lufMsKi{Jv2AJeRAXeR5aDkgn40sK?1N-brRYkCgeLLLtS(ZOhSskwXIS zGkZ>k@w$hNYS3rO6+YezLOrx}*rKd;D+eoRb`Y6^BX2l4;9$4Cyxev!s?7erV)4?D zW}$DpZx{0Vo;=Aigj~R~ z^>!y8rW?>y#>ZS(VNYN^K8)rf$R!;0TgOG!u5H7ESV##-mwe9k%?a5XeE zoI=BjT_n1Z?FK-vfn49H+FMPq-F?m5r@0e1Bfhn4E#*Vk)^dvGK!_g=kCD(3Rqtu- z@0yk;MX5rS4RpnP{8Do)D7APRa`S>jYl zR8&l*`0xe*vEVN=9V65hS$TpVpS|`L0piYAojEfYE?{SGd($#|ugg06i*9)ceJ%%7@P6du#G-E8Fai|) zsg`m}ufj-q1tGmC;?AKin|TDH;yJA*5hZC`4k=r8b0nBH$rzA$QMysm>&MhoJp`W|z##eLsYh$_P*Sz56 zG+i)-C$PKD$jF0t`$E>IM(m`P{^y@ zB?GXKk#u}T4AUpdN1}4d8MUL;v8GY{mK&1}ED8z?3_=c7naB?<7mu;eSiG@V&UdW) z(F32BwZ)h?sG%eHQDji+vo9^ZHWoz9-hLb(Kagj}QGs^8<|E4jf!sn{WSAJ%!M)yJ zodZod4RKW!bK!f5nZjj^g13WPPc9gl8W|ie5BOME=cZX(S=Iv?J>k|!X64tf&Q&{C zF^ia0bUs(0TwGMaLv2a}Nz$b2fiBJ}n) z;sDvsqqBMC%=`E3OKE9o;L8Gw*;6=qF6YB;YInJU!d&F&B&K=JwQZwnE!_X@ba8B1g1)ERSQV`Igc=xNX7*!re{1$R@3T$JA3(7nyiKhkTw;;nV(DrBE)ub|ej zF4K@HKC)PMEf_gzB4ANc&_Aw~g_OSSNOD{5ncarIu}o!J&Brg*TaU~u>#~_V-mS*| zKx2)Fb*HkirTqAQ^|r|s1X#R5Gwesd>YNc5Cy|)Qyxi1?xXNIJ2OKPHueqR=A+T^C zhkjwMBkVFMt>m3Mzg*|cH1n40Yl|}DBr=%pXSwW|6+i_|s6-g+GQoUb`o8L{xtXD1 z)nK!iZKbUj>h1jCzz`AN+uOapy^duIOq{`?uXJ^5x=7i;`eeawb*^G@-RlHpYk8YD zsJDO&XwCN?7=|Yf7ym_VMnI{-ur%L^)$w68sU*)hC$(oN-ywQL z1H(p|wSzQ{&8tQB6~Q+2Z(P=(VbTYRM{7i(D@lWYr~Sbuw+wWTdtQH5Y+AN&Qw=g-m_t$u zyH#s=L?jPlnQA-;@a!wWzeIt$7n|F8^4jo-*xPij#+G=Hp@sMFN12WF3+8QI85*RR zUn~=D&2G}Gt?#wHGh}P~CeV8GED5X9ME^u916!d4A0Hph{DP?{cmT9mfx2~HHYmK% z@YZ>1>SYtth56;YGK(%CO47P3XF+hrUBQSn2=c$3p-cJe3}tt*Xv04YN~LwmVMeFbyp_v`$1G%%LZ| zwJWH+M-Xojd&(Y&721(4A)6gMf77g6D!r;YNnqY+H+qbVw6;DPiTm?exZPx6zzOPX z937#ARfRTZO_DK=#n;!j+?g%=rxz@mn3=2fw>9d|7;o0E5UhdTU4S_OtTXTyM5E1qIgwe$5TOA(2wV zug+0|JIJu?zDHmQbiPE`+=={XhiY*V0m)RW`DK|_A|fKUDAI0Gm~c~-X65JC_4kN0 z^@o9kL5{XPTC6Vz+}vjDQAg_&k#;HR=>`MMtP~4NNL82R2P{uPEp(gj9H2ujjztLY z2G5y%#h+F#Y-f&?IlUz<_I73C7J8DZ}+Tna)3meea&^~ zWhqI8dn~;tO-u>NPg=32z6$k-N{6AqhRp_LA~L%6>T=Znq=XA8+zGK7l>Gz!I;Q%*8 zl0u(;}l%z&3RO0?Xog63*vyA6oxv2?-oPRnN@pNE<;82sk3wpYDMf@(q*H*3Qc28Xy zp*Py};CvQ3=jWow2*bG=(jSc)mc)Dqv=B${V;&3sUQo!M6fvs&qrgLObLN=nPq?m|;s(v5{JL?(ocdK;v(bDfX0 zTxvD}J1h|{HC!_+UEv9Wo?-I$jW>CPTh*oJ-Ce)&Fre8Kl;2HL4J5SW4S#`VX1_AO zW?B(0kF-okUVuvf)$j+;V2!dy4?rch#qCT+?#Ws6LcTNuOijJKyr^TJhR1otyD{11 z+XU~nM&V}Jwuw9o4hi7bB@24;Bqi-SvSByn||1w1gRUL5#|)zV?+ojiApXg?0i5$d1cY zREmQ>lu#I*JO9FCPEIbI+vbv=V*B!Fv0DqivX*uK_lrLn8Q06qG%YY~dccLp@{Xba zFTr*og@FAqkY5**ITg*ue$D#Sxur5mX~4IWQIY|a0;RUARc$pf0QmxyE(d+GXCsMO zBkTWyiBii5rRwXf9miHD2qdMZL+g{|vF)`po^KE}kFES0r26ai=`Kl%U&!+H zQ$TodQxu6*HZe8z5T^OZRffCDqyFBb5~V+e&V|IXG4cq9eh(KEEq8?WtgfwwHmLJ~rWpZit{=X> z%D>P1&tC{XGAv=ykdnx}aXfTGS zMGi&Xzxxp{UesRmW8h)2{r-~}PD$zAjg%C}1LM<&QhM;2Fm6`mW@k^}p6)B9shmVi z5J<0DyBWzrCHd!j;2Dyn5C8iv*fx6b77^8UIp*`lDzuN%^-_B}0XwC%w67HfyGcXp z>^ElbS>B@4j15=#^+-$Z&Li#{ymOan;~rE;bpL_OhLNG{D4(X36zB;zyyK1y?+p1w zaR-2~37WLM#^K7-g5AB}bK**GOxVXxdIb>nyWU#B7z^j#tP5D6Qy*-^d*CV>GaEO@S+hOqyJLR%IP9`|6^<(h<~saQP|Gp{ zZL7DuaMo{^i;+>XLpy827{Xj&G6BR~^oQQi&jAP)~0MBb56R33bE5S|NYSUYFNiNpcFKI8z&$>HMY*01;f=!s^# zNwwRDDl~an7^<)Y{WJwOzwR!L$;xv7NfT?h{C%&Ch~`OW1OBm*ju$=8NiqG2_Uo5} z8Y5xDFG0^DfkwB~(7F$E9TsuoC2`C|3*K$_{92rC^ksFIZ}qK$f&z{Bo6D_m`nAAV z{GOSr-{(iWcbfo`J&T$B#oUv_$mug2WB}T^&J4poPKJQAc$tu6QX+?o__AmE0XI?8 z_?TQs7}R9|)IS3N$UszgH=#9pWa(g($w@YfFHB6N;0aVI2&kOo6=MkA5E7+NXMSpo z!S(&bXxc8?YGA)rsEj(4ZeR@*bY`@*-G#_G3yVHQ`T7hUpF9CJV`E3hlj}mtQh^J!QdngEk~nhR-C_p^Y1xhm4Z#2Gm`HQ*7}^= z`zlY?ZflxN+hv|cnpbR#5iAe*hJ=J97H;KdBSZmqg5RLltKliI)c?5mctzpM(N=ZX z>C6&@%shUq*$(O`Z190N>0JSMZliHp79fP~&d$4co$1U^4wS+blEjx_^(6uGNSb9@ zkT*~3_1;1Nege(f8Uh}|H-&3+TJ`}j3vOlMh18YbKtd_3JkCybQrp-MQX-}$_el5U&?o2G z92GGi$y?Fl0Zu1z;?2>9N(DeV4Ht_yf=-_p}VbUg@iZCdK77ppru{Joklp%3e+ z0h-zvQFf8Cc}@yv87&$hEw3&bwnS}z5|#;@L><7=WE`qq9%1C*0;WeNTIJ_oxP6nH z*JpcYr6=@I#Qe}I^)2*052El%XbBl}j z&z&7#p1cR|uTNdl%*kYUSgfQFB10uyT%x0+Z-^^5(!1=5R1GifJbV6PT}$Gm$<@yx z)A)`$O}GwZo;l_?u_0h35Z(BVVX(t8RcwzIH6DE%)Pj%i_B!5;2++n!eSgpuNFrrK ziiMK*$43e|HZq(KDc`?$yM+w}nEjHH3tWr*u_X;H)09lz(Xs4>rIO!qup1?`hkK?j zU4%}4pb}N6|LlE5drC!n6dSPmR101)tElDzTw!Z=MDeAgU>mbPOwV^lx3w{|h{w(* zvGls^i$i<6vAsJxR&nxvrnpbD`|H|PXLXY&GWJCD-QDWnJ->f-4Za8H1F-!VtU_-t z=b2P!$T9b)nhP4+CVylNY(`z&L2`=+)6L)zzCBypxOQ4 z?oKH90@fiEbUYM$jb}I8qbCdvW-UCJtU81Q1#_;7#lUp3*Xawea!_$wmYQ_z@r>+!^Ge>};>_tEHe zH8r*N8S=}tsI7yA720K3OF#^+Q*~6LX>Cn{u-)B7BuEqlLdTZlPtOcumq`+0)$j^D z*WU}g;oL?%7Bj>aLoefy0&$h;mnL7y=3kLBUvw&W&?5MC31EdB# zj_1H>s#pZ?JJthugh6KD7En>)IJ4BT6_P2@!9>EkL%DVkNDOmVxEc^82df(?SUdZy zTO=3!5e$&Azq|*;QhJwdA~4xtSI@a3B7%||79V92vR=G`veO@*5(yOAD$!bsKG*_( z!q{cqhJhky4v>4NsqcW*3j)Tdui%jrbX-Rmw2H;2{W33hNVd){EJU^zSt71UY(Ch# zwM5BcJ1~_Bi;iAHZyQa2smFfpHP8(5dfm-oWnN_<9As8KF5;Paau-mm^j zc4Euz{hojU;*x1`6lN5-L*x_*pKv7X$&*WKGC#xh($dmZH)>y};q#}VT=1Eh>sq6E z!}|9>XzrjE_4py&jQJ|}udYAKNtd$N@<4IW7BjQFqAW9mP{e+MlwwRPi@;ohKB}_n z4v($L91IFztP(D0^SZL3J}13Wf>NX)$Zq#GRAbO;t?ay|qUIXAymqH~XM6iq%OU=4 zK1~e9D_H!dFhZY=9{Eh_nh(^yUeSjQ5>_7T_IL!lYDM(;=SRD%qjlLe5mNVk4bV2G+Xj85=)tZ#gXlIt1(&|W z3fOaUwVR%l2n!FC8k55~OSHt02wq!k=hvQ)P3qPx26N!qqX(80IB+0&f41SzmvY?Q zJFe2G=PWQA{8S!~y+!tBY#BOVC#SN&FBK7LG5)!8q7PN}ueZmxCtl_9cdh#3yfpVx znYejCwE+SdfwwG;XpP>wK1CM+fmyHoXoPDYNNCZiLsSQ(%LV>vRw&* zEuxRyO$-#xsqP2h5a(TeL0WoduWtSMmOFzPB~7l`nIDq_(%H6=4O5qQKI?d>`~+xG+F zWw1ZH%(9cPC^1}}UnH!Ax)*FJMa#=Dp`hdvCkyyB%tJ#1yylo2dPKFzi}eltg!KE4C{Nn3RGd2$qfbY|DA)^&Q-c(_MAAX-;cmi1#%= zaV`<8qD5|lp<-j)>DnpmXV-=7{2Dtu`-g_q++lADyr*I6o5(tQr@4G`{T((;cqnAZ zS!cP_K~?l6aqo8pgWFC`gI0UT_N3;zCSf+u&XaN?BU!{>044se0h~)YYRQla&?lmAJOnN-6%bw71Kx zB=c>5RKQ)xU67CCi^^!{gs7Txcd7?Of81m{^eHSar#(fuKoASKsX%}=oJb`+p$$Rw<vz3&PA3i{pyJ8 z>LPBj=zwX=MVzI|zNr5<#9x(>l2PzmaUemgjnu;o`Am`giX3S(P^`({Nm5UcI zRsk1Msla>+eo1nU67gwsDoEBX4xiZ(CnqIE`m793Gm0o5a35ng5 ze>C6`;{V`mQ-Fz@%q7FKoCG*msEI()g@jN+AC&_Yms zp*Yw$Z!X%!zE)ONhA#ypBbt(SmJlkz6+SItrOClUw$t3IGX7R9dsh%mQ}q*08m|rv z`b1b+=fsEpv0i|muMRiGzFvcEjvw8`en1Tn03lBlZ$7%D$HBS|EmjJzENiR=1VAnZ zu)m02CUGiAWW$tz;M@wTw9pT4p#4@8f9db*i=WbMF#M(z77XzUCXDH0y2L3C;`GZ^ zh?_KjS>Fa#h{`B0z=xA7-AeAoTgKt;mJzDSaUC;(;H zNL+;gYQ2E!Ynzc%0c7uIh#!>vmX_QXd1NE;y^vqP`uLZ4XxdvUunN>4kls`r>u0kT zJa^6m!zPC|jW6VREi3cH;vytuFo_hJ>W_Y_YYi8>;0hHne}sc>`!Z2Teev}4tsI!WO|aoBSHKS_ekRK~c@`%Af&xT8 z1s;Vji;tM3-P~;Sa!>raVoUkA_|&5$*Z2sJ>wsWy%7q=WZ#i1tf@KJlZr#5g`RC{J zS$fKXk3eT{@8DbkcBlSr&66QLpa%R}WiN zSKMzZ3EXyi`gCt=IHf~(hF?-rLJxSY#T%>1I{G)P=B9Z30^83jN!{}K>WvqF{kGXz zt7tYgdY!a9DGk(I;QQ3|b@)FW7*KBEQz0P}Z_Y`NiJ|Rz{`{nVYP>&&dwJ0aiJ9lD zaNN?go^l^BsU7@v>dL3=r}c2~HcN7XriPjImX(6Rmh0dXm%~&KuT7qZa&n)1s1$ZL zrt&ld_M)>{ll=TvcMV6n>CRiVX43S5_ki=!Smn2hjEXV)3s20D9oe^bud!sN2~eaN zm9nT7+bP$ZhM?HuOvb$8CD)>iUmF`AjoOC24PF|#e-!o7$v8wow%wQFu`a#+f_Q&(S5%9-id_v1%e*0mwYni|yNMDN@) z7r4wNE%OdqxBBsxF&T@Y)ahVI+}n#yufF(VE*`2pmMy-ejACc}+Wa+2mhPS<4_{x? z%o|)j8XEnYduV}QR_69xiw9JtrY#1$EA3x$r@C#dV?H(3TxWcJ`*{c{G~_&89etaW za??5ipFe+SGSpjJ#k+raFuGo@1+_PUWGKSclD68%0T)s9=!uEysC_XV>Vno}P#{?I z2&$+O#RZ$F+SMg?Jz@N&8_sV>7w1?eTMm;I_wcA>@+Oj`tfeUhb+hlf^<~nv{*)~# zu|kR-QE=i+C&yX2xl@V8Z*SE5%g&CEid`X{-fD?MpEag7{`vEMK*g(bu!AmyAjBOl zB-%NdKFK|}>Tt}YM=Qqj#VM*yh1dzmjRMzPu`X?GUBsuh>0SY-6V}g3#kov7TU)FQ zbkW#={&I+Db^-sdo`D#7zDOSmyj}`CehOa=kP}=M5_b0&F#B@S?5k3EF+S5Ov#;y7 zyli)|vo4IHL1q~7Yu(~udrVDpiHK0wFW$w5JK=4TD3b7M?HX{Y=r7q|x?faELQ7Hu z@Ir(j^GCwIGHbOR3z3apf!`!lbnP?l=fR_kf|f)M1kvPN>U!0I7_H`JXGuQ1)muhZ zUiyurQN{cWdOVb%`;p#Dv0NT4D?{Qpzl@Aqz8?;3Ux*S zshcl;OrP(2tK>Cl=DInRy=v67UfiQiWvS_>wa5f6EfiWUv_au8<}n=)jFizEsi&_T zOv>7*mw@7c7SO{PZ%XL~xbIt1iPy5OvIj6gf)p0hiqCp{Byk*BH!SWu{v2+zeK}Th z6ii}xZ|GBr6q?Zd_$4I;hHQjipbGw(TZ{;fWxIA&aQkTx!q3;c0eGotFu00AT|$Y7 zgi2I+WvyEftd7)>pB|)!``ib1Z&iCefiau0PfWQ-d)b=>;(-Q!;>~n(UOV&|D@8qg zL;JROf?&!5`|enlflCNfdxoMK!i}4AsDpYcRot(tz(> z53<;;)1nv)OlbY+gg;bkUlkMzeqWZ0_)7=S$fG_BSW20rW20Dvf>8&)E+`-NFPslV z_g@l*6g1^$RRhB!{w*~vK`saNg@Vc|jT`YY7B;k4>Izwe1$1Vl=1!)x3}1DC2PLWR za1N%2o%Y2<+`34l2Xu-|GKa5_#&Wgu-?7%#fIv?4I6fjW^1g-!t!`jL_wX=e8Fstm zq=WSQwCWC7B3DgYH@3)7YWbNXw!H_lcMV!2B#*^Yif$gKG{vt3XS`C=2uUqnRmR|9iOk?6dhmJJ|H;v&B_u>sGb3jqpg> zYH@0mNIlhM0^1Ad!s`1ZTpK&%59VtKQFS9>YB2&%3#oJ_CMGI*Zz#jK1lAkI(4kyT zJI12B`>&n1Qng+d`1??`mDR~zT#dLi)AiB2Du&(~`d$OEK{0_6w|FK5h$6ZN2U{~} zMb7txf<%Uhmb$^~c`9g-G2_6{DgJP)wP#Z^Eg*R(iuzpjvmg;gbC;5r*@=l@_)=GYdeLHr9-GUd{p_7nF|M*tt{=tDIOzk03 z_9XV{Nkk++Ete8Kaf2TKpx#}9lg>j=v_N0`;K9Qrf>&Q5;O_V1oM_VzYf5^3q_mf+Zz$BL!(QvD}53B2kU7|{Zl#}XZ#;m6H0*LmP1sy1D14U9%FuS@Ly z4H7&=r&U!tJ`bd%+-p8xb4|xTFZ$NGUo4L`zVEXp;Eq{#bNsJ}8@PYA(YCTsQ7sBt z^F(>ck#ltLQYz5&=X!r^Q68V+4P0f2=VQL09=iS*=CJ zSRx@Yg>qhTHUpq&m^6y!%sAwaol{dP$<;v*Cien3i67pe0yslm1>bu>+Eg~!z9IkT;;El@=) zD)P?4>vC!=qtmvUc1?j)hZ*a_ydGkc>X8X+uDhTeZGb*2;Ik;18nqgPIrJAebOR|X z#}b=O*~Q)SX>uSWHp5DR&ADeKi9MsQ4?2Q?sBTozKA?d*GsswwY_Nm5M`GO^`wptE zpe-t*QV-|plc(7^Ip5OrKXy%8JFd46v8xBR2M0fcprQV9U1a7pQ+@q&Oec;oGfx7F zLxK6iX?~;v%c#qqDS*ArFv>PGH)Rr8+IJ1Av{>3o;&SS#32b;VIkC`$GOv_=u7A#B zcUAW=dO$u($QyPYyS4a)4|U!5rk*JJ16&$eanzAX}EeHBUZ^X5eiC90xzz1u-e{FNJjJ8nz1sQ3R{zN zCIAC{HuT-j`L#?A{DhS;c?`}1>s0nkJbnTMs4i|VV4!!KZWiEjyj=X6Y5hau?{Pa6 z?SGBi@r#O4+XJD8#AN(G`U?K7$w&dI2|S}4-lxYzz!te)Y7wwa$_8>u%5~$EwC`0N zWAw0QLT*oX{@me4({4JjPDx0}y&0NAy>hI2HT$*>700}Rqzc4~yLU%bF{BuAW*7#( z6^j)&-sP5Nsa80$BnN4|Oe7<%xW(f8dtP3(S z;NlEm$cnXy9ibBR007xCa|;Hi@ESlqYHK~=DD4}07==mCq&?i!2pvORHwBG5Vi=sR3;+IWU%9>K`m_kFBp8Y5%j(gC?<0;KWw zoi6215X@v)S?`TUfjJfk!_rXZZGa?ira)GbzegA=!LDC|e4HZi%Q0MWLOU1;Tlq`> zH*tV)_aL;eDV`k;WO2^9{nRs>=_oO79XffIv7z{Qhca21g zy!>kbKdp014@cW|Io?AExOdPu=54p$5-^**0#*A(N>UwJgvSTpGbN}LS_#LC2pGhJ zrP4gj&#w>uizdL*E2*I^Bjdq*fcxlK_=P)$`#@<^x3HzWYhiD9W?%ho#f$?u_&r2p z6g2-i@P5Jwzaru=@+C0OEVnF>6PpbjEx>w(v1IvBDf#~x_&XTlIS`IhM+}5z$86Qj z%^RA>V?ZeDkINnXmV0*pMRK@Yyd>s|1=CicBGxI*Wf&Ozx%rU1KB^zeS{#{R(osAN4lTHG3| zt*=k&INV;}tcPj5fZZO7xcj8Bx1C@uK)ipDV5Q+Zm&=M4h!ZCyv<~iO&L}ypZUGdw zIb!al`(SS`OV-7N8R98s<|NPz`8_=~w0@ZL7}f{5;zZ|1+<^iI62Qg@?F1S3M(ZlHA$wWY43r^S}U6ZdKdU+eYE)yO8D)x*&U9Ba_#@Iu|M=2jt z?VOKK!aPLq{(RuY=b&awN=gLsyA+Je=Yus$YFUR0vBu}e8<~PwpQ=8-)%qAtraTG5 z^TcKmG`Ye%%k^#frvr?)IaycJV>w&i{jYL3N>q!m8%JT!HVvx)1 zZP?8sxE*f7LJnKPPUy~<{RVR+brg&-D-q*rV@?t7C2ygiJpI`=;$~j4PmENGtA~}H zl@;mLLAu#6c0vFbUvmjmW{nak_e#ja_+vo1xPSz%rgycr0>o8-c;!L6C&@`Y4JmES zPiB}KIRO0AoGs}wP@>O-z#v~l@iJh*3N|{hOU{VewHt+2%ca?t<=l(1)z|#-YI= zkqx8tv9x%D$*tTj;t)laUC$39sJF94}l;wk(Ijp z45XBd;J_;Y*R{dHOVHHBuJlPtW%Bcv2oFcZ;!Y0yrKJ5=0*74o zX4R@<_LMN|-l1Qer>BaTXn&cRhB@%3YB4fryFJb`%lzog8RhH6w!Z!n$6pF-h=~GN z<&9wp-@awq&TpHhC0G5?TBG1-z~pydZ-CwEZGGmx8#fypIt-Q)uhSEvw67Yapo;A$ zXmp5l;iB)-9$|8D-?R#{D8`<-qkjBq`Q5vO)q%R%oh3^l4R-Y_WARhzjym`N4g<5} z(+{tQvz+Qx{gzXureQH5viDz7DJBO2zeEp65&@z0J#2Mi!e&rHlDEe(fuTT*mRU8K zA#!P`@70l5oH&XA>=37p2dtNsPP`Z-9Ur``_-3qDxm$3dyL-Lx+-360BHlu8TwE-S zco#0B6#@O~V^IvPZ?lF+d;HETR)r*h?UbF-!Y-$~B0h24DR2WhOunexCw4nenDn(G z_MKZ^YtX00?)ywo=N^U!`Y}#w)5mcRExmrdzB(3HEnWd#A@OCwVCue%-TR;X+Y*mO zb8>l#gTrLt9y)X8Owsf6mBDra%W3i%n#K3P`*`=uRRp*Ig1uz5o0H+|*R#12PWKjk z1I_&Pb1z`diieO!dv7-#Z-eqDwRw5X_g`6NGFnN=NoTm7df8$8RpRqz)iW}Z%I7?G z+pfVSk^2%a#nOOioTEQ=o^xjA@l%aD*LT?ArP>U4YuulxJo;r>F+MfdkQc#wgN@qVHb+0AGu@8hFc=KT;DXuRA%C~mVobb8oA7X#P%lZVHJ20xmK zR1FbIQmW<_2~@hZ%W5YL=(_9SQ$l=-5hRk3IBh>6@NkO~7);K-+1Qa>T#S?2^YGE5 z%O@A`v`r}JO$kyMio-EpdhwHKU1%h6F6QyF7nK)Lfq6!!p}Vh5js~d04IiOfn>-B-p=9IY-v0=pHH|yMk|E`nRMcmgU_$@CF7~ zY>E=Ul|?(sc;Vs>6zy7D`OhLQQ<2@(exw~%5JE~CW6CNY+4`A5Jf=9N z>=h{k(|wEeJ0-n;_`M4?WbALryz72WxKTcP7EDrTk0aX>W_kF#X|0X;0i)7Abe%Ww z(g5GBR?>6`89N@zG&JtEyCXGi^z{tv{!b?lLm1ngoZip4Z0M?Uva$q4_ymuX)Argm zFT6SPNL97k0lczI|X;VJE{-@>t?iws^%WoMWDj8zii_d_k|- z;Nw$R*eqjPh-ldHSK!7Mi*bgP#*g)85Ppk2DGM*uW=QQ#!*UC7J~@QBUCBzHNj8Gp zxLrM|qeSe|u!&ivz|oTmMrR|&E%JJsXeDZq0y73M=}VGy=~rLGDI9_nGgOAqP;|^m zRNKmF$k7H{=KG^vvFu&#vss;nz)eZb)i&pk5II`n3|qCsHxCW5%HO}FLqsG!Z0tvRLB{R@MG(U_93 zv71@1_JP^(bEDVo6T0?xfD&c?n7DBfoeSIiy zc}<6~MesP)Gm*Q}^M{#PmePwdn3b28qjQyjk}yB4siEqW$r1y%tDpOM@x!sbwf;U0 zP8&OXYya6Slb+Z04T=eAdBJRT(qiJQxeL3vxc7r_lpAo*dA5X2&CPYdX8Jvi9Xar0 z4kv41tp~p^!x`o7wziK8qBBOuF}WA1i7hRO2L8Lqf?o4-(d%8x3Ng2WKHUm1*`Ktg zq9u4K5=-4?5OPLJDwgFior|%n!G3#7ud3?qHoYK4eCH=ES6YvFESZMwH1zIO;KB`T zFR+%=EVvaruiWgsHKkH}K%R`()YNo@ zZ26&i@FO*~mZE-@Xhl|r8jmU4(i`*k@nzq$T*LcSoVPbyg2&2a*ViZ1PhOPyD){2z zF5+usExHnRvS=Z z&NcOlmH4&^MFnm5io48xAQ5#8WGX#=`qX-C%0Qp)+ARl42{2uNjM46C!{x_i0FXtu zw(0+zZYtY7Kx?3-n1RVqRqAJC}_5KA2yg_NPa z;E;g%>~=~}+2K~7rBIAsLb48@+AS&{LABDj^DVD;w5xMhj1PCWOt`GL6y=k$v)^t1 z{_WA8s76Iab&*Cmc$$aa2=r8fS3VxnOU=m^p7<(+A#d(wC@Q;-?IuONgNo5%>;D6#XBspN+cF#VX~>Z zh8xr;mEemR%{Bq`$=uFN~6WRza4e+#tEwd zZQR)2WMttd3u~$CV^#c|gPLR7D>ZK5f05}BfFu(K=Z9|@8GgYUB5!}&c9R>c1_rnK zsODlujCU3*+HI6`3FvCcC~Et|DPYY>m>%Tg&(!KmbQ&DJGC4_tvC>D>eGH>dL6o_e zUy^i_48Lu2)0f~vo%F~33;nBy1HmIAlp>t&LR)hIQPv;A`};YKPe%_2Iv;faCcK6k zUT&4Yw7G?IiK@PCYi>Wv#Xh$oUR5CN#3!0b6-u+Ga4Tz-qjA+a$zk2fb3#S%A?dtB z*(aW8(%}=x_#eJ0RmaGD6J8R_!l>p=D+nO! zHLZ-*)NGBAsB9^K^LeVFA^rCCBGU|U-kh7(9mG>)Yppi7cK*v!4g@*5romdQMr$~q zM?n1jr)p0n4=c)V?~K1(87cQ*5U=p@jd86r`I?p%9PDSbS<;fYn)x+~nz@g1fwXx- z66{?#*w~n>%yj3ov>#?@AC*%HJe%(G;KzB9n)f__@e97xj>Sfj<{r$OwbL~1KMe{=c*R3? zsu|$<+L)+3bU{}sEO*8NkXm_j%o`InC4j7V-{PS87T z+fsDlvM9y))z!QQK3%s#`=sG6QGsLXxRU@}o?6Ao57nkuMXm6lx7a^EMb|Enu*Tl` zy;%f8;?d(dm#=Bt=jqXCJ2A7pdNuPY3qkwS!b%69PEX7Zwx?nEEH9R0CM9VN+(ksa zetkFe#Z(*tGKGScH(vhJ^pfPzn8G+{@az0sF&N2r629nx@ug8-;}7Ji6y& zV`HPm9X8($QQ^5aTn0+pUq@rNCu4q7A1LsZCw}n(qoE-IcVFDE z$1a4p_)#ak&VT*TCs7Tba#}c*e;$qk&;C?Fe_)S4e=IQl-~VMnpQEiUyft+6Ur5&< zG|Rb)o$dut$ezQiEST=(=l8pL=oYA;L@-`K|2ht^Hs|L&D>*(N4!&$Hrv(F-?u;L0 zG;s(Q#`?NfD}9-TH4b`TA9t4jOBQupwJ`7`*7gvCx4FH3{W_r{DKxVAA)3BSTBxF8 SR-+98hpe=sRK`8+_x}e)w#sS% literal 0 HcmV?d00001 diff --git a/website/public/img/posts/plugin-settings-error.png b/website/public/img/posts/plugin-settings-error.png new file mode 100644 index 0000000000000000000000000000000000000000..1faf58eb048102978d2ec7e4f6f32c7920996e35 GIT binary patch literal 112739 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

ZD3nvYE4+K9{}%lsGmCb4c|WAb^z$w#zX#C? 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 literal 0 HcmV?d00001 diff --git a/website/public/img/posts/plugin-settings-gear.png b/website/public/img/posts/plugin-settings-gear.png new file mode 100644 index 0000000000000000000000000000000000000000..726f922ae4a708c0379c4c8b3daf770ebb572174 GIT binary patch literal 88745 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�fLpG#C!^v2WO!a@wB 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≫T)$5Na{W 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